這篇文章將為大家詳細(xì)講解有關(guān)Nginx正反向代理及負(fù)載均衡等功能如何實(shí)現(xiàn),小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、長清網(wǎng)絡(luò)推廣、小程序開發(fā)、長清網(wǎng)絡(luò)營銷、長清企業(yè)策劃、長清品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供長清建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:aaarwkj.com
系統(tǒng)環(huán)境:
VirtualBox Manager
Centos6.4
nginx1.10.0
IP對應(yīng)的機(jī)器名:
IP 機(jī)器名 角色名
10.0.0.139 [elk] client
10.0.0.136 [lvs-master] nginx server
10.0.0.137 [kvm] web server 1
10.0.0.111 [lvs-backup] web server 2
一、正向代理
1.1 環(huán)境介紹
1.2 配置介紹
Nginx server:(內(nèi)網(wǎng)地址:10.0.0.136,外網(wǎng)地址:172.16.27.64)
使用VirtualBox Manager虛擬出雙網(wǎng)卡。
[root@lvs-master conf.d]# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:30:56:99 inet addr:10.0.0.136 Bcast:10.255.255.255 Mask:255.0.0.0 inet6 addr: fe80::a00:27ff:fe30:5699/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:891978 errors:0 dropped:0 overruns:0 frame:0 TX packets:9509 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:81841095 (78.0 MiB) TX bytes:13339058 (12.7 MiB) eth2 Link encap:Ethernet HWaddr 08:00:27:55:4C:72 inet addr:172.16.27.64 Bcast:172.16.27.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe55:4c72/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:913671 errors:0 dropped:0 overruns:0 frame:0 TX packets:22712 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:109369858 (104.3 MiB) TX bytes:1903855 (1.8 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:36222 errors:0 dropped:0 overruns:0 frame:0 TX packets:36222 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3899937 (3.7 MiB) TX bytes:3899937 (3.7 MiB)
[root@lvs-master conf.d]# cat zxproxy.conf server { listen 80; #監(jiān)聽的端口 server_name 10.0.0.136; #server的內(nèi)容地址,與client需要網(wǎng)絡(luò)互通 resolver 172.16.5.1; #DNS,這個是DNS,訪問外網(wǎng) location / { proxy_pass http://$http_host$request_uri; #$http_host和$request_uri是nginx系統(tǒng)變量,不需要替換,保持原樣 }
Nginx client:
只有一個內(nèi)網(wǎng)網(wǎng)卡,通過訪問Nginx server去訪問internet,其實(shí)翻墻、肉雞、之類的俗稱就是這個原理。
[root@kvm ~]# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:72:8C:3B inet addr:10.0.0.137 Bcast:10.255.255.255 Mask:255.0.0.0 inet6 addr: fe80::a00:27ff:fe72:8c3b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1462448 errors:0 dropped:0 overruns:0 frame:0 TX packets:21130 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:145119904 (138.3 MiB) TX bytes:2814635 (2.6 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:60800 errors:0 dropped:0 overruns:0 frame:0 TX packets:60800 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4831102 (4.6 MiB) TX bytes:4831102 (4.6 MiB) [root@kvm ~]# wget www.baidu.com --2016-06-08 13:02:08-- http://www.baidu.com/ 正在解析主機(jī) www.baidu.com... 失?。河蛎馕鰰簳r失敗。 #無法訪問百度 wget: 無法解析主機(jī)地址 “www.baidu.com” [root@kvm ~]# export http_proxy=http://10.0.0.136:80 #設(shè)定環(huán)境變量,指定代理服務(wù)器的ip及端口 [root@kvm ~]# wget www.baidu.com #可以成功訪問百度了 --2016-06-08 13:08:15-- http://www.baidu.com/ 正在連接 10.0.0.136:80... 已連接。 已發(fā)出 Proxy 請求,正在等待回應(yīng)... 200 OK 長度:未指定 [text/html] 正在保存至: “index.html.1” [ <=> ] 99,762 --.-K/s in 0.07s 2016-06-08 13:08:16 (1.36 MB/s) - “index.html.1” 已保存 [99762]
二、反向代理
介紹文章同正向代理
2.1 環(huán)境介紹
1.下面來看下測試頁面:
[root@kvm ~]# yum install httpd [root@kvm ~]# echo "<html>10.0.0.137</html>" > /var/www/html/index.html [root@lvs-backup ~]# yum install httpd [root@lvs-backup~]# echo "<html>10.0.0.111</html>" > /var/www/html/index.html
2.看下效果:
[root@lvs-backup html]# curl 10.0.0.111 <html> 10.0.0.111 </html> [root@lvs-backup html]# curl 10.0.0.137 <html> 10.0.0.137 </html> ##都成功了,我們進(jìn)行下一步。
2.2 配置介紹
[root@lvs-master conf.d]# ls #nginx目錄下的配置文件 zxproxy.conf [root@lvs-master conf.d]# cp zxproxy.conf fxproxy.conf #復(fù)制一份,之前是正向代理,現(xiàn)在是反向代理 [root@lvs-master conf.d]# mv zxproxy.conf zxproxy.conf.bak
[root@lvs-master conf.d]# cat fxproxy.conf server { listen 80; server_name 10.0.0.136; #根據(jù)環(huán)境介紹,nginx server ip location / { proxy_pass http://10.0.0.137; #被代理的服務(wù)器ip } #proxy_pass: proxy_pass URL #默認(rèn)值:NO #使用字段:location,location中的if字段 #這個參數(shù)設(shè)置被代理服務(wù)器的地址和被映射的URL,地址可以使主機(jī)名、域名、IP加端口的模式,如: #proxy_pass http://192.168.1.6:8099/linuxtone/; [root@lvs-master conf.d]# service nginx restart #重啟加載配置
看下結(jié)果:
#先登錄到實(shí)驗(yàn)環(huán)境中的clinet機(jī)上,ip如下: [root@elk ~]# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:3D:40:40 inet addr:10.0.0.139 Bcast:10.255.255.255 Mask:255.0.0.0 inet6 addr: fe80::a00:27ff:fe3d:4040/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2618345 errors:0 dropped:0 overruns:0 frame:0 TX packets:247926 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:336182790 (320.6 MiB) TX bytes:35145157 (33.5 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:177352 errors:0 dropped:0 overruns:0 frame:0 TX packets:177352 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:26547640 (25.3 MiB) TX bytes:26547640 (25.3 MiB) [root@elk ~]# curl 10.0.0.136 #訪問反向代理服務(wù)器 <html> 10.0.0.137 </html> #我們看到訪問代理服務(wù)器,結(jié)果被轉(zhuǎn)發(fā)到了web server1上。 #接下來我們分別看下nginx-server和web-server1的日志: nginx-server: [root@lvs-master ~]# tail /var/log/nginx/access.log 10.0.0.139- - [08/Jun/2016:15:35:43 +0800] "GET / HTTP/1.1" 200 26 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh3/1.4.2" "-" web-server: [root@kvm httpd]# tail /var/log/httpd/access_log 10.0.0.136 - - [08/Jun/2016:15:21:12 +0800] "GET / HTTP/1.0" 200 26 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh3/1.4.2" ##我們看到nginx-server上的nginx的日志,顯示訪問的用戶是10.0.0.139也就是我們環(huán)境的clinet, #而web-server上顯示的ip是10.0.0.136,也就是nginx-server。 #說白了反向代理,對客戶來說nginx-server就是真正的服務(wù)器,實(shí)際上,當(dāng)用戶訪問nginx-server的時候,會將請求轉(zhuǎn)發(fā)到 #web-server1上,然后web-server1將請求的結(jié)果發(fā)給nginx-server,然后由ngin小-server將請求的結(jié)果轉(zhuǎn)交給用戶。 #在web-server上看到的都是代理的ip,能不能也看到真實(shí)用戶的ip呢? [root@lvs-master conf.d]# cat fxproxy.conf server { listen 80; server_name 10.0.0.136; #根據(jù)環(huán)境介紹,nginx server ip location / { proxy_pass http://10.0.0.137; #被代理的服務(wù)器ip proxy_set_header X-Real-IP $remote_addr; #多了這行 }
[root@lvs-master conf.d]# service nginx restart [root@kvm ~]# tail /var/log/httpd/access_log 10.0.0.136 - - [08/Jun/2016:16:10:53 +0800] "GET / HTTP/1.0" 200 26 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh3/1.4.2" #改了之后還是顯示的是代理服務(wù)器的ip,我們?nèi)eb-server上修改下配置 [root@kvm ~]# vim /etc/httpd/conf/httpd.conf LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent #修改為:(%h指的的訪問的主機(jī),現(xiàn)在改為訪問的真實(shí)主機(jī)ip) LogFormat "%{X-Real-IP}i</span> %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent</span>
[root@kvm ~]# service httpd restart 停止 httpd: [確定] 正在啟動 httpd: [確定] [root@kvm ~]# tail /var/log/httpd/access_log 10.0.0.136 - - [08/Jun/2016:16:10:53 +0800] "GET / HTTP/1.0" 200 26 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh3/1.4.2" <span >10.0.0.139</span> - - [08/Jun/2016:16:16:01 +0800] "GET / HTTP/1.0" 200 26 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh3/1.4.2" #已經(jīng)變成了真實(shí)的訪問地址
代理多個web服務(wù)器:
[root@lvs-master conf.d]# cat fxproxy.conf server { listen 80; server_name 10.0.0.136; location / { proxy_pass http://10.0.0.137; proxy_set_header X-Real-IP $remote_addr; } location /web2 { #多加個location proxy_pass http://10.0.0.111; proxy_set_header X-Real-IP $remote_addr; } [root@lvs-backup ~]# cd /var/www/html/ #進(jìn)入10.0.0.111這個web-server2 [root@lvs-backup html]# mkdir web [root@lvs-backup html]# echo "<html>10.0.0.111</html>" > index.html #我們?nèi)lient上訪問試試: [root@elk ~]# curl 10.0.0.136/web2/ <html> 10.0.0.111 </html> #訪問成功
三、負(fù)載均衡
負(fù)載均衡實(shí)現(xiàn)的方式有很多,常用的lvs四層負(fù)載均衡,nginx是七層負(fù)載均衡,可以網(wǎng)上查詢相關(guān)資料。
3.1 環(huán)境介紹
3.2 配置介紹
1.upstream是Nginx的HTTP Upstream模塊,這個模塊通過一個簡單的調(diào)度算法來實(shí)現(xiàn)客戶端IP到后端服務(wù)器的負(fù)載均衡。在上面的設(shè)定中,通過upstream指令指定了一個負(fù)載均衡器的名稱1.2.3.4。這個名稱可以任意指定,在后面需要用到的地方直接調(diào)用即可。
2.Nginx的負(fù)載均衡模塊目前支持4種調(diào)度算法,下面進(jìn)行分別介紹,其中后兩項(xiàng)屬于第三方調(diào)度算法。
輪詢(默認(rèn))。每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端某臺服務(wù)器宕機(jī),故障系統(tǒng)被自動剔除,使用戶訪問不受影響。Weight 指定輪詢權(quán)值,Weight值越大,分配到的訪問機(jī)率越高,主要用于后端每個服務(wù)器性能不均的情況下。
ip_hash。每個請求按訪問IP的hash結(jié)果分配,這樣來自同一個IP的訪客固定訪問一個后端服務(wù)器,有效解決了動態(tài)網(wǎng)頁存在的session共享問題。
fair。這是比上面兩個更加智能的負(fù)載均衡算法。此種算法可以依據(jù)頁面大小和加載時間長短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。Nginx本身是不支持fair的,如果需要使用這種調(diào)度算法,必須下載Nginx的upstream_fair模塊。
url_hash。此方法按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調(diào)度算法,必須安裝Nginx 的hash軟件包。
3.upstream 支持的狀態(tài)參數(shù)
在HTTP Upstream模塊中,可以通過server指令指定后端服務(wù)器的IP地址和端口,同時還可以設(shè)定每個后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有:
down,表示當(dāng)前的server暫時不參與負(fù)載均衡。
backup,預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時候,才會請求backup機(jī)器,因此這臺機(jī)器的壓力最輕。
max_fails,允許請求失敗的次數(shù),默認(rèn)為1。當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤。
fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時間。max_fails可以和fail_timeout一起使用。
注,當(dāng)負(fù)載調(diào)度算法為ip_hash時,后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)不能是weight和backup。
我們來看下具體配置:
[root@lvs-master conf.d]# cat ../nginx.conf http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; upstream 1.2.3.4 { server 10.0.0.111:80; server 10.0.0.137:80; } include /etc/nginx/conf.d/*.conf; } [root@lvs-master conf.d]# cat slb.confserver { location / { proxy_pass http://1.2.3.4; proxy_set_header X-Real-IP $remote_addr; } #注,upstream是定義在server{ }之外的,不能定義在server{ }內(nèi)部。定義好upstream之后,用proxy_pass引用一下即可。
4.測試結(jié)果
[root@elk ~]# curl 10.0.0.136 <html> 10.0.0.111 </html> [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.137 </html> [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.111 </html> #結(jié)果是server1,2交替出現(xiàn),說明默認(rèn)是輪詢方式的負(fù)載均衡。
5.健康檢查
一般健康檢查都需要搞個keepalived,但nginx也有相應(yīng)的參數(shù)可以設(shè)置。
max_fails,允許請求失敗的次數(shù),默認(rèn)為1。當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤。
fail_timeout,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時間。max_fails可以和fail_timeout一起使用,進(jìn)行健康狀態(tài)檢查。
[root@lvs-master conf.d]# cat ../nginx.conf http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; upstream 1.2.3.4 { server 10.0.0.111:80 weight=1 max_fails=2 fail_timeout=2; server 10.0.0.137:80 weight=1 max_fails=2 fail_timeout=2; } include /etc/nginx/conf.d/*.conf; } [root@lvs-master conf.d]# service nginx restart
6.測試下結(jié)果
[root@kvm httpd]# service httpd stop #關(guān)閉web-server1服務(wù) [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.111 </html> [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.111 </html> #現(xiàn)在只能訪問web-server2了。 [root@kvm httpd]# service httpd start #打開web-server1服務(wù) [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.111 </html> [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.137 </html> [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.111 </html>
7.ip_hash的負(fù)載均衡
[root@lvs-master conf.d]# cat ../nginx.conf upstream 1.2.3.4 { ip_hash; server 10.0.0.111:80 weight=1 max_fails=2 fail_timeout=2; server 10.0.0.137:80 weight=1 max_fails=2 fail_timeout=2; } [root@lvs-master conf.d]# service nginx restart 停止 nginx: [確定] 正在啟動 nginx: [確定] [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.137 </html> [root@elk ~]# curl 10.0.0.136 <html> 10.0.0.137 </html> #配置這種負(fù)載均衡后,>每個請求按訪問IP的hash結(jié)果分配,這樣來自同一個IP的訪客固定訪問一個后端服務(wù)器, #有效解決了動態(tài)網(wǎng)頁存在的session共享問題。(一般電子商務(wù)網(wǎng)站用的比較多)
關(guān)于“Nginx正反向代理及負(fù)載均衡等功能如何實(shí)現(xiàn)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
當(dāng)前文章:Nginx正反向代理及負(fù)載均衡等功能如何實(shí)現(xiàn)
鏈接地址:http://aaarwkj.com/article26/gdsdjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)、移動網(wǎng)站建設(shè)、軟件開發(fā)、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)