参考链接:supervisor + Tornado + Nginx 使用详解, 用tornado ,Supervisord ,nginx架网站, tornado官方文档
https://blog.csdn.net/tengzhaorong/article/details/12833157
项目文档树:
.
├── 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即可。