nginx 負載均衡(默認算法)


使用 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 接口;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM