HTTPS 請求跳轉(zhuǎn)
如下面的配置:
location /test {proxy_pass http://www.baidu.com/;
在訪問 URI 為 /test 時會跳轉(zhuǎn)到百度,但此時瀏覽器中的 URL 也會發(fā)生變化。
這是因?yàn)椋合?http://www.baidu.com/ 發(fā)送請求后, Nginx 返回的是一個跳轉(zhuǎn)的響應(yīng)。
此后, 客戶端會重新向 https://www.baidu.com/ 發(fā)送請求(此過程不再經(jīng)歷 Nginx)。
所以,最終瀏覽器發(fā)生了跳轉(zhuǎn), 而非 Nginx 的負(fù)載均衡。
問題解決
將配置中的 http 改為 https 即可。
session 一致性
在使用 Nginx 做反向代理時,如果后端服務(wù)器是 Tomcat 等動態(tài)服務(wù)器,則可能會出現(xiàn) Session 一致性問題。
即: 無法確保同一個 Session 一定對應(yīng)同一個 Server;
配置網(wǎng)絡(luò)
下面使用 Docker 來演示。
配置 IP 地址:
并在 Server1 和 Server2 上啟動 Tomcat。
配置 Server
在 Server 端創(chuàng)建 jsp 頁面:
Server 1
[root@c5477d71795c ROOT]# pwd/var/lib/tomcat/webApps/ROOT[root@c5477d71795c ROOT]# cat index.jspfrom 172.20.1.101
session=<%=session.getId()%>
Server 2
[root@c5477d71795c ROOT]# pwd/var/lib/tomcat/webapps/ROOT[root@c5477d71795c ROOT]# cat index.jspfrom 172.20.1.102
session=<%=session.getId()%>
然后訪問 http://172.20.1.101:8080/ 和 http://172.20.1.102:8080/。
可分別顯示來自哪個 Server 和對應(yīng)的 SessionId,并且刷新頁面時 SessionId 不會變化(即使是使用 Ctrl+F5 刷新)。
配置 Nginx
修改 Nginx 的配置文件, 加入新的 upstream 配置和 server 配置。
upstream tomcat {server 172.20.1.101:8080;server 172.20.1.102:8080;server {location /cat {proxy_pass http://tomcat/;
重啟 Nginx:
[root@ce12b3b4ce00 sbin]# ./nginx -s reload
訪問 http://172.20.1.10/cat 并刷新,發(fā)現(xiàn) from 172.20.1.10x 一直在變化,并且session=xxx 也變化。
說明:此時 Nginx 的配置無法保證 Session 一致性!
解決方案
在 Tomcat 后面部署 redis,memcached 等內(nèi)存數(shù)據(jù)庫來保存 Session 相關(guān)信息。
本例中在 Nginx 服務(wù)器上安裝 memcached 來解決 Session 一致性問題。
安裝 memcached
在 Nginx 容器中使用 yum 安裝:
yum install -y memcached
啟動 memcached
使用 memcached 命令啟動:
memcached -d -m 128m -p 11211 -l 172.20.1.10 -u root -P /tmp/
參數(shù)說明:
- -d: 后臺啟動
- -m: 緩存大小
- -p: 端口
- -l: IP地址
- -P: 服務(wù)啟動后系統(tǒng)進(jìn)程 ID 存儲文件的目錄
- -u: 服務(wù)器以哪個用戶作為管理用戶
修改 Tomcat 配置
在兩臺 Server 中修改 tomcat 的配置:
[root@3a53f7504511 ROOT]# vi /etc/tomcat/context.xml# context標(biāo)簽中加入下面的內(nèi)容requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"sessionBackupTimeout="1000"transcoderFactoryClass="de.JAVAkaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
導(dǎo)入 jar 包使用 yum 安裝的 Tomcat 可將 jar 包放在 /usr/share/java/tomcat/ 目錄下。
需要的 jar 包:
Maven 依賴如下:
asmasm3.2com.couchbase.clientcouchbase-client1.4.11com.googlecodekryo1.04de.javakaffeekryo-serializers0.11de.javakaffee.msmmemcached-session-manager1.8.2de.javakaffee.msmmemcached-session-manager-tc71.8.2com.googlecodeminlog1.2de.javakaffee.msmmsm-kryo-serializer1.8.2com.esotericsoftwarereflectasm1.0.NET.spyspymemcached2.11.4
注: 如果依賴和 Tomcat 版本不對應(yīng)可能會什么也不顯示,此時響應(yīng)碼為 500。
驗(yàn)證
上述步驟都正確配置之后, 再次訪問 http://172.20.1.10/cat 并刷新會發(fā)現(xiàn) SessionId 不再變化。