本篇文章给大家介绍Tomcat集群实战——部署zrlog博客项目,包含Nginx负载均衡,HTTPS证书,Redis会话保持,在实战中学习,事半功倍!
准备工作
主机名称 | 公网IP | 私网IP |
LB01 | 10.0.0.6 | 172.16.1.6 |
Web01 | 172.16.1.7 | |
Web02 | 172.16.1.8 | |
NFS | 172.16.1. | |
DB01 | 172.16.1.51 |
Web02服务及项目部署
一、安装tomcat
1. #导入jdk的rpm包进行安装 2. [root@Web02 ~]# rpm -ivh jdk-8u181-linux-x64.rpm 3. 4. [root@Web01 ~]# scp -rp /soft 10.0.0.8:/ 5. [root@Web01 ~]# scp -rp /code/tomcat 10.0.0.8:/code 6. [root@Web01 ~]# scp /usr/lib/systemd/system/tomcat.service 10.0.0.8://usr/lib/systemd/system/tomcat.service 7. 8. #scp无法传输软连接,需要重新做 9. [root@Web02 soft]# rm -rf tomcat/ 10. [root@Web02 soft]# ln -s /soft/apache-tomcat-9.0.73/ /soft/tomcat 11. [root@Web02 soft]# systemctl daemon-reload 12. [root@Web02 soft]# systemctl start tomcat
windows修改hosts文件查看是否可以正常访问
二、将静态资源挂载到NFS
f12审查元素,或者右键复制图片链接地址可以查看图片目录,也就是web存放静态资源的目录
1. [root@NFS ~]# mkdir /data/zrlog 2. [root@NFS ~]# chown -R www.www /data/zrlog/ 3. [root@NFS ~]# cat /etc/exports 4. /data/zrlog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666) 5. [root@NFS ~]# systemctl restart nfs 6. 7. [root@Web01 ~]# yum -y install nfs-utils 8. [root@Web01 ~]# showmount -e 172.16.1.31 9. Export list for 172.16.1.31: 10. /data/zrlog 172.16.1.0/24 11. [root@Web01 ~]# mount -t nfs 172.16.1.31:/data/zrlog /code/tomcat/zrlog/ROOT/attached/ 12. [root@Web01 ~]# systemctl restart tomcat.service 13. 14. Web02同样方式挂载
正常上传图片,并且NFS中有显示
三、Nginx负载均衡+HTTPS证书
在Nginx做代理时,Nginx代理后端Nginx头部信息默认丢弃,Nginx代理后端Tomcat 头部信息自动携带 不管前面任何域名解析到负载 始终携带代理文件的头部信息。
1. Tomcat和Nginx都是Web服务器,它们在携带头部信息方面的区别主要有以下几点: 2. 1. Tomcat:Tomcat默认情况下会将所有传入HTTP请求的头部信息都原封不动地转发给后端的应用程序处理。这意味着在使用Tomcat作为Web服务器时,应用程序可以完整地获取到HTTP请求中的所有头部信息。 3. 2. Nginx:与Tomcat不同,Nginx通过配置文件可以控制哪些头部信息被转发给后端的应用程序。在默认情况下,Nginx只会转发一些常见的头部信息,例如Host、User-Agent等。这些头部信息对于大多数应用程序来说已经足够使用。 4. 3. 处理速度:由于Nginx的设计目标是高性能、高并发,因此相比之下,Nginx在处理大量请求时具有更高的效率和更快的速度。而Tomcat则更加注重Java应用程序的功能实现和可靠性。 5. 总的来说,在处理高并发请求和负载均衡方面,Nginx可能更适合;而在业务逻辑处理上,Tomcat可能更具优势。
1. [root@LB01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.conf 2. upstream zrlog { 3. server 172.16.1.7:8080; 4. server 172.16.1.8:8080; 5. } 6. 7. server { 8. listen 80; 9. server_name zrlog.koten.org; 10. return 302 https://$server_name$request_uri; 11. } 12. 13. server { 14. listen 443 ssl; 15. server_name zrlog.koten.org; 16. ssl_certificate ssl_key/server.crt; 17. ssl_certificate_key ssl_key/server.key; 18. location / { 19. proxy_pass http://zrlog; 20. include proxy_params; 21. } 22. } 23. [root@LB01 ~]# cat /etc/nginx/proxy_params 24. proxy_set_header Host $http_host; 25. proxy_http_version 1.1; 26. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 27. 28. proxy_connect_timeout 30; 29. proxy_send_timeout 60; 30. proxy_read_timeout 60; 31. 32. proxy_buffering on; 33. proxy_buffer_size 32k; 34. proxy_buffers 4 128k; 35. [root@LB01 ~]# systemctl restart nginx
修改tomcat日志格式,获取http的Header信息
1. [root@Web01 tomcat]# cat /soft/tomcat/conf/server.xml 2. ...... 3. <Host name="zrlog.koten.org" appBase="/code/tomcat/zrlog" 4. unpackWARs="true" autoDeploy="true"> 5. 6. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 7. prefix="zrlog" suffix=".txt" 8. pattern="%h %l %u %t "%r" %s %b %{User-Agent}i %{X-Forwarded-For}i" /> #修改日志格式 9. 10. </Host> 11. ...... 12. [root@Web01 tomcat]# systemctl restart tomcat 13. 14. Web02操作一致
带证书正常访问
Redis会话保持
会话保持有很多种方式,例如ip_hash,mysql,redis,tomcat自带的cluster session复制(官方建议不超过4个tomcat节点),本知识点不再结合zrlog博客
一、配置虚拟主机,所有节点都需要配置,以web01为例
1. [root@Web01 ~]# cat /soft/tomcat/conf/server.xml 2. ...... 3. <!--session.koten.org--> 4. <Host name="session.koten.org" appBase="/code/to 5. mcat/session" 6. unpackWARs="true" autoDeploy="true"> 7. </Host> 8. ...... 9. [root@Web01 ~]# systemctl restart tomcat
二、创建目录及代码文件,所有节点都需要配置,以web01为例
1. [root@Web01 ~]# mkdir -p /code/tomcat/session/ROOT 2. [root@Web01 ~]# cat /code/tomcat/session/ROOT/index.jsp<body> 3. <% 4. //HttpSession session = request.getSession(true); 5. System.out.println(session.getCreationTime()); 6. out.println("<br> Web01 SESSION ID:" + session.getId() + "<br>"); #此处需要修改 7. out.println("Session created time is :" + session.getCreationTime() 8. + "<br>"); 9. %> 10. </body>
三、接入负载均衡
1. cat >/etc/nginx/conf.d/proxy_session.conf<<'EOF' 2. upstream session { 3. server 172.16.1.7:8080; 4. server 172.16.1.8:8080; 5. } 6. 7. server { 8. listen 80; 9. server_name session.koten.org; 10. 11. location / { 12. proxy_pass http://session; 13. include proxy_params; 14. } 15. } 16. EOF 17. 18. [root@LB01 ~]# systemctl restart nginx
刷新发现session id每次都有变化,无会话保持
四、接入TomcatClusterRedisSessionManager,所有节点都需要配置,以Web01为例
1. #redis服务器端需要安装并开启 2. [root@DB01 ~]# yum -y install redis 3. [root@DB01 ~]# cat /etc/redis.conf |grep ^bind 4. bind 127.0.0.1 172.16.1.51 5. [root@DB01 ~]# systemctl start redis 6. 7. 8. #下载session工具包 9. [root@Web01 ~]# wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/4.0/tomcat-cluster-redis-session-manager.zip 10. [root@Web01 ~]# unzip tomcat-cluster-redis-session-manager.zip 11. [root@Web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/ 12. [root@Web01 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /soft/tomcat/conf/ 13. 14. #修改redis服务器IP 15. [root@Web01 ~]# cat /soft/tomcat/conf/redis-data-cache.properties|grep redis.hosts= 16. redis.hosts=172.16.1.51:6379 17. 18. #添加如下两行至tomcat/conf/context.xml,添加在</Context>上一行,注意位置 19. [root@Web01 ~]# cat /soft/tomcat/conf/context.xml 20. <Valve className="tomcat.request.session.redis.SessionHandlerValve" /> 21. <Manager className="tomcat.request.session.redis.SessionManager" /> 22. [root@Web01 ~]# systemctl restart tomcat
无论怎么刷新,session id都不会变
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!