第4章:MES应用服务器部署

这一章,我们来聊聊MES系统的应用服务器部署。说实话,这是整个MES上线过程中最「动手」的环节。我见过不少项目,前期设计做得漂漂亮亮,结果在部署这步栽了跟头。嗯,咱们今天就把这块掰开揉碎了讲清楚。

核心要点:应用服务器部署不是简单的「下一步」安装,而是涉及中间件选型、JVM调优、包管理、负载均衡四个维度的系统工程。

4.1 应用服务器安装:Tomcat vs IIS

先说说选型。我个人习惯,Java技术栈的MES系统首选Tomcat。为什么?轻量、稳定、社区活跃。我在一个汽车零部件MES项目里,用Tomcat扛过日均50万次请求,稳得很。

Tomcat安装其实很简单,但有几个坑要注意:

# 下载Tomcat 9(推荐)
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz

# 解压到指定目录
tar -zxvf apache-tomcat-9.0.65.tar.gz -C /opt/

# 创建软链接,方便版本管理
ln -s /opt/apache-tomcat-9.0.65 /opt/tomcat

# 修改端口(避免冲突)
# 编辑 /opt/tomcat/conf/server.xml
# 把 8080 改成 8081(如果8080被占用)

我的经验:千万别用root用户跑Tomcat。我曾经吃过这个亏,安全审计直接被亮红灯。创建一个专门的tomcat用户,权限最小化。

如果是Windows环境,IIS也是选项。但说实话,IIS跑Java应用需要借助isapi_redirect.dll,配置起来比较折腾。我建议除非客户强制要求,否则还是用Tomcat省心。

4.2 JVM参数调优:别让内存成为瓶颈

JVM调优,说白了就是让Java虚拟机「吃」得刚刚好。吃少了频繁GC,吃多了浪费资源。我见过一个MES系统,上线第一天就OOM,就是因为JVM参数没配好。

先给出一套我常用的基准配置:

# 在 catalina.sh 或 setenv.sh 中设置
JAVA_OPTS="-server -Xms4g -Xmx4g -Xmn1.5g \
  -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
  -XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
  -XX:+HeapDumpOnOutOfMemoryError \
  -XX:HeapDumpPath=/opt/tomcat/dumps \
  -Djava.awt.headless=true"

解释一下几个关键参数:

参数 作用 我的建议
-Xms / -Xmx 堆内存初始/最大值 设成一样,避免运行时动态调整
-Xmn 年轻代大小 堆内存的1/3到1/2
UseG1GC G1垃圾回收器 适合大堆内存(4G以上)
HeapDumpOnOutOfMemoryError OOM时自动dump 一定要开!排查问题利器

注意:JVM参数不是越大越好。我曾经给一个MES系统分配了16G堆内存,结果GC停顿时间飙到5秒,生产直接报警。后来降到8G,反而更稳。要根据实际业务量来调。

4.3 应用包部署与发布

MES应用包通常是WAR包。部署流程我总结为三步走:

  1. 构建包:用Maven或Gradle打成WAR包
  2. 上传:传到服务器的webapps目录
  3. 启动:Tomcat自动解压部署

但实际项目中,我推荐用脚本自动化:

#!/bin/bash
# deploy.sh - MES应用部署脚本

APP_NAME="mes-web"
TOMCAT_HOME="/opt/tomcat"
BACKUP_DIR="/opt/backup/$(date +%Y%m%d_%H%M%S)"

# 1. 停止Tomcat
echo ">>> 停止Tomcat..."
$TOMCAT_HOME/bin/shutdown.sh
sleep 5

# 2. 备份旧包
echo ">>> 备份旧应用..."
mkdir -p $BACKUP_DIR
mv $TOMCAT_HOME/webapps/$APP_NAME* $BACKUP_DIR/

# 3. 部署新包
echo ">>> 部署新版本..."
cp /tmp/$APP_NAME.war $TOMCAT_HOME/webapps/

# 4. 启动Tomcat
echo ">>> 启动Tomcat..."
$TOMCAT_HOME/bin/startup.sh

# 5. 检查启动状态
sleep 10
tail -n 20 $TOMCAT_HOME/logs/catalina.out

避坑指南:我曾经在部署时忘了停Tomcat,直接把WAR包扔进webapps。结果Tomcat自动解压了一半,新旧文件混在一起,系统直接崩溃。记住:先停服务,再部署。

4.4 负载均衡配置:Nginx vs HAProxy

MES系统一旦上了规模,单台Tomcat肯定扛不住。这时候就需要负载均衡。我常用的两个方案:Nginx和HAProxy。

先画个架构图,让大家有个整体认识:

MES系统负载均衡架构 客户端用户 Nginx / HAProxy(负载均衡器) Tomcat 节点 1 Tomcat 节点 2 Tomcat 节点 3 共享数据库

Nginx配置示例(轮询策略):

upstream mes_backend {
    # 轮询策略,默认就是轮询
    server 192.168.1.10:8080 weight=5;
    server 192.168.1.11:8080 weight=3;
    server 192.168.1.12:8080 backup;  # 备用节点
}

server {
    listen 80;
    server_name mes.example.com;

    location / {
        proxy_pass http://mes_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 超时设置,MES业务通常需要长连接
        proxy_connect_timeout 30s;
        proxy_read_timeout 120s;
    }
}

HAProxy配置示例:

global
    daemon
    maxconn 4096

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend mes_front
    bind *:80
    default_backend mes_back

backend mes_back
    balance roundrobin
    server node1 192.168.1.10:8080 check inter 3000 fall 3 rise 2
    server node2 192.168.1.11:8080 check inter 3000 fall 3 rise 2
    server node3 192.168.1.12:8080 check inter 3000 fall 3 rise 2 backup

选型建议:

  • Nginx:适合HTTP/HTTPS场景,配置灵活,还能做静态资源缓存。我大部分MES项目都用它。
  • HAProxy:性能更强,支持TCP/UDP四层负载,适合对延迟敏感的场景。我在一个高并发MES项目里用过,确实稳。

重要提醒:负载均衡一定要配健康检查。我曾经没配,结果一台Tomcat挂了,Nginx还在往它转发请求,用户直接看到502。加了check参数后,自动摘除故障节点,省心多了。

4.5 部署后的验证清单

部署完了别急着走,按这个清单检查一遍:

  • ✅ 应用能正常访问(curl http://localhost:8080/mes)
  • ✅ 日志无异常(tail -f catalina.out)
  • ✅ JVM参数生效(jinfo -flags PID)
  • ✅ 负载均衡转发正常(看后端节点日志)
  • ✅ 数据库连接池正常(监控页面查看)

嗯,这一章的内容就这些。MES应用服务器部署,说白了就是「安装-调优-部署-分流」四个步骤。每一步都有坑,但只要你按我说的来,基本不会出大问题。记住:生产环境别图省事,该写脚本写脚本,该做备份做备份。


公众号:蓝海资料掘金营,微信deep3321