ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Nginx实现Java项目不停机更新

2019-08-04 21:38:51  阅读:831  来源: 互联网

标签:8080 请求 nginx 停机 http Nginx 9090 Java


原文链接:https://liang-hr.iteye.com/blog/2254734

Nginx安装配置

安装

我的环境是CentOS6,请读者根据自身环境选择相应的安装方式,以下内容参考自:http://nginx.org/en/docs

Shell代码  收藏代码

  1. wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm  
  2. rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm  
  3. yum install nginx  
  4. nginx -v  

线装的是最新稳定版,当前是1.8.0,安装完毕后,使用命令 nginx 就可以启动 nginx 服务了:

Shell代码  收藏代码

  1. nginx  
  2. ps -ef|grep nginx  

 

简述

nginx 由一个主进程(master)和若干工作进程(worker)组成,master负责配置维护及请求调度,worker处理实际请求,worker的数量可在配置文件中定义或Nginx根据机器配置(CPU Cores)自调整。配置文件位置因安装方式与环境而有所不同,可通过 find / -name nginx.conf确定,我这里是在 /etc/nginx/nginx.conf, 日志文件在 /var/log/nginx目录。

 

启停命令

Shell代码  收藏代码

  1. nginx            // 启动  
  2. nginx -s stop    // 快速关闭(暴力)  
  3. nginx -s quit    // 当worker处理完请求后再关闭  
  4. nginx -s reload  // 重加载配置文件使修改生效。该操作首先会校验文件合法性,如果返回success,就启动一个新的worker进程接受新请求,等旧的worker进程处理完之前的请求后,再关闭它。  

master进程id记录在 /var/run/nginx.pid 文件中,正常停止时会删除该文件,nginx不建议手动关闭(如kill),这可能会导致不可预知的问题。

 

搭建静态资源服务器

Shell代码  收藏代码

  1. cd /etc/nginx  
  2. cp nginx.conf nginx.conf.bak  
  3.    
  4. vi nginx.conf        // 在相应位置加入以下配置信息  
  5. http {  
  6.     #include /etc/nginx/conf.d/*.conf;  
  7.     server {  
  8.         location / {  
  9.             root /data/www;  
  10.         }  
  11.         location /images/ {  
  12.             root /data/www;  
  13.         }  
  14.     }  
  15. }  
  16.    
  17. nginx -s reload  

访问http://localhost/images/default.jpg 将访问 /data/www/images/default.jpg

访问 http://localhost/html/index.html 将访问 /data/www/html/index.html

Note : 如果访问异常,可以看日志 /var/log/nginx

 

搭建代理服务器

Nginx最常用的功能就是充当代理服务器,即Nginx从客户端接收请求,然后转交给被代理机器处理,得到反馈后再发回给客户端。这个过程中,被代理的机器对外是透明的。

 

将所有请求转发到8080口的应用服务器上,下例用的是tomcat。

Shell代码  收藏代码

  1. vi nginx.conf        // 在相应位置加入以下配置信息  
  2. http {  
  3. #include /etc/nginx/conf.d/*.conf;  
  4.     server {  
  5.         location / {  
  6.             proxy_pass http://localhost:8080/;  
  7.         }  
  8.     }  
  9. }  
  10. nginx -s reload  

访问 http://localhost/blog/1将访问 http://localhost:8080/blog/1

 

Nginx + Tomcat 平滑升级

Java hotswap始终是一个难题,在做功能更新的时候将会产生一段不可用时间,通过Nginx平滑启动,可实现应用的无缝升级。具体流程如下:

 

1) 准备两台Tomcat, 分别以8080,9090口提供服务

2) 假设当前是Nginx + Tomcat:8080 在提供服务

3) 将功能的更新发到当前闲置的Tomcat:9090

4) 修改Nginx配置文件,将新请求从8080转到9090口

5) 执行nginx -s reload,新的请求将平缓过渡到9090,8080上的worker进程将在处理完剩余请求后才关闭

 

平滑切换测试

新建一个Servlet项目(demo)并发到8080,9090口的tomcat上,假设Servlet名字是DemoServlet,代码如下:

Java代码  收藏代码

  1. Thread.sleep(3000);  
  2. response.setContentType("text/html");  
  3. Object arg = request.getParameter("arg");  
  4. PrintWriter w = response.getWriter();  
  5. w.print(arg);  
  6. w.close();  

首先确保以下两个链接访问是正常的:

http://localhost:8080/demo/DemoServlet?arg=abcd

http://localhost:9090/demo/DemoServlet?arg=abcd

 

Nginx配置使用8080口提供服务,9090暂时闲置:

Shell代码  收藏代码

  1. server {  
  2.     location / {  
  3.         proxy_pass http://localhost:8080/;  
  4.     }  
  5. }  

确保可以通过Nginx访问Servlet: http://localhost/demo/DemoServlet?arg=abcd

 

通过编程或工具,不断地向Nginx发送请求。观察请求响应情况,结合Nginx日志判断在服务切换过程中(8080 -> 9090),是否有请求丢失的情况。下面使用Jmeter演示:

 

1) 开启50个线程不断地往Nginx的demo/DemoServlet 发请求,这时,实际的处理工作是Tomcat:8080在做的,从下图可以看到请求都被正常处理了。



 

2) 假设这时候应用要更新了,因为8080正在服务,所以应该将更新内容发到9090上,然后修改Nginx.conf将新请求发往9090,切换过程中继续观察请求处理结果。

Shell代码  收藏代码

  1. server {  
  2.     location / {  
  3.         #proxy_pass http://localhost:8080/;  
  4.          proxy_pass http://localhost:9090/;  
  5.     }  
  6. }  
  7. nginx -s reload  



 

可以看到新请求都被转发给9090口了,这时8080口在处理完剩余的请求后,worker进程将自动关闭。

 

Note: 如果项目涉及会话共享的问题,请另行参考其它文章。

More: 对于hotswap如果大家有更好的方法,请告之。

 

参考资料

官网资料:http://nginx.org/en/docs

热部署:http://www.ibm.com/developerworks/cn/java/j-lo-hotdeploy/

Apache+Tomcat无缝升级:http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/

标签:8080,请求,nginx,停机,http,Nginx,9090,Java
来源: https://blog.csdn.net/weixin_41249041/article/details/98474613

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有