反向代理概念
先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个FQ软件,通过FQ软件才能访问youtube. FQ软件就叫做正向代理。
所谓的反向代理,指的是用户要访问youtube,但是youtube悄悄地把这个请求交给bilibili来做,那么bilibili就是反向代理了。
在当前教程指的就是访问nginx,但是nginx把请求交给tomcat来做。
nginx.conf
location / 标识处理所有请求
proxy_pass http://127.0.0.1:8080/; (tomcat端口), 表示把请求都交给 http://127.0.0.1:8080 来处理
重启nginx
nginx -s reload
既然能通过8080访问,为什么要通过nginx 80端口 去反向代理到tomcat呢?
因为nginx在处理静态文件的吞吐量上面比tomcat好很多,通常他们俩配合,不会把所有的请求都如本例所示交给tomcat,而是把静态请求交给nginx,动态请求,
如jsp,servlet,ssm,等请求交给tomcat,从而达到动静分离的效果.
动静分离
所谓的动静分离就是指图片,css,js之类的都交给nginx来处理,nginx处理不了的,比如jsp交给tomcat来处理.
好处是nginx处理静态内容的吞吐量很高,比tomcat高多了,这样无形中提升了性能.
修改nginx.conf实现动静分离
增加一个location
location ~\.(css|js|png|jpg)$ { root /www/server/apache-tomcat-8.5.32/webapps/ROOT; }
这表示所有的css,js,png,jpg访问都由nginx来做,访问地址是root后面路径
注意,这里的地址要用正斜杠 / 而不是要用反斜杠 \
负载均衡
负载均衡是指当访问量很大的时候,一个Tomcat吃不消了,这个时候就准备多个Tomcat,由Nginx按照权重来对请求进行分配,从而缓解单独一个Tomcat受到的压力
修改nginx.conf支持两个tomcat
upstream tomcat_8080_8082{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8082 weight=2; }
然后修改location,反向代理到上述配置
location / { proxy_pass http://tomcat_8080_8082; }
weight表示权重,值越大,被分配到的几率越大.最大多少?不太清楚,10以内基本OK了.
重启 nginx -s reload 就可以实现基本的负载均衡了
session共享
通过负载均衡,可以把请求分发到不同的Tomcat来缓解服务器压力,但是存在一个问题:当同一个用户第一次访问tomcat:8080并且登录成功,
而第二次访问却分配到了tomcat:8082,这里并没有记录他的登录状态,那么就会呈现未登录状态. 也就是session没有实现共享.
解决办法:
ip_hash,通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡的session问题了,处理手段也很简单.
upstream tomcat_8080_8082{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8082 weight=2; ip_hash; }
这种方案不是很完美,1.大量请求来自某个局域网,就没有负载均衡了.2.如果tomcat:8080挂了,那么此时nginx只能把请求交给tomcat:8082,但是这里却没有记录session.
解决办法Ⅱ
redis+tomcat-session-manager
第二种办法是用Redis来存取session.Redis这个独立的HashMap,存放session非常合适.当tomcat:8080需要保存session时,放入Redis,取的时候也从Redis取.
1.用户提交账号密码后被分配到tomcat:8080,登录信息被存放到Redis中.
2.当用户第二次访问时,被分配到了tomcat:8082.
3.此时tomcat:8082就会从Redis获取相关信息,如果有对应信息,就会呈现登录状态了.
在两个tomcat的配置文件 tomcat/conf/context.xml 中需要加入:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="127.0.0.1" port="6379" database="0" maxInactiveInterval="60" />
之后重启两个tomcat
完成配置.