Python 使用Supervisord运行2个Gunicorn应用程序和Nginx

Python 使用Supervisord运行2个Gunicorn应用程序和Nginx,python,nginx,gunicorn,supervisord,Python,Nginx,Gunicorn,Supervisord,无可否认,这个问题困扰了我好几个月。我只是拖延了修复其他bug,并把它放在一边,直到现在它必须被修复-- 我正在尝试运行两个独立的gunicorn应用程序,并在同一个supervisord.conf文件中启动nginx。当我启动supervisor时,我能够成功运行handlecalls应用程序,但当我转到commentbox负责加载的网站时,我收到一个内部服务错误(500) 当我使用命令字段后面的命令分别运行handlecalls和commentbox应用程序时,应用程序运行良好。当我尝试使用

无可否认,这个问题困扰了我好几个月。我只是拖延了修复其他bug,并把它放在一边,直到现在它必须被修复--

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

当我使用命令字段后面的命令分别运行handlecalls和commentbox应用程序时,应用程序运行良好。当我尝试使用supervisord运行这两个程序时,为什么commentbox程序会给我一个500错误

我的脚本:
这与督导员无关。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配置中

proxy_pass 127.0.0.1:8081
更新:以下是部署web应用程序的基础知识

  • 如上所述,一个进程只能监听一个端口
  • 您可以将nginx用作http服务器,监听端口
    80
    (或https的
    443
    ),然后将请求传递给监听其他端口的其他应用程序(例如,端口
    8000
    上的
    commentbox
    和端口
    8001
    上的handlecalls)
  • 通过在
    /etc/nginx/sites available/
    中添加某些服务器配置文件,您可以向nginx添加规则,以了解如何为应用程序服务(默认情况下,在某些情况下会有所不同)。规则应指定nginx了解其应向哪个应用程序发送请求的方式,例如:

    • 要重用相同的http端口(
      80
      ),应将每个应用程序分配到不同的域。i、 e:
      commentbox.yourdomain.com
      用于
      commentbox
      handlecalls.yourdomain.com
      用于
      handlecalls
    • 在同一个域上为两个不同的应用程序提供服务的一种方法是让它们在不同的端口上提供服务。例如:
      yourdomain.com
      将提供
      commentbox
      yourdomain.com:8080
      将提供
      handlecalls
    • 在同一域和同一端口上为两个不同的应用程序提供服务的一种方法是让它们在两个不同的端点上提供服务。例如,
      yourdomain.com/commentbox
      将提供
      commentbox
      yourdomain.com/handlecalls
      将提供
      handlecalls
  • 将配置文件添加到
    /etc/nginx/sites available/
    后,您必须将这些文件符号链接到
    /etc/nginx/sites enabled/
    ,以便告诉nginx您要启用它们。您可以直接将文件添加到
    /etc/nginx/sites enabled/
    ,但我不推荐这样做,因为它不能为您提供一种方便的方法来启用/禁用应用程序

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

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

  • /etc/nginx/sites available/handlecalls
    上的
    handlecalls
    创建一个配置文件,其中包含以下内容(根据需要编辑):

  • 创建符号链接以启用这些服务器:

    sudo ln -s /etc/nginx/sites-available/commentbox /etc/nginx/sites-enabled/
    sudo ln -s /etc/nginx/sites-available/handlecalls /etc/nginx/sites-enabled/
    
  • 重新启动nginx以生效

    sudo service nginx restart
    

  • 你们两个都可以在8000端口听吗?谢谢。作为更新,我将handle_calls命令更改为gunicorn handle_calls:app--bind 0.0.0.0:80,并从脚本中删除了nginx。现在commentbox程序可以工作,但不能处理电话。谢谢。作为更新,我将handle_calls命令更改为gunicorn handle_calls:app--bind 0.0.0.0:80,并从脚本中删除了nginx。现在commentbox程序可以工作,但不能处理调用。但是nginx有多个配置文件。在/etc/nginx/conf.d目录中,我看到default.conf、ssl、conf和virtual.conf。我应该将代理_传递行添加到哪一个?@user3831464 Err,所以您只是安装了nginx,而没有将其配置为服务于这些服务器?@user3831464我添加了一个关于配置nginx的指南非常感谢!!这有助于我更多地理解nginx。我会试试看。@user3831464如果有帮助,你能接受我的回答吗?
    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;
        }
    }
    
    sudo ln -s /etc/nginx/sites-available/commentbox /etc/nginx/sites-enabled/
    sudo ln -s /etc/nginx/sites-available/handlecalls /etc/nginx/sites-enabled/
    
    sudo service nginx restart