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 &