每天 Shaarli

一天内的所有链接,汇聚在一个页面上。

September 24, 2026

Note: Nginx 多版本部署:current 软链接方案

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/...,不需要随着版本号修改。