我一直在寻找如何在我的服务器上安装两个 nginx 实例无需 Docker/容器化,但结果却不尽如人意。该如何做呢?
可能的用例:
- 您有两个应用程序,您不希望其中一个崩溃时导致其他两个应用程序都崩溃。(这是我的场景。)
- 您希望让最终用户控制 nginx 配置和进程/服务。由于进程彼此隔离,因此可以独立停止/启动和配置它们。
答案1
我已经设法使用 Debian Bullseye 解决了这个问题,但对于其他 Linux 版本,步骤应该类似。
找到 nginx 服务文件:
find / -iname "nginx.service" -type f -ls
将服务文件复制到
/etc/systemd/system
。以下是我的场景的命令:(cp /usr/lib/systemd/system/nginx.service /etc/systemd/system/nginx2.service
文件名将成为服务的名称,因此请谨慎选择)将 nginx 配置复制到另一个文件夹:
cp -rp /etc/nginx /etc/nginx2
编辑 nginx2 服务文件:
nano /etc/systemd/system/nginx2.service
。更改以下行:[Service] PIDFile=/run/nginx2.pid ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx2/nginx.conf -q -g 'daemon on; master_process on;' ExecStart=/usr/sbin/nginx -c /etc/nginx2/nginx.conf -g 'daemon on; master_process on;' ExecReload=/usr/sbin/nginx -c /etc/nginx2/nginx.conf -g 'daemon on; master_process on;' -s reload ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx2.pid
编辑 nginx 配置文件:
nano /etc/nginx2/nginx.conf
。更改以下行:pid /run/nginx2.pid; include /etc/nginx2/modules-enabled/*.conf; http { include /etc/nginx2/mime.types; access_log /var/log/nginx/access2.log; error_log /var/log/nginx/error2.log; include /etc/nginx2/conf.d/*.conf; include /etc/nginx2/sites-enabled/*; }
删除默认站点的符号链接,因为它指向原始 nginx 实例的文件夹:
rm /etc/nginx2/sites-enabled/default
。(要重新创建,ln -s /etc/nginx2/sites-available/default /etc/nginx2/sites-enabled/default
。)您不能让两个 nginx 实例监听同一个端口和 IP 地址(除非您正在进行端口分片,这是一个高级主题...),因此您必须更改端口以使其不与第一个实例冲突。
通知 systemd 新服务:
systemctl daemon-reload
启用新服务:
systemctl start nginx2
享受!