Reference link: supervisor + Tornado + Nginx usage details, Using tornado, supervisor, nginx website, Official documents of tornado
https://blog.csdn.net/tengzhaorong/article/details/12833157
Project document tree:
. ├── 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 (partial)
[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 recommended configuration Modified)
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; } } }
Installation:
Use supervisor for process management and Nginx for reverse agent; supervisor can use source installation and yum installation (CentOS), and pip installation and source installation are the same:
sudo pip install supervisor
By default, supervisor will look for configuration files from (/ usr / local / etc / supervisor.conf, / usr / local / supervisor.conf, supervisor.conf, etc / supervisor.conf, / etc / supervisor.conf). For convenience, we will generate configuration files and modify them, and link to / etc / supervisor.conf.
Build profile:
echo_supervisord_conf > /a/path/etc/supervisord.conf
Modify according to the example, and link to the specified location after modification:
sudo ln -s /a/path/etc/chnservices.conf /etc/chnservices.conf
Link the modified Nginx configuration file to the default location:
sudo ln -s /a/path/etc/nginx/nginx.conf /etc/nginx/nginx.conf
Make the static directory set in Nginx consistent with the static directory of the project:
ln -s /a/path/chnservices /var/www/tornado
Start supervisor:
sudo supervisord -c /etc/supervisord.conf sudo supervisorctl start all sudo supervisorctl reload all sudo supervisorctl restart all
At this time, the browser can see "Hello, world" by visiting http://127.0.0.1:8001/ and http://127.0.0.1:8002 /
Start nginx:
sudo service nginx restart
At this time, the browser can visit http://127.0.0.1:8000/ to see "Hello, world" from tornado via nginx
Add boot:
When tornado code encounters an exception and exits, supervisor will automatically restart our python code, but now supervisor is not started, just edit / etc/rc.local and add sudo supervisor before exit 0.