使用 nginx 的upstream模塊只需要幾步就可以實現一個負載均衡;
在 nginx 配置文件中添加兩個server
server { listen 81; server_name 192.168.1.129; root /var/www/html1; } server { listen 82; server_name 192.168.1.129; root /var/www/html2; }
使用upstream把這兩個 server 綁定到一個負載sever上提供統一入口;
upstream myservers { server 192.168.1.129:81 weight=1 max_fails=2 fail_timeout=3; server 192.168.1.129:82 weight=1 max_fails=2 fail_timeout=3; }
weight 是權重 max_fails 請求多少次失敗后把這台服務器標記為失效 fail_timeout 請求超時時間 更多參數可以通過nginx官方文檔查看;
server { listen 80; server_name 192.168.1.129; location / { index index.html; proxy_pass http://myservers; } }
在 /var/www/html1/ 和/var/www/html2下分別建立index.html 文件 內容分別為 html111 , html2222;
然后重啟nginx,訪問 192.168.1.129 瀏覽器會顯示 html111和html222交替變換,兩個內容的出現概率和權重有關;
這里有兩個問題:
用戶訪問過程中是先到達 192.168.1.129:80 然后被均勻轉發給 81和82端口,如果你在81端口中的php代碼里面獲取 remote_addr會
發現是 192.168.1.129而不用戶的地址,也就是說81和82就收到的遠程信息是 81和82前面的代理服務器的,用戶的真實信息被丟掉了;
解決辦法: 如果通過apt方式安裝的nginx 在 /etc/nginx/proxy_params 中會有幾個例子參考;
通過 proxy_set_header 可以設置相關頭信息
server { listen 80; server_name 192.168.1.129; location / { index index.html; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://myservers; } }
這樣在81/82端口收到的remote就是我們設置真實ip地址了;
還有個問題:在處理帶狀態的情況下 這種方式是不可行的,比如用戶發送登錄請求到82端口,82
端口保存了用戶的登錄session數據,但是當用戶請求主頁時,又被隨機轉發到81端口去了,81端口的后台根本就沒有用戶的session狀態;
於是告訴用戶你沒有登錄;
目前想到有兩個辦法:
(1)改變nginx的負載均衡算法,改為一致性哈希,可以根據用戶ip地址來決定 該去訪問那個端口,只要用戶ip地址不變,就始終會被轉發到指定端口;
(2)服務器不保存用戶狀態,用戶每次請求附帶狀態信息
第一種方式還存在一個缺陷,比如用戶用手機流量登錄了系統,然后進入wifi環境,ip地址就變了,狀態又會失效。第二種方式更適應性更加廣泛;而且更適合做
restful 接口;