阿里云服务器部署 五 Nginx + springboot

Nginx的部分配置
 

1. 基础容灾配置(被动健康检查)

在 upstream 块中,通过 max_fails 和 fail_timeout 参数定义故障转移规则:

在 upstream 块中,通过 max_fails 和 fail_timeout 参数定义故障转移规则:

cd  /etc/nginx

vim nginx.conf

nginx

复制

upstream ai-backend {
        server 172.16.108.42:10011 weight=1 max_fails=3 fail_timeout=10s;
        server 172.16.108.43:10011 weight=1 max_fails=3 fail_timeout=10s;
        server 172.16.108.44:10011 weight=1 max_fails=3 fail_timeout=10s;
        keepalive 32;
        least_conn;
    }

    # 定义词向量服务的upstream
    upstream wordvec-backend {
        server 172.16.108.44:6001 weight=1 max_fails=3 fail_timeout=10s;  # 本地Nginx服务器的10011端口(若服务部署在Nginx本机)
        server 172.16.108.43:6001 weight=1 max_fails=3 fail_timeout=10s;
        server 172.16.108.42:6001 weight=1 max_fails=3 fail_timeout=10s;  # 另一台服务器的10011端口
        keepalive 32;                # 保持长连接
        least_conn;                  # 最少连接数负载均衡
    }
参数说明:
  • max_fails:在 fail_timeout 时间内,允许的最大失败请求次数。

  • fail_timeout:服务器被标记为不可用的时间(超时后自动恢复探测)。

  • 1. 权重(weight)的作用

  • 默认值:如果未指定 weight,默认值为 1

  • 流量分配规则:根据权重值的比例分配请求。

  • 适用场景:后端服务器性能不均衡时(如一台性能强、一台性能弱),通过权重调整流量分配。

效果:
  • 当某台服务器连续失败 3 次后,Nginx 会将其标记为不可用,10秒内不再分配请求

  • 10秒后,Nginx 会尝试重新发送请求探测是否恢复。

http {
    # ... 其他原有配置 ...

    upstream ai-backend {
        server 172.16.108.42:10011 weight=1 max_fails=3 fail_timeout=10s;
        server 172.16.108.43:10011 weight=1 max_fails=3 fail_timeout=10s;
        server 172.16.108.44:10011 weight=1 max_fails=3 fail_timeout=10s;
        keepalive 32;
        least_conn;
    }

    # 定义词向量服务的upstream
    upstream wordvec-backend {
        server 172.16.108.44:6001 weight=1 max_fails=3 fail_timeout=10s;  # 本地Nginx服务器的10011端口(若服务部署在Nginx本机)
        server 172.16.108.43:6001 weight=1 max_fails=3 fail_timeout=10s;
        server 172.16.108.42:6001 weight=1 max_fails=3 fail_timeout=10s;  # 另一台服务器的10011端口
        keepalive 32;                # 保持长连接
        least_conn;                  # 最少连接数负载均衡
    }

    server {
        listen 10011;
        server_name 172.16.108.41;

        location / {
            proxy_pass http://ai-backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 超时时间设为20分钟
            proxy_connect_timeout 1200s;
            proxy_read_timeout     1200s;
            proxy_send_timeout     1200s;
        }
    }

# 词向量服务的独立监听端口
    server {
        listen 6001;                # 监听外部请求的端口
        server_name 172.16.108.41;   # Nginx服务器IP或域名

        location / {
            proxy_pass http://wordvec-backend;  # 转发到词向量后端
            proxy_http_version 1.1;
            proxy_set_header Connection "";    # 启用HTTP 1.1长连接
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # 超时时间设为20分钟(1200秒)
            proxy_connect_timeout 120s;  # 连接后端超时
            proxy_read_timeout     120s;  # 读取响应超时
            proxy_send_timeout     120s;  # 发送请求超时
        }
    }

    # ... 其他服务配置 ...
}

1. 检查配置文件语法

在重启前 必须验证配置正确性,避免错误配置导致服务崩溃:

sudo nginx -t
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:57
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:64
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:71
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:79
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

2. 重新加载配置(平滑重启)

传统方式:

sudo nginx -s reload

[root@bigdata41 nginx]# sudo nginx -s reload
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:57
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:64
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:71
nginx: [warn] load balancing method redefined in /etc/nginx/nginx.conf:79
nginx: [error] invalid PID number "" in "/run/nginx.pid"

报异常 暂未处理

