【问题标题】:Setting up a tornado web service in production with nginx reverse proxy使用 nginx 反向代理在生产环境中设置 Tornado Web 服务
【发布时间】:2023-11-26 09:23:01
【问题描述】:

过去几个月我一直在 Tornado 中开发 Web 服务,在我的测试环境中运行我使用的服务:

python index.py

index.py 是我的 tornado 应用程序处理程序,它侦听端口 8001。然后我使用 http://localhost:8001 从 Web 服务请求。我现在正在将我的测试环境部署到应该反映生产的暂存环境。如何在生产中运行龙卷风?我猜我需要为应用程序创建某种守护进程,但我不知道从哪里开始!

【问题讨论】:

    标签: nginx tornado


    【解决方案1】:

    您可以使用一些工具。

    首先,Supervisord

    Supervisord 是一个“流程控制系统”,您可以配置您的流程并让 Supervisor 管理它们,如果它们发生故障,它将重新启动它们,使管理它们更容易并让它们在后台运行

    这是一个示例主管配置文件

    [program:myprogram] 
    process_name=MYPROGRAM%(process_num)s
    directory=/var/www/apps/myapp 
    command=/var/www/apps/myapp/virtualenv/bin/python index.py --PORT=%(process_num)s
    startsecs=2
    user=youruser
    stdout_logfile=/var/log/myapp/out-%(process_num)s.log
    stderr_logfile=/var/log/myapp/err-%(process_num)s.log
    numprocs=4
    numprocs_start=14000
    

    使用该配置,Supervisor 将在端口 14001-14004 (numprocs_start) 上启动 4 个 (numprocs) index.py 实例。我们通过--PORT=%(process_num)s 让每个进程在不同的端口上启动。您应该更改 numprocsnumprocs_start 以适应您的环境/设备。通常我们运行 2xCPU 内核进程(因此四核处理器将有 8 个进程),但这可能会根据您的进程所做的事情以及代码中的阻塞程度而有很大差异。

    接下来,配置 NGINX 以将请求转发到您的站点

       upstream myappbackend {
                server 127.0.0.1:14001  max_fails=3     fail_timeout=1s;
                server 127.0.0.1:14002  max_fails=3     fail_timeout=1s;
                server 127.0.0.1:14003  max_fails=3     fail_timeout=1s;
                server 127.0.0.1:14004  max_fails=3     fail_timeout=1s;
        }
    
        server {
                listen                                          4.5.6.7:80;
                server_name                                     example.com;
    
                access_log      /var/log/nginx/myapp.log  main;
    
    
                location / {
                        proxy_set_header                Host            $host;
                        proxy_set_header                X-Real-Ip       $remote_addr;
                        proxy_pass                      http://myappbackend/;
                }
        }      
    

    该配置应根据您的应用程序及其工作方式进行修改,这是一个非常小的配置,几乎肯定需要扩展,但这应该足以让您开始

    【讨论】:

    • 是 nginx 还是 supervisord 处理访问 URL 时使用哪个进程?还是我需要更多软件来管理它。
    • 你能解释一下为什么你在 14000 开始这个过程吗?
    • nginx 将请求传递给后端之一。主管只负责流程管理( live/dead/restart )。对于端口,您可以选择任何您想要的,除非它与正在侦听其中一个端口的其他应用程序发生冲突
    最近更新 更多