• 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即可。

  • 相关阅读:
    Java的字符串及格式化输入输出
    Java的数据类型与类型转换
    java基本程序
    svn基础入门
    github基础入门笔记
    git基础入门笔记
    linux基础入门笔记
    二、FreeMarker 模版开发指南 第二章 数值和类型
    【CodeForces】[599B]Spongebob and Joke
    【CodeForces】[612B]HDD is Outdated Technology
  • 原文地址:https://www.cnblogs.com/hubery/p/5164222.html
Copyright © 2020-2023  润新知