3. 完全重启服务(强制重启)
sudo systemctl restart nginx

sudo systemctl restart nginx  重新启动nginx
sudo systemctl status nginx  查看nginx 状态

将41上已有的6001端口服务迁移走

 sudo systemctl status nginx


-------------------------------------------

轻量级服务检测并重启
cd /opt/online

启动脚本

vim start.sh

#!/bin/bash

#############################################################
# 服务启动脚本
# 功能:标准化启动 Java 服务,集成 JVM 参数优化和日志管理
# 使用方式:直接执行 ./start.sh
#############################################################

# ------------------------- 基础配置 -------------------------
# 应用名称(根据实际 jar 包名称修改)
APP_NAME="ZbintelGPT-0.0.1-SNAPSHOT.jar"

# JAR 文件存放路径(建议使用绝对路径)
APP_HOME="/opt/online/$APP_NAME"

# 日志目录(自动创建)
LOG_DIR="/opt/online/logs"
mkdir -p $LOG_DIR  # 确保日志目录存在

# ------------------------- JVM 参数配置 -------------------------
# 基础内存配置(根据服务器内存调整,生产环境建议 Xms=Xmx)
JVM_OPTS="-server -Xms8g -Xmx8g"
JVM_OPTS="$JVM_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"

# G1 垃圾回收器优化(JDK8+)
JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
JVM_OPTS="$JVM_OPTS -XX:MaxGCPauseMillis=200"                    # 目标最大GC暂停时间
JVM_OPTS="$JVM_OPTS -XX:InitiatingHeapOccupancyPercent=45"       # 触发混合GC的堆使用比例
JVM_OPTS="$JVM_OPTS -XX:G1ReservePercent=30"                     # 堆保留空间

# 诊断与日志(JDK8 与 JDK11+ 兼容写法)
JVM_OPTS="$JVM_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
JVM_OPTS="$JVM_OPTS -Xloggc:${LOG_DIR}/gc_%p.log"                # GC日志路径
JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError"              # OOM时生成Dump
JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=${LOG_DIR}/java_heapdump.hprof"

# 容器环境支持(JDK8u191+ 或 JDK10+)
JVM_OPTS="$JVM_OPTS -XX:+UseContainerSupport"                    # 识别容器内存限制
JVM_OPTS="$JVM_OPTS -XX:ActiveProcessorCount=4"                  # 指定CPU核心数(根据实际情况调整)

# 其他优化
JVM_OPTS="$JVM_OPTS -Dfile.encoding=UTF-8"                        # 统一编码
JVM_OPTS="$JVM_OPTS -XX:-OmitStackTraceInFastThrow"               # 禁用异常优化(保留完整堆栈)

# ------------------------- 启动命令 -------------------------
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 正在启动服务..."
echo "JVM 参数:$JVM_OPTS"

# 使用 nohup 后台启动,日志自动滚动
nohup java $JVM_OPTS -jar $APP_HOME >> ${LOG_DIR}/app.log 2>&1 &

# 获取进程ID并写入文件(用于监控)
echo $! > ${APP_HOME%.jar}.pid

# ------------------------- 状态验证 -------------------------
sleep 3  # 等待进程初始化
if pgrep -f $APP_NAME > /dev/null; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 启动成功!进程ID: $(cat ${APP_HOME%.jar}.pid)"
    echo "日志文件:tail -f ${LOG_DIR}/app.log"
else
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 启动失败!请检查日志:${LOG_DIR}/app.log"
    exit 1
fi


vim service_watchdog.sh

#!/bin/bash

# 服务名称(通过 jar 文件名匹配)
SERVICE_NAME="ZbintelGPT-0.0.1-SNAPSHOT.jar"

# 检测进程是否存在
if ! pgrep -f "$SERVICE_NAME" > /dev/null; then
    # 如果进程不存在,启动服务
    echo "$(date): 检测到服务停止,尝试重启..." >> /opt/online/service_watchdog.log
    nohup /opt/online/start.sh >> /dev/null 2>&1 &
fi

给两个脚本加权限

chmod +x *.sh

手动验证:  /bin/bash /opt/online/service_watchdog.sh



crontab -e 

5分钟检测一次

*/5 * * * * /bin/bash /opt/online/service_watchdog.sh

查看crontab日志

tail -f /var/log/cron

其他 临时启动:nohup java -jar ZbintelGPT-0.0.1-SNAPSHOT.jar &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值