flask+nginx+gunicorn+supervisor的框架体系构建一个服务

查看端口号是不是被占用

netstat -anp | grep 8080
复制代码

查看应用的进程

ps aux|grep nginx
复制代码

flask部分

  • flask部分
    • 首先flask写服务的部分略去(和业务相关)

gunicorn部分

  • gunicorn部分

    • 首先我们的flask项目的启动方式是:

      • app.run(host="0.0.0.0",use_reloader=True, port=5000)
        复制代码
    • 我们使用gunicorn进行启动的话,不用写端口号,可以使用gunicorn设置启动的端口号

      • # flask服务的启动方式变成
        app.run(debug=False)
        复制代码
      • 使用gunicorn进行启动

        • # 原始命令 worker 4 线程是4个
          gunicorn -w 4 manage:app
          复制代码
        • # 当我们的app是使用工厂函数构建的时候
          gunicorn -w 4 "my_project:create_app()"
          复制代码
    • 完成上面的步骤,即可使用gunicorn完成flask的启动

supervisor部分

  • supervisor部分

    • 主要是完成gunicorn的配置

      • 我们使用四个进程(每个进程四个线程)通过gunicorn对flask进行启动

      • [program:gunicorn]
        command=gunicorn -w 4 "manage:create_app()" -b :8091
        directory=/home/a21036/waws/PaddleOCR
        priority=1
        numprocs=1
        autostart=true
        autorestart=true
        startretries=10
        exitcodes=0
        stopsignal=KILL
        stopwaitsecs=10
        redirect_stderr=true
        
        [program:gunicorn_1]
        command=gunicorn -w 4 "manage:create_app()" -b :8092
        directory=/home/a21036/waws/PaddleOCR
        priority=1
        numprocs=1
        autostart=true
        autorestart=true
        startretries=10
        exitcodes=0
        stopsignal=KILL
        stopwaitsecs=10
        redirect_stderr=true
        
        [program:gunicorn_2]
        command=gunicorn -w 4 "manage:create_app()" -b :8093
        directory=/home/a21036/waws/PaddleOCR
        priority=1
        numprocs=1
        autostart=true
        autorestart=true
        startretries=10
        exitcodes=0
        stopsignal=KILL
        stopwaitsecs=10
        redirect_stderr=true
        
        [program:gunicorn_3]
        command=gunicorn -w 4 "manage:create_app()" -b :8094
        directory=/home/a21036/waws/PaddleOCR
        priority=1
        numprocs=1
        autostart=true
        autorestart=true
        startretries=10
        exitcodes=0
        stopsignal=KILL
        stopwaitsecs=10
        redirect_stderr=true
        复制代码
      • 我们的supervisor没有启动就使用下面命令启动

        • supervisord -c /usr/supervisor/supervisor.conf
          复制代码
      • 若我们已经启动了supervisor,我们使用下面的命令来启动

        • supervisorctl
          start gunicorn
          start gunicorn_1
          start gunicorn_2
          start gunicorn_3
          复制代码
        • supervisorctl
          start all
          复制代码

nginx部分

  • nginx部分

    • 主要是考虑程序的并发性,对启动的四个服务,进行负载均衡

      • 在/etc/nginx/cond.d中新建两个文件,upstream.conf 控制分发的文件 backend.conf 实际的监听端口实现操作的配置

        • upstream.conf

          • upstream backends {
                 server localhost:9001;
                 server localhost:9002;
                 server localhost:9003;
                 server localhost:9004;
            }
            server {
                 listen 80;
                 location / {
                 proxy_pass http://backends;
             } }
            复制代码
        • backend.conf

          • server {
                 listen localhost:9001;
            
                 location ^~ /static/ {
                    alias /home/a21036/static/;
                    autoindex on;
                 }
                 location = /upload {
            
                    proxy_pass http://localhost:8091/upload;
                    proxy_redirect off;
            
                    proxy_set_header Host $http_post;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
                 location =/ {
                     proxy_pass http://localhost:8091/;
                     proxy_redirect off;
            
                     proxy_set_header Host $http_post;
                     proxy_set_header X-Real-IP $remote_addr;
                     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
            }
            
            server {
                 listen localhost:9002;
            
                 location ^~ /static/ {
                    alias /home/a21036/static/;
                    autoindex on;
                 }
                 location = /upload {
            
                    proxy_pass http://localhost:8092/upload;
                    proxy_redirect off;
            
                    proxy_set_header Host $http_post;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
                 location =/ {
                     proxy_pass http://localhost:8092/;
                     proxy_redirect off;
            
                     proxy_set_header Host $http_post;
                     proxy_set_header X-Real-IP $remote_addr;
                     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
            }
            
            server {
                 listen localhost:9003;
            
                 location ^~ /static/ {
                    alias /home/a21036/static/;
                    autoindex on;
                 }
                 location = /upload {
            
                    proxy_pass http://localhost:8093/upload;
                    proxy_redirect off;
            
                    proxy_set_header Host $http_post;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
                 location =/ {
                     proxy_pass http://localhost:8093/;
                     proxy_redirect off;
            
                     proxy_set_header Host $http_post;
                     proxy_set_header X-Real-IP $remote_addr;
                     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
            }
            
            server {
                 listen localhost:9004;
            
                 location ^~ /static/ {
                    alias /home/a21036/static/;
                    autoindex on;
                 }
                 location = /upload {
            
                    proxy_pass http://localhost:8094/upload;
                    proxy_redirect off;
            
                    proxy_set_header Host $http_post;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
                 location =/ {
                     proxy_pass http://localhost:8094/;
                     proxy_redirect off;
            
                     proxy_set_header Host $http_post;
                     proxy_set_header X-Real-IP $remote_addr;
                     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
            }
            复制代码
        • 在这个地方犯了一个严重的错误:

          • server {
                 listen localhost:8094;   # 错误根源
            
                 location ^~ /static/ {
                    alias /home/a21036/static/;
                    autoindex on;
                 }
                 location = /upload {
            
                    proxy_pass http://localhost:8094/upload;
                    proxy_redirect off;
            
                    proxy_set_header Host $http_post;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
                 location =/ {
                     proxy_pass http://localhost:8094/;
                     proxy_redirect off;
            
                     proxy_set_header Host $http_post;
                     proxy_set_header X-Real-IP $remote_addr;
                     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                 }
            }
            复制代码
          • 实际的错误原因:我们使用supervisor进行将gunicorn进行启动,启动了8094的服务,然后在使用nginx进行listen监听8094,会出现端口被占用的问题,我已我们需要用其他端口对8094进行监听,这里使用9004对8094进行监控

    • 我们的nginx没有启动就使用下面命令启动

      • systemctl start nginx
        复制代码
    • 若我们已经启动了nginx,我们使用下面的命令来reload配置文件

      • # 检测我们的nginx的配置语法是不是有问题
        /usr/sbin/nginx -t
        
        # 重载配置文件
        /usr/sbin/nginx -s reload
        复制代码

其他部分

  • 其他:

    • 当我们对配置出现问题的时候,我们可以通过配置文件中指定的log的位置,找到log,查看log就能找到问题所在了,以下以nginx的日志为例

    • # 查看方式1
      tail -F xxxx.log    # 新生成的日志以滚动的方式进行查看
      
      # 查看方式2
      vim xxxx.log       # 全量查看日志
      复制代码
    • nginx又两个主要日志放在/var/log/nginx

      • access.log
        • image-20210709105321582.png
      • error.log
        • 我们可以看到之前端口占用的配置错误
        • image-20210709105712179.png
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享