反向代理
首先我们来说说***正向代理***。比如你要访问资源A,但是访问不到,你可以通过访问资源B,再通过它你访问到资源A,这即是正向代理。可能多个用户都通过资源B访问资源A,它隐藏了客户端的访问身份,代替客户与服务器交互,这就是代理。
反向代理,我们指的是我们访问nginx,但是nginx把请求转给tomcat,这样的模式和正向代理相反,即为反向代理。
为什么要做反向代理?
既然通过http://127.0.0.1:8080/login.jsp可以直接访问,为何要通过http://127.0.0.1/login.jsp去反向代理到tomcat?
配置负载均衡
负载均衡的概念就是当访问量很大的时候,一个 Tomcat 吃不消了,这时候就准备多个 Tomcat,由Nginx按照权重来对请求进行分配,从而缓解单独一个Tomcat受到的压力(权重模式)
配置upstream多节点,在server{}中设置反向代理到多节点
完成上图的配置后,我发现,静态资源无法访问。
修改配置
配置动静分离
因为nginx在处理静态文件时比tomcat高效,所以在使用nginx时,通常不会把所有的请求都如本例所示的交给tomcat, 而是把静态请求交给nginx,动态请求,如jsp, servlet,ssm,struts等请求交给tomcat. 从而达到动静分离的效果
(取自/)
在nginx配置文件Server{ }中,location /下方添加以下一段话
这表示所有的css js png等访问都由nginx来做,访问的地址是C:/Users/CJH/tomcat_1/webapps
其他问题
Session会话问题
通过负载均衡,我们把请求分发到不同的 Tomcat 来缓解服务器的压力,但是这里存在一个问题: 当同一个用户第一次访问tomcat_8080 并且登录成功, 而第二次访问却被分配到了tomcat_8081, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。
解决方案:
1:ip_hash
通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.这样就不会出现问题了了. 处理手段也很简单,在upstream最后加上ip_hash;就行了。不过这种方案并不完美,当如下几种情况发生时就有问题:1. 大量请求来之某个局域网,那么相当于就没有负载均衡了。2. 如果tomcat_8080挂了,那么此时nginx只能把请求交给tomcat_8081,但是这里却没有记录session,用户体验依然受影响。
2:用Redis来存取session.
Cookie问题
相同域名不同端口的两个应用,cookie名字、路径都相同的情况下,后面cookie会覆盖前面cookie
修改两个tomcat的conf/context.xml分别为
严格来说这个不是nginx的问题,但是因为多节点布在了同ip的不同端口,于是存在了cookie覆盖的问题,故在此解决。
毕