中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nginx正反向代理及負載均衡等功能如何實現

發布時間:2021-06-04 10:51:30 來源:億速云 閱讀:217 作者:小新 欄目:服務器

這篇文章將為大家詳細講解有關Nginx正反向代理及負載均衡等功能如何實現,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

系統環境:

VirtualBox Manager

Centos6.4

nginx1.10.0

IP對應的機器名:

IP 機器名 角色名

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 環境介紹

Nginx正反向代理及負載均衡等功能如何實現

1.2 配置介紹

Nginx server:(內網地址:10.0.0.136,外網地址:172.16.27.64)

使用VirtualBox Manager虛擬出雙網卡。

[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;  #監聽的端口 
  server_name 10.0.0.136; #server的內容地址,與client需要網絡互通 
 
 
  resolver 172.16.5.1;  #DNS,這個是DNS,訪問外網 
  location / { 
      proxy_pass http://$http_host$request_uri;  #$http_host和$request_uri是nginx系統變量,不需要替換,保持原樣 
        }

Nginx client:

只有一個內網網卡,通過訪問Nginx server去訪問internet,其實翻墻、肉雞、之類的俗稱就是這個原理。

[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/ 
正在解析主機 www.baidu.com... 失敗:域名解析暫時失敗。   #無法訪問百度 
wget: 無法解析主機地址 “www.baidu.com” 
 
[root@kvm ~]# export http_proxy=http://10.0.0.136:80 #設定環境變量,指定代理服務器的ip及端口 
 
[root@kvm ~]# wget www.baidu.com   #可以成功訪問百度了 
--2016-06-08 13:08:15-- http://www.baidu.com/ 
正在連接 10.0.0.136:80... 已連接。 
已發出 Proxy 請求,正在等待回應... 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]

二、反向代理

介紹文章同正向代理

Nginx正反向代理及負載均衡等功能如何實現

2.1 環境介紹

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>  
##都成功了,我們進行下一步。

2.2 配置介紹

[root@lvs-master conf.d]# ls     #nginx目錄下的配置文件 
zxproxy.conf 
[root@lvs-master conf.d]# cp zxproxy.conf fxproxy.conf #復制一份,之前是正向代理,現在是反向代理 
[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; #根據環境介紹,nginx server ip 
 
  location / { 
      proxy_pass http://10.0.0.137; #被代理的服務器ip 
        } 
 
#proxy_pass: proxy_pass URL 
#默認值:NO 
#使用字段:location,location中的if字段 
#這個參數設置被代理服務器的地址和被映射的URL,地址可以使主機名、域名、IP加端口的模式,如: 
#proxy_pass  http://192.168.1.6:8099/linuxtone/; 
 
[root@lvs-master conf.d]# service nginx restart #重啟加載配置

看下結果:

#先登錄到實驗環境中的clinet機上,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  #訪問反向代理服務器 
<html> 
10.0.0.137          
</html> 
#我們看到訪問代理服務器,結果被轉發到了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也就是我們環境的clinet, 
#而web-server上顯示的ip是10.0.0.136,也就是nginx-server。 
#說白了反向代理,對客戶來說nginx-server就是真正的服務器,實際上,當用戶訪問nginx-server的時候,會將請求轉發到 
#web-server1上,然后web-server1將請求的結果發給nginx-server,然后由ngin小-server將請求的結果轉交給用戶。 
 
#在web-server上看到的都是代理的ip,能不能也看到真實用戶的ip呢? 
 
[root@lvs-master conf.d]# cat fxproxy.conf         
server { 
  listen    80; 
  server_name 10.0.0.136;              #根據環境介紹,nginx server ip 
 
  location / { 
      proxy_pass http://10.0.0.137;        #被代理的服務器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" 
 
#改了之后還是顯示的是代理服務器的ip,我們去web-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指的的訪問的主機,現在改為訪問的真實主機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" 
#已經變成了真實的訪問地址

代理多個web服務器:

[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/  #進入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 
#我們去client上訪問試試: 
[root@elk ~]# curl 10.0.0.136/web2/ 
<html> 
10.0.0.111 
</html> 
#訪問成功

三、負載均衡

負載均衡實現的方式有很多,常用的lvs四層負載均衡,nginx是七層負載均衡,可以網上查詢相關資料。

3.1 環境介紹

Nginx正反向代理及負載均衡等功能如何實現

3.2 配置介紹

1.upstream是Nginx的HTTP Upstream模塊,這個模塊通過一個簡單的調度算法來實現客戶端IP到后端服務器的負載均衡。在上面的設定中,通過upstream指令指定了一個負載均衡器的名稱1.2.3.4。這個名稱可以任意指定,在后面需要用到的地方直接調用即可。

2.Nginx的負載均衡模塊目前支持4種調度算法,下面進行分別介紹,其中后兩項屬于第三方調度算法。

  • 輪詢(默認)。每個請求按時間順序逐一分配到不同的后端服務器,如果后端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。Weight 指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用于后端每個服務器性能不均的情況下。

  • ip_hash。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個后端服務器,有效解決了動態網頁存在的session共享問題。

  • fair。這是比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據后端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持fair的,如果需要使用這種調度算法,必須下載Nginx的upstream_fair模塊。

  • url_hash。此方法按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,可以進一步提高后端緩存服務器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調度算法,必須安裝Nginx 的hash軟件包。

3.upstream 支持的狀態參數

在HTTP Upstream模塊中,可以通過server指令指定后端服務器的IP地址和端口,同時還可以設定每個后端服務器在負載均衡調度中的狀態。常用的狀態有:

  • down,表示當前的server暫時不參與負載均衡。

  • backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup機器,因此這臺機器的壓力最輕。

  • max_fails,允許請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。

  • fail_timeout,在經歷了max_fails次失敗后,暫停服務的時間。max_fails可以和fail_timeout一起使用。

注,當負載調度算法為ip_hash時,后端服務器在負載均衡調度中的狀態不能是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{ }內部。定義好upstream之后,用proxy_pass引用一下即可。

4.測試結果

[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> 
#結果是server1,2交替出現,說明默認是輪詢方式的負載均衡。

5.健康檢查

一般健康檢查都需要搞個keepalived,但nginx也有相應的參數可以設置。

max_fails,允許請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。

fail_timeout,在經歷了max_fails次失敗后,暫停服務的時間。max_fails可以和fail_timeout一起使用,進行健康狀態檢查。

[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.測試下結果

[root@kvm httpd]# service httpd stop #關閉web-server1服務 
[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> 
#現在只能訪問web-server2了。 
 
[root@kvm httpd]# service httpd start  #打開web-server1服務 
[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的負載均衡

[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> 
#配置這種負載均衡后,>每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個后端服務器, 
#有效解決了動態網頁存在的session共享問題。(一般電子商務網站用的比較多)

關于“Nginx正反向代理及負載均衡等功能如何實現”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双城市| 通山县| 洪湖市| 腾冲县| 嵩明县| 蒙山县| 汉川市| 东至县| 台东市| 老河口市| 溧阳市| 云林县| 清远市| 宽城| 抚州市| 类乌齐县| 盖州市| 华蓥市| 科尔| 沁源县| 江都市| 丁青县| 永靖县| 鲜城| 嘉义市| 乾安县| 正宁县| 秦安县| 灵川县| 钦州市| 罗田县| 贡嘎县| 汪清县| 黄浦区| 资讯| 芜湖县| 普兰县| 平顺县| 丰都县| 囊谦县| 红桥区|