使用nginx为Tornado做反向代理

2014-09-16

完成一个tornado项目后,可能会因为以下原因需要nginx为其做反向代理:

  1. 为了提升网站性能,tornado需要开启多个实例,每个实例监听一个非80端口,由nginx监听80端口,把请求转发给tornado实例,并向客户端响应tornado的响应。
  2. 虚拟主机。一台主机上可能有多个不同域名的站点,nginx可以将指定的域名的请求转发给特定的web程序。

我使用的是系统是linux mint 16,nginx版本是nginx version: nginx/1.4.1 (Ubuntu),Tornado版本是3.2.2。

假设有一个tornado实例监听8888端口,该站点名为webapp,在目录/home/webapp下。/home/webapp/server.py是Tornado主程序,/home/webapp/static存放静态文件(例如css、js、图片等)。该站点域名为webapp.letiantian.me。

据此,可以在/etc/nginx/sites-enabled/目录下创建文件webapp.conf(也可以是其他名称),内容如下:

upstream webapp {
    server 127.0.0.1:8888;
}

server 
{
    listen 80;
    server_name webapp.letiantian.me;
    server_name_in_redirect  off;
    access_log  off;
    error_log /home/webapp/nginx-error.log;

    # Allow file uploads
    client_max_body_size 1M;

    proxy_read_timeout 10;

    location = /favicon.ico {
        rewrite (.*) /static/favicon.ico;
    }
    location = /robots.txt {
        rewrite (.*) /static/robots.txt;
    }

    location ^~ /static/ {
        root /home/webapp;  #!不要含有/static
        if ($query_string) {
            expires max;
        }
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://webapp;
    }
}

配置完成后,重启nginx,打开tornado实例,就可以通过IP+默认的80端口或者使用域名webapp.letiantian.me直接访问webapp了。

如果有多个tornado实例,可以在:

upstream webapp {
    server 127.0.0.1:8888;
}

添加相应的套接字。

题外话,可以使用supervisor程序监控tornado程序。

参考

第八章:部署Tornado
serholiu.com / example / nginx.conf
tornado 静态文件的路径错误
How To Install and Manage Supervisor on Ubuntu and Debian VPS

( 完 )