Nginx + tornado + supervisor deployment

Keywords: Nginx supervisor sudo Python

Reference link: supervisor + Tornado + Nginx usage detailsUsing 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.

Posted by quercus on Tue, 05 May 2020 07:25:07 -0700