271 条记录
Nginx 多版本部署:current 软链接方案
目录规划:
/service/nginx/
├── nginx-1.30.5/ # 具体 Nginx 版本
│ ├── conf/
│ │ └── nginx.conf
│ ├── sbin/
│ │ └── nginx
│ └── nginx.pid
│
├── current -> nginx-1.30.5 # 当前使用版本
│
└── conf/ # 跨版本的网站/反代配置
├── zen.conf
└── ...
1. 创建 current 软链接
不要提前创建 /service/nginx/current 目录。
ln -s /service/nginx/nginx-1.30.5 /service/nginx/current
检查:
ls -ld /service/nginx/current
readlink -f /service/nginx/current
应该得到类似:
/service/nginx/current -> /service/nginx/nginx-1.30.5
/service/nginx/nginx-1.30.5
如果之前误创建了 current 普通目录:
rm -rf /service/nginx/current
ln -s /service/nginx/nginx-1.30.5 /service/nginx/current
2. systemd 永远使用 current
/etc/systemd/system/nginx.service:
[Unit]
Description=NGINX HTTP and reverse proxy server
Documentation=https://nginx.org/en/docs/
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/service/nginx/current/nginx.pid
ExecStartPre=/service/nginx/current/sbin/nginx -t -c /service/nginx/current/conf/nginx.conf
ExecStart=/service/nginx/current/sbin/nginx -c /service/nginx/current/conf/nginx.conf
ExecReload=/service/nginx/current/sbin/nginx -s reload
ExecStop=/service/nginx/current/sbin/nginx -s quit
Restart=on-failure
RestartSec=3
LimitNOFILE=65535
PrivateTmp=true
[Install]
WantedBy=multi-user.target
应用:
systemctl daemon-reload
systemctl enable nginx
systemctl restart nginx
systemctl status nginx
3. Nginx 主配置引用公共网站配置
每个版本自己的:
/service/nginx/current/conf/nginx.conf
在 http {} 中加入:
include /service/nginx/conf/*.conf;
以后网站、反代配置统一放:
/service/nginx/conf/
例如:
/service/nginx/conf/zen.conf
/service/nginx/conf/blog.conf
/service/nginx/conf/api.conf
这样升级 Nginx 时不用迁移网站配置。
4. 升级 Nginx 版本
假设:
/service/nginx/nginx-1.30.5
升级到了:
/service/nginx/nginx-1.30.6
先测试新版本:
/service/nginx/nginx-1.30.6/sbin/nginx -t \
-c /service/nginx/nginx-1.30.6/conf/nginx.conf
通过后,推荐用临时软链接 + mv 原子切换:
ln -s /service/nginx/nginx-1.30.6 /service/nginx/current.new
mv -Tf /service/nginx/current.new /service/nginx/current
检查:
readlink -f /service/nginx/current
应该输出:
/service/nginx/nginx-1.30.6
然后:
systemctl restart nginx
完成升级。
systemd 配置完全不用修改。
5. 回滚旧版本
如果新版本有问题:
ln -s /service/nginx/nginx-1.30.5 /service/nginx/current.new
mv -Tf /service/nginx/current.new /service/nginx/current
systemctl restart nginx
几条命令即可回滚。
6. 常用命令
测试当前版本配置:
/service/nginx/current/sbin/nginx -t \
-c /service/nginx/current/conf/nginx.conf
查看当前版本:
/service/nginx/current/sbin/nginx -v
查看 current 实际指向:
readlink -f /service/nginx/current
重新加载配置:
systemctl reload nginx
重启:
systemctl restart nginx
查看状态:
systemctl status nginx
查看日志:
journalctl -u nginx -f
7. Certbot 同样使用 current
如果使用 Certbot Nginx 插件:
certbot --nginx \
--nginx-server-root /service/nginx/current/conf \
--nginx-ctl /service/nginx/current/sbin/nginx
以后升级 Nginx 后,Certbot 命令也不用修改。
核心思想:
systemd ───────┐
Certbot ───────┼──> /service/nginx/current
管理命令 ──────┘ │
▼
/service/nginx/nginx-1.30.5
升级后只改变:
current
│
└──> nginx-1.30.6
所有依赖 Nginx 路径的配置都继续使用 /service/nginx/current/...,不需要随着版本号修改。