Nginx +redis 負載均衡 會話共享(一):nginx 安裝與配置說明

項目中遇到了一些問題,在客戶提出修改某些模塊的時候。不能及時更新,可能某些時候用戶正在進行一些操作。因爲停掉了Tomcat 導致操作進行一半,就終止了

使用 Nginx + redis +Tomcat 實現負載均衡 和會話共享, 可以在某些服務掛掉的時候,自動轉發至其他服務

本文使用 windows 服務器做演示 使用nginx版本爲1.12.2 Tomcat版本爲8.0

第一次配置 Nginx+ Redis 業務已經實現,nginx配置還有很多,本文只是簡單的涉及到了負載均衡。以及一些常用的配置
理解上有錯誤,希望大家指導交流!

首先 Nginx 官網走一波

下載安裝
下載完成後 是一個zip 壓縮包 解壓壓縮包即可
如圖
這裏寫圖片描述
conf 與logs 爲配置文件夾 和日誌文件夾
雙擊 nginx.exe 可以看到黑窗口一閃而過。 查看任務管理器 已經有了nginx 的進程在跑
需要注意 nginx 默認配置監聽的是80端口
此時 在瀏覽輸入 localhost 可以看到nginx 的歡迎界面
這裏寫圖片描述

配置負載均衡
nginx 配置的 主要文件 在conf 文件夾下:nginx.conf
主要修改的配置爲 http 這段,以及 http下的server

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    #gzip  on;

     upstream hxs { 
        server 192.168.3.129:8080; 
        server 192.168.3.129:8081;      
    }  

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        proxy_set_header Host $host:$server_port; 
        location / {

            root   html;
            index  index.html index.htm;

            proxy_pass  http://hxs/hxsaloe/;
            proxy_cookie_path  /hxsaloe/ /;

            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header   Remote_Addr    $remote_addr;

            add_header 'Access-Control-Allow-Origin' *; 
            proxy_connect_timeout       100;
            proxy_read_timeout          100;
            proxy_send_timeout          100;
            charset utf-8;          
        }
    }
}

首先 看upstream 這個配置 指的是要參加負載均衡的服務器ip

在這裏我配置了2臺本地的Tomcat 端口不一樣 相當於2臺服務器 在跑Tomcat項目
這裏可以配置好多種 方式的 比如

1、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。

2、weight
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
例如:
upstream bakend {
server 192.168.159.10 weight=10;
server 192.168.159.11 weight=10;
}
3、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
例如:
upstream resinserver{
ip_hash;
server 192.168.159.10:8080;
server 192.168.159.11:8080;
}
4、fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream resinserver{
server server1;
server server2;
fair;
}

每個設備的狀態設置爲:
1.down 表示單前的server暫時不參與負載
2.weight 默認爲1.weight越大,負載的權重就越大。
3.max_fails :允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
4.fail_timeout:max_fails次失敗後,暫停的時間。
5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

server 段的配置
listen 80; 指的是監控 80端口,如果有人訪問80端口下的/ 就會進入這段設置

proxy_pass http://hxs/hxsaloe/; 我的理解是將請求轉發到這個配置上,hxsaloe實際指的是我Tomcat下的項目名

proxy_cookie_path /hxsaloe/ /; 這段配置比較重要,因爲我在實現session共享的時候,使用了號稱是無縫集成的 spring-session-redis,但是客戶端每次請求 都是全新的 sessionid 導致。會話共享失效,後來更改爲Tomcat-session-redis 還是出現相同的問題。意識到問題出在nginx 配置上。請求丟失session的原因我是這麼理解的。因爲用戶實際訪問的是 / 根目錄,但是在nginx 配置裏 給轉發到了/hxsaloe/ 這個路徑下。瀏覽器監測到變化了 就重新生成cookie信息了。 所以sessionid就跟着變化了。解決方法就是 手動設置 cookie的路徑 將訪問/的路徑cookie 設置爲 /hxsaloe/ ,然後重啓 session 成功實現共享

add_header ‘Access-Control-Allow-Origin’ ; 這個配置 是配置ajax 的請求跨域的, 表示接受所有

charset utf-8; 設置編碼 utf-8

proxy_connect_timeout 100;
proxy_read_timeout 100;
proxy_send_timeout 100; //設置 請求 超時時間 ,請求超時 就默認以爲 down掉 ,會將請求轉發至別的服務

1.實際使用中遇到問題, 後端使用Spring MVC +Mybatis 框架開發 在使用 redirect 重定向的時候 。 會丟失端口號
例如 我未登錄 查詢個人信息,後端監測到後 重定向到 登錄頁面。 但是這時候 丟失了端口號。 提示404錯誤
產生的原因是 nginx沒有正確的把端口信息傳送到後端
解決方案 添加配置 :

proxy_set_header Host host: server_port;

啓動nginx 訪問localhost 刷新幾下頁面 。會看到Tomcat1 和Tomcat2 交互出現。 表示負載均衡配置成功!

發佈了36 篇原創文章 · 獲贊 60 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章