ubuntu+nginx+supervisor部署tornado

记录一下最近部署tornado的过程:

安装所需软件

使用apt-get安装nginx,redis,supervisor等需要用到的服务。
使用pip命令安装项目需要的python依赖。


修改文件描述符数量

默认ubuntu每个进程最多打开1024个文件描述符,有时候会提示”Too many open files”的错误,需要先修改这个限制。

  1. sudo vi /etc/security/limits.conf
    在文件尾加上
1
2
* hard nofile 65535
* soft nofile 65535
  1. sudo vi /etc/pam.d/su
    将pam_limits.so这一行注释删除.

  2. sudo vi /etc/profile
    最后加上ulimit -SHn 65535
    重启后用ulimit -n查看应该已经是65535.


修改nginx配置

这里启动四个tornado进程,nginx监听80端口反响代理到8000-8004的四个tornado进程。
修改nginx配置,vi /etc/nginx/nginx.conf

user root;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
}

http {
    # Enumerate all the Tornado servers here
    upstream frontends {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;

    keepalive_timeout 65;
    proxy_read_timeout 200;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 1000;
    gzip_proxied any;
    gzip_types text/plain text/html text/css text/xml
               application/x-javascript application/xml
               application/atom+xml text/javascript;

    # Only retry if there was a communication error, not a timeout
    # on the Tornado server (to avoid propagating "queries of death"
    # to all frontends)
    proxy_next_upstream error;

    server {
        listen 80;

        # Allow file uploads
        client_max_body_size 50M;

        location ^~ /static/ {
            root /home/wnn/program/picwall/;    # your own static file
            if ($query_string) {
                expires max;
            }
        }
        location = /favicon.ico {
            rewrite (.*) /static/favicon.ico;
        }
        location = /robots.txt {
            rewrite (.*) /static/robots.txt;
        }

        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://frontends;
        }
    }
}

使用supervisor管理tornado进程

supervisor是使用python开发的一个进程管理工具,可以用apt-get直接安装。
修改supervisor配置文件vi /etc/supervisor/supervisord.conf,在文件最后加上以下配置:

[group:tornadoes]
programs=tornado-8000,tornado-8001,tornado-8002,tornado-8003

[program:tornado-8000]
command=python /home/wnn/program/picwall/app.py --port=8000
directory=/home/wnn/program/picwall
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info

[program:tornado-8001]
command=python /home/wnn/program/picwall/app.py --port=8001
directory=/home/wnn/program/picwall
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info

[program:tornado-8002]
command=python /home/wnn/program/picwall/app.py --port=8002
directory=/home/wnn/program/picwall
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info

[program:tornado-8003]
command=python /home/wnn/program/picwall/app.py --port=8003
directory=/home/wnn/program/picwall
user=root
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info

这里定义个一个进程组,可以很方便的在supervisorctl里边管理进程。设置好以后可以使用supervisord命令启动。
这样tornado项目就启动好了。


刚做的一个图片网站http://tupian.today就是使用这些配置搭建的。vps使用的vultr,如果你需要购买vps可以通过http://www.vultr.com/?ref=6852279这个链接,可以获得十美元两个月的试用。感觉vultr东京机房的速度比digitocean旧金山的速度和稳定性好太多了,最低配置都是一个月5美元,不过vultr的缺点就是一个月只有400G流量,考虑速度还是用日本的机房吧,都说digitocean旧金山速度好,但是我用ssh经常登陆不了,体验很差。

More than just a pretty web framework, the Tornado IOLoop

Ref

Tornado Web Server
Introduction to Tornado