Nginx + tornado + supervisor部署
参考链接:supervisor + Tornado + Nginx 使用详解, 用tornado ,Supervisord ,nginx架网站, tornado官方文档
项目文档树:
. ├── chnservices │ └── channels.py ├── etc │ ├── chnservices.conf │ ├── nginx │ │ └── nginx.conf │ ├── supervisord.conf │ └── supervisord.conf.original └── venv ├── bin │ ├── activate │ ├── activate.csh │ ├── activate.fish │ ├── activate_this.py │ ├── easy_install │ ├── easy_install-2.7 │ ├── pip │ ├── pip2 │ ├── pip2.7 │ ├── python │ ├── python2 -> python │ └── python2.7 -> python ├── include │ └── python2.7 -> /usr/include/python2.7 ├── lib │ └── python2.7 └── local ├── bin -> /a/path/venv/bin ├── include -> /a/path/venv/include └── lib -> /a/path/venv/lib
supervisor.conf(部分)
[program:app-channels] process_name=%(program_name)s-%(process_num)s directory=/a/path/chnservices/ command=/a/path/venv/bin/python2.7 /a/path/chnservices/channels.py --port=%(process_num)s numprocs=2 numprocs_start=8001 ;umask=022 ;priority=999 autostart=true startsecs=2 ;startretries=3 ;autorestart=unexpected ;exitcodes=0,2 ;stopsignal=QUIT ;stopwaitsecs=10 ;stopasgroup=false ;killasgroup=false user=www-data redirect_stderr=true stdout_logfile=/var/log/nginx/chn_stdout.log ;stdout_logfile_maxbytes=1MB ;stdout_logfile_backups=10 ;stdout_capture_maxbytes=1MB ;stdout_events_enabled=false stderr_logfile=/var/log/nginx/chn_stderr.log ;stderr_logfile_maxbytes=1MB ;stderr_logfile_backups=10 ;stderr_capture_maxbytes=1MB ;stderr_events_enabled=false ;environment=A="1",B="2" ;serverurl=AUTO
channels.py
import tornado.ioloop import tornado.web from tornado.options import define, options define("port", default=8006, help="run on the given port", type=int) class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": tornado.options.parse_command_line() # tornado.options.parse_config_file("/etc/chnservices.conf") print 'port:',options.port app = make_app() app.listen(options.port) tornado.ioloop.IOLoop.current().start()
nginx.conf(tornado推荐配置修改)
user www-data; 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:8001; server 127.0.0.1:8002; } 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; proxy_next_upstream error; server { listen 8000; # Allow file uploads client_max_body_size 50M; location ^~ /static/ { root /var/www/tornado/; 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做进程管理,使用Nginx做反向代理;supervisor可以使用源码安装和yum安装(CentOS),使用pip安装和源码安装是一样的道理:
sudo pip install supervisor
supervisor默认会从(/usr/local/etc/supervisord.conf, /usr/local/supervisord.conf, supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf)寻找配置文件,为了方便,我们生成配置文件并修改后,链接到/etc/supervisord.conf。
生成配置文件:
echo_supervisord_conf > /a/path/etc/supervisord.conf
按示例修改,修改后链接到指定位置:
sudo ln -s /a/path/etc/chnservices.conf /etc/chnservices.conf
将Nginx配置文件修改后链接到默认位置:
sudo ln -s /a/path/etc/nginx/nginx.conf /etc/nginx/nginx.conf
使Nginx中设置的静态目录与项目的静态目录保持一致:
ln -s /a/path/chnservices /var/www/tornado
启动supervisor:
sudo supervisord -c /etc/supervisord.conf sudo supervisorctl start all sudo supervisorctl reload all sudo supervisorctl restart all
此时,浏览器访问http://127.0.0.1:8001/和http://127.0.0.1:8002/应该就可以看到“Hello, world”了.
启动nginx:
sudo service nginx restart
此时,浏览器访问http://127.0.0.1:8000/就可以看到从tornado经nginx的“Hello, world”了.
添加开机启动:
tornado代码遇到异常退出时supervisor会自动重新启动我们的python代码,但是现在supervisor不是开机启动的,编辑/etc/rc.local, 在exit 0之前添加sudo supervisord即可。