在没有 Docker 的情况下如何在同一台机器上运行两个 Nginx 实例?

在没有 Docker 的情况下如何在同一台机器上运行两个 Nginx 实例?

我一直在寻找如何在我的服务器上安装两个 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

  • 享受!

相关内容