本文內容包括:
nginx配置實例之反向代理;
nginx配置實例之動靜分離;
nginx配置實例之負載均衡;
nginx配置實例之高可用;
nginx原理分析
1、nginx是什么:
nginx是一個高性能的服務器,占用內存少,并發(fā)能力強。
2、反向代理:
正向代理:眾所周知,我們不能直接訪問谷歌,因為有墻,要訪問我們就需要梯子,這個梯子就是正向代理。在我們?yōu)g覽器端需要配置正向代理服務器,然后讓代理服務器幫我們去訪問谷歌,谷歌把內容返回給代理服務器,代理服務器再把內容返回到我們?yōu)g覽器。
反向代理:通常我們自己擼代碼都是發(fā)布到tomcat上,然后直接在瀏覽器訪問tomcat,這個過程是沒有代理的。反向代理就是不直接訪問tomcat,而是在瀏覽器上訪問一個代理服務器,代理服務器再決定將請求轉發(fā)給哪一個tomcat。對外而言,客戶端根本不知道自己訪問的是代理服務器。
其實正向代理和反向代理就是代理的對象不同,正向是代理客戶端,反向是代理服務端。
3、負載均衡:
說負載均衡前先說說我們自己擼的代碼發(fā)布到tomcat然后通過瀏覽器訪問是怎么樣的一個過程。我們通過客戶端請求服務端,服務端跟數(shù)據庫交互,將數(shù)據返回服務端,服務端最后響應客戶端。這種方式適合系統(tǒng)業(yè)務復雜度較低,請求量不大的情況。如果并發(fā)請求特別多,服務器是頂不住的,就會由于服務器性能瓶頸出現(xiàn)問題。解決辦法就是一只湯姆貓拉不動了就多叫幾只貓。
4、動靜分離:
靜態(tài)資源是固定的不變的,比如js、css、jpg等,動態(tài)資源就是要與數(shù)據庫交互的,比如servlet、jsp之類的。未做動靜分離的時候,不管是動態(tài)資源還是靜態(tài)資源,我們都放到同一只湯姆貓上,這樣它負擔也挺大的;做了動靜分離,就是把動態(tài)資源放到湯姆貓上,靜態(tài)資源放到另外一臺服務器上,然后客戶端請求通過nginx,由nginx來決定是訪問動態(tài)服務器還是靜態(tài)服務器,這樣就降低了單臺服務器的壓力。
1、安裝nginx:
首先進入官網下載nginx。https://nginx.org/
安裝需要的編譯工具,包括pcre-devel、openssl-devel、gcc
和zlib-devel
。用 yum install make
安裝即可。
將nginx上傳到Linux中,解壓,然后進入到解壓縮目錄,執(zhí)行./configure
,出現(xiàn)下圖才表示configure成功了。
完事兒后再執(zhí)行 make&&make install
,如下圖所示則安裝成功了。安裝完后在/usr/local
目錄中,會有一個nginx
目錄,啟動腳本在nginx/sbin
中。
進入到/usr/local/nginx/sbin
目錄中,執(zhí)行./nginx
,就啟動了nginx,瀏覽器訪問你Linux機器的ip,出現(xiàn)下圖就表示啟動成功。如果訪問不了,注意防火墻是否開放了80端口。
2、nginx常用命令:
以下列舉的命令都是在/usr/local/nginx/sbin
下執(zhí)行的。
./nginx
:啟動nginx
./nginx -s stop
:快速關閉nginx,可能不保存相關信息
./nginx -s quit
:平穩(wěn)關閉nginx,保存相關信息
./nginx -s reload
:重新加載配置文件
./nginx -s reopen
:重新打開日志文件
./nginx -c filename
:為nginx指定一個配置文件
./nginx -t
:檢查配置文件的配置是否有語法錯誤
./nginx -v
:查看nginx的版本
./nginx -V
:查看版本以及配置參數(shù)等
3、nginx的配置文件:
配置文件的位置:/usr/local/nginx/conf
下的nginx.conf
。配置文件分為三部分,全局塊、events塊和http塊。
從配置文件開始到events之間的叫全局塊,配置全局的一些指令。worker_processes 1
表示nginx處理的并發(fā)數(shù)量,值越大,能處理的并發(fā)量就越多。
events塊主要是影響nginx服務器與用戶的網絡連接。worker_connections 1024
表示支持的最大連接數(shù)。
http塊是配置最頻繁的部分,又包括http全局塊和server塊。http全局塊可配置的指令包括文件引入、mime-type定義、日志自定義、連接超時時間和單鏈接請求數(shù)上限等;server塊是最主要的配置部分,配置一些和主機相關的東西。
1、最終效果:
在瀏覽器上輸入www.xixihaha.com,跳轉到tomcat的主頁面(所以要先安裝一個tomcat并啟動;或者也可以搞個springboot項目丟上去啟動)。因為用到了域名,所以要在windows的host文件中配置域名與虛擬機ip的映射(域名的工作原理就是先看host文件中有沒有映射,沒有就通過DNS服務器去解析域名)。
2、進行配置:
首先將server_name改成虛擬機的IP,然后在location那里設置代理的域名和端口,這樣就搞定了。
3、代理多個端口:
上面是將www.xixihaha.com的請求轉發(fā)到8080端口了,現(xiàn)在像將www.xixihaha.com/xi的請求轉發(fā)到8081端口,www.xixihaha.com/ha的請求轉發(fā)到8082端口。
首先在8081端口tomcat的webapp目錄下新建一閣文件夾名字為"xi",文件夾里面放一個xi.html;然后在8082端口omcat的webapp目錄下新建一個ha文件夾,在文件夾里面放一個ha.html。分別啟動這兩個tomcat。
然后在server塊里面進行如下的配置:
server {
listen 80;
server_name www.xixihaha.com;
location ~ /xi/ {
proxy_pass http://127.0.0.1:8081;
}
location ~ /ha/ {
proxy_pass http://127.0.0.1:8082;
}
}
注意一個配置文件里可以寫多個server,這個server和剛才配置的轉發(fā)到tomcat歡迎頁的可以同時存在。這個server配置location的時候用的類似于正則表達式,~ /xi/就表示路徑中有xi的就轉發(fā)到8081端口。
~ 包含該字符串就匹配,區(qū)分大小寫
~* 包含該字符串就匹配,不區(qū)分大小寫
= 完全相同才匹配
^~ 匹配不包含正則的且匹配度最高的location
最終效果圖:
1、準備工作:
上面說了負載均衡就是將多個請求分配給不同的服務器,減輕單一服務器的壓力。現(xiàn)在我們先在8081和8082的tomcat的webapp目錄下新建一個文件夾test,里面都放一個index.html(實際上這兩個index.html是完全一樣的,就是代表我們需要做負載均衡的項目,這里為了等下可以更好的看到效果,這兩個html可以做一些標記,比如8081的就標記一下8081)。
2、在nginx.conf中配置:
在http塊中添加如下配置:
upstream myserver {
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
然后將server塊中的server_name改成虛擬機的IP或者host中配置的域名(做反向代理的時候已經改了)。
在server塊的location中添加如下配置:
proxy_pass http://myserver;
總體配置如下圖:
配置好以后,在瀏覽器訪問就會發(fā)現(xiàn),第一次訪問的是8081,第二次訪問的是8082,以此輪詢。如果你用谷歌瀏覽器訪問,發(fā)現(xiàn)并沒有輪詢,那是因為谷歌瀏覽器把index.html緩存下來了。f12之后再f1,然后將下圖中的勾上,然后開著調試窗口去訪問,就可以看到輪詢的效果了。
3、nginx負載均衡的算法:
輪詢:nginx默認就是輪詢算法,就是不爭不搶,一人一次。上面演示的就是輪詢。
權重:每臺服務器設置權重,權重越高的就會接收到越多的請求。配置如下:
upstream myserver {
server 192.168.0.103:8081 weight=2;
server 192.168.0.103:8082 down;
server 192.168.0.103:8083 backup;
server 192.168.0.103:8084 max_fails=3 fail_timeout=20s fail_time=10s;
}
# weight表示權重,默認是1,值越大,負責處理的請求就越多;
# down表示該臺服務器宕機了,不參與輪詢;
# backup表示該臺服務器是替補,當其他所有的都down或者忙的時候,它才會上場;
# max_fails=3 fail_timeout=20s fail_time=10s表示20秒內有超過3個請求失敗了,就將該臺服務器停機10秒。
ip_hash算法:對用戶的ip進行hash取值,然后分配到固定的一臺服務器上(一樣可以加權)。這樣每個ip都會固定一臺服務器。配置方法如下:
upstream myserver {
ip_hash;
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
least_conn:將請求轉發(fā)給連接數(shù)最少的服務器(一樣可以加權)。配置方法如下:
upstream myserver {
least_conn;
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
url_hash:這是第三方策略,對url進行hash取值,每個url確定一臺服務器。配置方法:
upstream myserver {
hash $request_uri;
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
fair:這是第三方策略,服務器響應時間最短的優(yōu)先分配。配置方法:
upstream myserver {
server 192.168.0.103:8081;
server 192.168.0.103:8082;
fair;
}
上面說了動靜分離就是將動態(tài)和靜態(tài)請求分離開來,靜態(tài)請求就請求靜態(tài)服務器,動態(tài)請求就去請求tomcat。
1、實現(xiàn)方式:
將靜態(tài)資源放到靜態(tài)服務器單獨部署,動態(tài)資源放到動態(tài)服務器單獨部署(常用方式)。通過location指定不同后綴名實現(xiàn)不同的轉發(fā)。通過expires參數(shù)可以設置瀏覽器緩存過期時間。比如設置的值是3d,那么3天內的請求,會比對請求的文件有沒有更新,如果沒有,那就直接從瀏覽器緩存返回,狀態(tài)碼為304;如果有變化再從服務器重新下載,狀態(tài)碼為200。
將動靜態(tài)文件一起混合發(fā)布,再通過nginx來分開。
2、準備工作:
在linux上準備一些靜態(tài)資源,比如在/opt下新建一個目錄叫static,然后在static里面建兩個目錄,一個html,一個image,分別放入html文件(index.html)和image(timg.jpg)文件。
3、配置:
在server塊中進行如下配置:
listen 80;
server_name www.xixihaha.com;
location /html/ {
root /opt/static/;
index index.html index.htm;
}
location /image/ {
root /opt/static/;
# 自動列出目錄下的文件
autoindex on;
}
配置文件截圖如下:
要注意把location /html/
和location /image/
放到location /
的前面。
最后的訪問效果如下圖:
現(xiàn)在是所有請求先到nginx,然后通過nginx分發(fā)到不同的tomcat中。萬一這臺nginx宕機了,那就涼涼了,所以nginx需要配置高可用。
如上圖,有兩個nginx,一個是主nginx,一個是備份nginx。它們倆對外提供一個虛擬IP,客戶端訪問的是虛擬IP。keepalived是一個軟件,它會監(jiān)視nginx,如果正常,那么訪問主nginx,主宕機了,那么就切換到備份nginx。
1、準備工作:
在兩臺虛擬機上安裝nginx;
在兩臺虛擬機上都安裝keepalived,直接執(zhí)行yum -y install keepalived
即可安裝,安裝完成后在etc/keepalived
目錄下有其配置文件keepalived.conf
。
2、配置高可用:
修改keepalived.conf,將里面的內容全部刪掉,替換成下面的內容:
#全局定義
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#檢測nginx是否宕機的腳本配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" #腳本的路徑
interval 2 #檢測腳本執(zhí)行時間間隔
weight 2
}
#虛擬ip相關配置
vrrp_instance VI_1 {
state MASTER #備份服務器上將此值改成BACKUP
interface ens33 #centos7 執(zhí)行 ip addr查看網卡
virtual_router_id 51 #主備機此值需相同
priority 100 #主備機取不同的優(yōu)先級,主機大一些
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.105 #自定義一個虛擬IP
}
}
編寫檢測腳本nginx_check.sh,放到上面配置的路徑中去。腳本內容如下:
#!/bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
啟動兩臺服務器的nginx和keepalived。啟動keepalived的命令為systemctl start keepalived.service
。
3、測試:
先用配置的虛擬ip進行訪問。比如我兩臺虛擬機的ip分別是103和104,我配置的虛擬IP是105,那么直接在瀏覽器訪問105,可以成功訪問到nginx則配置成功。
在主服務器上執(zhí)行ip addr
命令,出現(xiàn)如下畫面,表示虛擬ip綁定成功:
把主服務器上的nginx和keepalived干掉,如果虛擬ip還可以正常訪問,那么說明配置成功。
nginx啟動后,有兩個進程,一個master,管理員;一個worker,真正執(zhí)行任務的進程。其實一個master可以管理多個worker,當有請求進來了,master就告訴所有的worker,worker接到通知就開始爭搶。搶到了任務的worker再去執(zhí)行具體的操作。
一個master多個worker的好處是,比如我們可以在不重啟nginx的情況下執(zhí)行nginx -s reload
命令重新加載配置文件,這就是這樣設計的優(yōu)點之一,即利于進行熱部署操作;每個worker是獨立的進程,即使有worker掛掉了,也還有其他worker能正常工作;
因為每個worker都可以將一個cpu的性能發(fā)揮到極致,所以worker的數(shù)量設置成cpu的核數(shù)相等最為合適。設置方法就是在nginx.conf中修改如下配置的數(shù)值即可:
worker_processes 1;
發(fā)送一個請求,如果是請求靜態(tài),會占用兩個連接,一個請求到worker,另一個將靜態(tài)資源返回給客戶端;如果請求動態(tài)資源,那么就是4個,因為worker和tomcat之間還有兩個。
nginx.conf中的如下配置是表示一個worker支持的最大連接數(shù)。
worker_connections 1024;
worker的數(shù)量乘以每個worker支持的最大連接數(shù),再去除以2和4,得到的就是nginx支持的最大并發(fā)數(shù)的區(qū)間。