`
lzzy_alex
  • 浏览: 30062 次
社区版块
存档分类
最新评论

基于Nginx实现Java项目无缝升级

 
阅读更多

文章目标

本文主要介绍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在做的,从下图可以看到请求都被正常处理了。



 

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

server {
    location / {
        #proxy_pass http://localhost:8080/;
         proxy_pass http://localhost:9090/;
    }
}
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/

  • 大小: 111.2 KB
  • 大小: 59.6 KB
分享到:
评论
1 楼 ruanxianqing 2018-09-19  
按照你的思路
8080提供服务,9090升级完毕
但是这个时候需要升级数据库脚本,
且数据库版本新旧版本不兼容,还是会出现升级裂缝,
这个问题怎么解决呢

相关推荐

    Web应用IPv6升级改造的主要工作.docx

    特别是,要考虑 IPv4 向 IPv6 过渡的实现策略,做到应用系统无缝平滑迁移。 5. WEB 应用改造:WEB 系统作为通过 http 访问的应用系统,并不直接使用网络层协议。需要修改涉及 IP 地址调用的程序代码,例如: * 在 ...

    基于Web的办公自动化系统

    基于Web的办公自动化系统(Web-Based Office Automation System,简称WBOAS)是一种利用互联网技术实现企业或组织内部工作流程自动化、信息资源共享的系统。它打破了传统的办公模式,使得员工可以在任何地方、任何...

    基于微信小程序的云看护健康管理系统的设计与实现

    ### 基于微信小程序的云看护健康管理系统的关键知识点 #### 1. 研究背景与意义 - **社会需求**:随着人口老龄化加剧和年轻人生活压力增大,健康管理需求日益凸显。据统计,截至2018年底,中国60岁及以上人口达到2....

    基于ssm网约车管理系统.zip

    综上所述,基于SSM的网约车管理系统是一个综合性的项目,涵盖了后端开发、前端设计、数据库管理以及移动应用等多个领域,对于学习和提升Java Web开发技能具有很高的价值。通过这个系统,开发者可以深入理解并实践...

    基于ssm+Vu的在线购物系统源码数据库.docx

    - **负载均衡**:通过Nginx等工具实现负载均衡,分散请求压力,提高系统可用性。 6. **开发工具与环境**: - **开发平台**:使用Eclipse作为主要的开发环境,支持Java和前端项目的开发。 - **版本控制**:使用...

    Linux Centos 一键安装web环境

    它能够自动解决软件依赖关系,方便地进行软件安装、升级和卸载。而`apt-get`是Debian和Ubuntu等基于Debian的Linux发行版的包管理器,虽然CentOS默认不支持,但可以通过EPEL(Extra Packages for Enterprise Linux)...

    基于springcloud分布式session共享.docx.docx

    1. **黏性Session**:通过负载均衡器(如NGINX)进行基于Hash的请求分发策略,确保相同用户的请求总是被转发到同一台服务器。这种方法简单易实施,但存在单点故障风险,一旦该服务器出现问题,所有与之关联的Session...

    JSP企业电子商城网(数据库齐全)

    JSP(JavaServer Pages)是一种基于Java技术的服务器端脚本语言,用于生成动态网页内容。在构建企业级电子商城网站时,JSP发挥着至关重要的作用,它能够与后端Java代码无缝结合,提供高效的数据处理和页面渲染能力。...

    尚云功能分析相关技术情况

    6. **环境准备**:开发环境包括前端(TS+Vue3框架、Nginx部署、高德地图API等)和后端(JAVA、Spring Boot、MQTT、MySQL、WebSocket、Redis)。 7. **应用流程**:使用上云API前,开发者需注册并创建应用,获取APP ...

    WEB SERVER

    【标题】:WEB服务器 【描述】:WEB服务器在...开发者需要理解Web服务器的工作原理、Web服务的交互机制,以及具体实现这些功能的编程技术,如Java Servlets和JSP。同时,良好的文档和版本控制也是项目成功的关键因素。

    高校图书信息管理系统.zip

    可与校园一卡通系统、电子资源平台等其他系统集成,实现多系统间的无缝对接,提高服务效率。 综上所述,高校图书信息管理系统是现代图书馆不可或缺的一部分,它通过信息化手段提升了图书管理的现代化水平,为师生...

    zheng企业级开发框架-其他

    zheng项目不仅仅是一个开发架构,而是努力打造一套从前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位J2EE企业级开发解决方案。 zheng项目是一个基于Spring+...

    ELK-guide-cn.pdf

    - 通过Logstash处理不同类型的日志数据,例如nginx访问日志、nginx错误日志、postfix日志、ossec日志、windows系统日志、Java日志和MySQL慢查询日志。 性能与测试: - 介绍Logstash的性能测试方法和结果。 - 提供...

    TransportManagementSystem

    本文将深入探讨基于Java开发的TMS系统的核心功能、技术架构以及实现原理。 一、TMS系统核心功能 1. **订单管理**:TMS系统接收并处理来自客户的运输订单,包括订单创建、修改、取消等操作,确保信息准确无误。 2....

    河北金融学院学科竞赛管理系统.zip

    - **后端开发**:可能基于Java的Spring Boot框架构建,利用MySQL数据库存储数据,使用RESTful API进行前后端交互。 - **安全机制**:系统应具备用户身份验证和授权机制,如OAuth2.0或JWT(JSON Web Tokens),确保...

    envoyproxy开发手册(中文参考)

    - **Nginx Service Mesh**:基于 Nginx 的服务网格解决方案。 **获得帮助**: - **官方文档**:提供详细的安装、配置指南。 - **社区支持**:参与 GitHub 社区,获取技术支持。 - **培训与咨询**:寻求专业培训和...

    JFrog的Kubernetes容器平台技术实践.pdf

    3. **DevSecOps**:在Kubernetes中融入安全性,实现开发、安全、运维的无缝协作。 4. **应用改造**:将传统应用改造为符合Kubernetes运行模式的微服务,考虑日志、持久化、容错和扩展性。 5. **资源管理**:设置资源...

    分布式文件系统 FastDFS 介绍PPT

    4. **与 Web 服务器无缝衔接**:FastDFS 提供了 Apache 和 Nginx 扩展模块,可以与主流的 Web 服务器无缝集成,便于构建大规模的应用场景。 #### 三、FastDFS 发展历史 - **V1.x 系列**:2008 年 7 月发布 V1.00 ...

    mysql-overview_rev5.json

    MySQL支持多种操作系统,包括Windows、Linux、Unix和macOS,并且可以与其他编程语言(如PHP、Python、Java和C++)无缝集成。 二、MySQL架构 MySQL采用客户端-服务器模型。客户端通过网络连接发送SQL查询到服务器,...

Global site tag (gtag.js) - Google Analytics