1. 程式人生 > >Nginx的使用(反向代理,負載均衡)

Nginx的使用(反向代理,負載均衡)

在我目前的工作內容中,接觸到Nginx的用處無外乎兩點:

1. 反向代理,解決前端跨域的問題

  工作內容有門戶的概念,就是將各個子系統整合到門戶裡,在門戶裡面訪問,這樣就很容易造成跨域的問題

  那麼解決的辦法就是給子系統配置Nginx,通過代理來訪問,使門戶和子系統在同一IP下。

  具體的配置如下:(實際上就是給真實地址配置個代理IP,proxy_pass?)

    主要看server節點內容

      下面這個配置做到,訪問192.168.40.240:80時,會返回http://192.168.110.102:8000的資源。 可以配置多個server...即多個子系統

 1     server {
 2         listen       80;  # 監聽埠為80
 3         server_name  localhost;  # 伺服器名
 4         location / {
 5             add_header Access-Control-Allow-Origin *;
 6             proxy_set_header   Host             192.168.40.240;    # 代理伺服器IP
 7             proxy_set_header   X-Real-IP        $remote_addr;
8 proxy_pass http://192.168.110.102:8000; # 代理目標地址 9 proxy_intercept_errors on; #攔截異常 10 client_max_body_size 1000m;#檔案上傳大小 11 12 }

2. 負載均衡,這應該是最常見的軟負載了吧。

    

 1   upstream mh_server {    # 叢集名稱
 2         ip_hash; #解決session問題(建議子系統使用)
3 server 192.168.110.102:8000 weight=10; # 伺服器1的訪問地址, weight:分配權重。 4 server 192.168.40.158:7004 weight=10; # 伺服器2的訪問地址, weight:分配權重。 5 } 6 7 server { 8 listen 80; 9 server_name mh_server; # 叢集名稱 10 location / { 11 add_header Access-Control-Allow-Origin *; 12 proxy_set_header Host 192.168.40.158; # 叢集伺服器IP 13 proxy_set_header X-Real-IP $remote_addr; 14 proxy_pass http://mh_server; # 叢集名稱 15   proxy_intercept_errors on; #攔截異常 16 17 }

 這裡需要注意的是ip_hash是負載均衡的一種資源分配策略,預設是輪訓,這種ip_hash是跟前客戶端ip進行雜湊計算,導致請求會固定請求到一太固定的伺服器上。 

 這樣就解決了分散式部署的情況下session不共享的問題。

下面額外介紹一下Nginx支援的負載均衡排程演算法方式:

weight輪詢(預設):接收到的請求按照順序逐一分配到不同的後端伺服器,即使在使用過程中,某一臺後端伺服器宕機,nginx會自動將該伺服器剔除出佇列,請求受理情況不會受到任何影響。 這種方式下,可以給不同的後端伺服器設定一個權重值(weight),用於調整不同的伺服器上請求的分配率;權重資料越大,被分配到請求的機率越大;該權重值,主要是針對實際工作環境中不同的後端伺服器硬體配置進行調整的。

ip_hash:每個請求按照發起客戶端的ip的hash結果進行匹配,這樣的演算法下一個固定ip地址的客戶端總會訪問到同一個後端伺服器,這也在一定程度上解決了叢集部署環境下session共享的問題。

fair:智慧調整排程演算法,動態的根據後端伺服器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的伺服器分配到請求的概率高,響應時間長處理效率低的伺服器分配到的請求少;結合了前兩者的優點的一種排程演算法。但是需要注意的是nginx預設不支援fair演算法,如果要使用這種排程演算法,請安裝upstream_fair模組

url_hash:按照訪問的url的hash結果分配請求,每個請求的url會指向後端固定的某個伺服器,可以在nginx作為靜態伺服器的情況下提高快取效率。同樣要注意nginx預設不支援這種排程演算法,要使用的話需要安裝nginx的hash軟體包