设为首页 收藏本站
查看: 777|回复: 0

[经验分享] 基于Nginx实现Java项目无缝升级

[复制链接]

尚未签到

发表于 2016-12-23 10:02:10 | 显示全部楼层 |阅读模式
文章目标

本文主要介绍Nginx安装配置,代理服务器搭建等基础知识,然后通过代理方式,实现Java项目无缝升级,提高系统可用性。
 

Nginx安装配置

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

wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install nginx
nginx -v
线装的是最新稳定版,当前是1.8.0,安装完毕后,使用命令 nginx 就可以启动 nginx 服务了:

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

nginx            // 启动
nginx -s stop    // 快速关闭(暴力)
nginx -s quit    // 当worker处理完请求后再关闭
nginx -s reload  // 重加载配置文件使修改生效。该操作首先会校验文件合法性,如果返回success,就启动一个新的worker进程接受新请求,等旧的worker进程处理完之前的请求后,再关闭它。
master进程id记录在 /var/run/nginx.pid 文件中,正常停止时会删除该文件,nginx不建议手动关闭(如kill),这可能会导致不可预知的问题。
 
搭建静态资源服务器

cd /etc/nginx
cp nginx.conf nginx.conf.bak
vi nginx.conf        // 在相应位置加入以下配置信息
http {
#include /etc/nginx/conf.d/*.conf;
server {
location / {
root /data/www;
}
location /images/ {
root /data/www;
}
}
}
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。

vi nginx.conf        // 在相应位置加入以下配置信息
http {
#include /etc/nginx/conf.d/*.conf;
server {
location / {
proxy_pass http://localhost:8080/;
}
}
}
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,代码如下:

Thread.sleep(3000);
response.setContentType("text/html");
Object arg = request.getParameter("arg");
PrintWriter w = response.getWriter();
w.print(arg);
w.close();
首先确保以下两个链接访问是正常的:
http://localhost:8080/demo/DemoServlet?arg=abcd
http://localhost:9090/demo/DemoServlet?arg=abcd
 
Nginx配置使用8080口提供服务,9090暂时闲置:

server {
location / {
proxy_pass http://localhost:8080/;
}
}
确保可以通过Nginx访问Servlet: http://localhost/demo/DemoServlet?arg=abcd
 
通过编程或工具,不断地向Nginx发送请求。观察请求响应情况,结合Nginx日志判断在服务切换过程中(8080 -> 9090),是否有请求丢失的情况。下面使用Jmeter演示:
 
1) 开启50个线程不断地往Nginx的demo/DemoServlet 发请求,这时,实际的处理工作是Tomcat:8080在做的,从下图可以看到请求都被正常处理了。

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

server {
location / {
#proxy_pass http://localhost:8080/;
proxy_pass http://localhost:9090/;
}
}
nginx -s reload

DSC0001.png
 
可以看到新请求都被转发给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/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-318297-1-1.html 上篇帖子: nginx upstream的配置 下篇帖子: Nginx虚拟机和日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表