与Supervisord一起运行2个Gunicorn应用程序和Nginx

2024-06-12 04:52:54 发布

您现在位置:Python中文网/ 问答频道 /正文

无可否认,这个问题困扰了我几个月。我只是拖延了修复其他bug,把它放到了必须修复的地方--

我试着运行两个独立的gunicorn应用程序,并在同一个程序中启动nginx监督人.conf文件。当我启动supervisor时,我能够成功运行handlecalls应用程序,但是当我进入commentbox负责加载的网站时,我得到一个内部服务错误(500)。在

当我分别运行handlecalls和commentbox应用程序时,这些应用程序运行良好。为什么当我试着和supervisord一起运行时commentbox程序会给我500个错误?在

我的上司脚本:

[program:nginx]
directory = /var/www/vmail
command = service nginx start -g "daemon off;"
autostart = True

[program:commentbox]
directory = /var/www/vmail
command = gunicorn app:app -bind 0.0.0.0:8000
autostart = True

[program:handlecalls]
directory = /var/www/vmail
command = gunicorn handle_calls:app --bind 0.0.0.0:8000
autostart = True

[supervisord]
directory = /var/www/vmail
logfile = /var/www/vmail/supervisorerrs.log
loglevel = trace

Tags: 程序trueapp应用程序varwwwnginxprogram
1条回答
网友
1楼 · 发布于 2024-06-12 04:52:54

这与上司无关。Supervisord只是您启动/停止/重新启动服务器的一种方式。这与服务器的配置有关。在

基本原理:要使用nginx为两个gunicorn应用程序提供服务,你必须在两个不同的端口上运行它们,然后将nginx配置为proxy,将请求传递到它们各自的端口。原因是:一旦一个进程在一个端口上运行,该端口就不能被另一个进程使用。在

因此,将supervisord脚本中的配置更改为:

[program:commentbox]
directory = /var/www/vmail
command = gunicorn app:app  bind 0.0.0.0:8000
autostart = True

[program:handlecalls]
directory = /var/www/vmail
command = gunicorn handle_calls:app  bind 0.0.0.0:8001
autostart = True

然后在nginx服务器的配置中handlecalls

^{pr2}$

更新:以下是部署web应用程序的基本知识

  1. 如上所述,一个端口只能被一个进程监听。在
  2. 您可以将nginx用作http服务器,监听端口80(或者对于https,443),然后将请求传递给侦听其他端口的其他应用程序(例如,8000上的commentbox,端口{}上的handlecalls)
  3. 您可以通过在/etc/nginx/sites-available/中添加某些服务器配置文件(默认情况下)向nginx添加规则,作为如何为应用程序服务的规则。在某些情况下是不同的)。规则应该规定nginx知道应该向哪个应用程序发送请求的方法,例如:

    • 要重用同一个http端口(80),每个应用程序都应该分配给不同的域。i、 e:commentbox.yourdomain.com代表commentbox,而{}代表{}
    • 在同一个域上为两个不同的应用程序提供服务的一种方法是让它们在不同的端口上服务。例如:yourdomain.com将服务commentbox,而{}将服务handlecalls
    • 在同一个域和相同端口上为两个不同的应用程序提供服务的一种方法是让它们在两个不同的端点上服务。例如,yourdomain.com/commentbox将服务commentbox,而{}将服务{}
  4. 在将配置文件添加到/etc/nginx/sites-available/之后,必须将这些文件符号链接到/etc/nginx/sites-enabled/,好吧,告诉nginx你想启用它们。您可以直接将这些文件添加到/etc/nginx/sites-enabled/,但我不建议这样做,因为它没有给您一种方便的方法来启用/禁用应用程序。

更新:下面是如何配置nginx以使用两个不同的子域为gunicorn应用程序提供服务:

  1. 添加两个子域commentbox.yourdomain.comhandlecalls.yourdomain.com,并将它们都指向服务器的IP。在
  2. /etc/nginx/sites-available/commentbox处为commentbox创建一个配置文件,其中包含以下内容(根据需要编辑):

    server {
        listen 80; 
    
        server_name           commentbox.yourdomain.com;
    
        root                  /path/to/your/application/static/folder;    
        location / {
            try_files         $uri @app;
        }
    
        location @app {
            proxy_set_header   Host $http_host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    
            proxy_redirect     off;
            proxy_pass         http://127.0.0.1:8000;
        }
    }
    
  3. /etc/nginx/sites-available/handlecalls处为handlecalls创建一个配置文件,其中包含以下内容(根据需要编辑):

    server {
        listen 80; 
    
        server_name           handlecalls.yourdomain.com;
    
        root                  /path/to/your/application/static/folder;    
        location / {
            try_files         $uri @app;
        }
    
        location @app {
            proxy_set_header   Host $http_host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    
            proxy_redirect     off;
            proxy_pass         http://127.0.0.1:8001;
        }
    }
    
  4. 创建符号链接以启用这些服务器:

    sudo ln -s /etc/nginx/sites-available/commentbox /etc/nginx/sites-enabled/
    sudo ln -s /etc/nginx/sites-available/handlecalls /etc/nginx/sites-enabled/
    
  5. 重启nginx生效

    sudo service nginx restart
    

相关问题 更多 >