如下面的配置:
location /test {
proxy_pass http://www.baidu.com/;
}
在访问 URI 为 /test 时会跳转到百度,但此时浏览器中的 URL 也会发生变化。
这是因为:向 http://www.baidu.com/ 发送请求后, Nginx 返回的是一个跳转的响应。
此后, 客户端会重新向 https://www.baidu.com/ 发送请求(此过程不再经历 Nginx)。
所以,最终浏览器发生了跳转, 而非 Nginx 的负载均衡。
问题解决
将配置中的 http 改为 https 即可。
在使用 Nginx 做反向代理时,如果后端服务器是 Tomcat 等动态服务器,则可能会出现 Session 一致性问题。
即: 无法确保同一个 Session 一定对应同一个 Server;
下面使用 Docker 来演示。
配置 IP 地址:

并在 Server1 和 Server2 上启动 Tomcat。
配置 Server
在 Server 端创建 jsp 页面:
Server 1
[root@c5477d71795c ROOT]# pwd
/var/lib/tomcat/webapps/ROOT
[root@c5477d71795c ROOT]# cat index.jsp
from 172.20.1.101
session=
Server 2
[root@c5477d71795c ROOT]# pwd
/var/lib/tomcat/webapps/ROOT
[root@c5477d71795c ROOT]# cat index.jsp
from 172.20.1.102
session=
然后访问 http://172.20.1.101:8080/ 和 http://172.20.1.102:8080/。
可分别显示来自哪个 Server 和对应的 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 并刷新,发现 from 172.20.1.10x 一直在变化,并且session=xxx 也变化。
说明:此时 Nginx 的配置无法保证 Session 一致性!
在 Tomcat 后面部署 Redis,MemCached 等内存数据库来保存 Session 相关信息。
本例中在 Nginx 服务器上安装 memcached 来解决 Session 一致性问题。
安装 memcached
在 Nginx 容器中使用 yum 安装:
启动 memcached
使用 memcached 命令启动:
memcached -d -m 128m -p 11211 -l 172.20.1.10 -u root -P /tmp/
参数说明:
-d: 后台启动
-m: 缓存大小
-p: 端口
-l: IP地址
-P: 服务启动后系统进程 ID 存储文件的目录
-u: 服务器以哪个用户作为管理用户
修改 Tomcat 配置
在两台 Server 中修改 tomcat 的配置:
[root@3a53f7504511 ROOT]
className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.20.1.10:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="auto"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
导入 jar 包使用 yum 安装的 Tomcat 可将 jar 包放在 /usr/share/java/tomcat/ 目录下。
需要的 jar 包:

Maven 依赖如下:
<dependency>
<groupId>asmgroupId>
<artifactId>asmartifactId>
<version>3.2version>
dependency>
<dependency>
<groupId>com.couchbase.clientgroupId>
<artifactId>couchbase-clientartifactId>
<version>1.4.11version>
dependency>
<dependency>
<groupId>com.googlecodegroupId>
<artifactId>kryo
artifactId>
<version>1.04version>
dependency>
<dependency>
<groupId>de.javakaffeegroupId>
<artifactId>kryo-serializersartifactId>
<version>0.11version>
dependency>
<dependency>
<groupId>de.javakaffee.msmgroupId>
<artifactId>memcached-session-managerartifactId>
<version>1.8.2version>
dependency>
<dependency>
<groupId>de.javakaffee.msmgroupId>
<artifactId>memcached-session-manager-tc7artifactId>
<version>1.8.2version>
dependency>
<dependency>
<groupId>com.googlecodegroupId>
<artifactId>minlogartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>de.javakaffee.msmgroupId>
<artifactId>msm-kryo-serializerartifactId>
<version>1.8.2version>
dependency>
<dependency>
<groupId>com.esotericsoftwaregroupId>
<artifactId>reflectasmartifactId>
<version>1.01version>
dependency>
<dependency>
<groupId>net.spygroupId>
<artifactId>spymemcachedartifactId>
<version>2.11.4version>
dependency>
注: 如果依赖和 Tomcat 版本不对应可能会什么也不显示,此时响应码为 500。
验证
上述步骤都正确配置之后, 再次访问 http://172.20.1.10/cat 并刷新会发现 SessionId 不再变化。
如喜欢本文,请点击右上角,把文章分享到朋友圈
如有想了解学习的技术点,请留言给若飞安排分享
因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享
·END·
相关阅读:
作者:Jasonkay
来源:https://jasonkayzk.github.io/2020/04/13/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1Nginx-%E4%B8%80%E4%BA%9B%E5%B8%B8%E8%A7%81%E7%9A%84%E9%97%AE%E9%A2%98/
版权申明:内容来源网络,仅供学习研究,版权归原创者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
我们都是架构师!

关注架构师(JiaGouX),添加“星标”
获取每天技术干货,一起成为牛逼架构师
技术群请加若飞:1321113940 进架构师群
投稿、合作、版权等邮箱:admin@137x.com