Gunicorn+nginx+supervisord部署Flask项目记录

环境介绍

系统:Ubuntu 18.04 LTS
Python:3.6.8

安装三件套

$ pip3 install gunicorn supervisor
$ sudo apt install nginx

配置nginx

Ubuntu下的nginx配置文件放在这个位置:/etc/nginx/sites-enabled/default

$ sudo vim /etc/nginx/sites-enabled/default
# 修改为下面内容(其他配置内容统统删掉)
server {
    listen       80;
    server_name  localhost;
    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_redirect off;
        proxy_set_header Host $host:80;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
$ sudo systemctl restart nginx	# 重启nginx服务

配置supervisord

$ echo_supervisord_conf > ~/supervisord.conf	# 生成supervisord的配置文件
$ vim ~/supervisord.conf

在配置文件最底部追加下面内容:

[program:wenming]
directory = /home/lpwm/web/wenming_vue
command = gunicorn -w 4 -b 0.0.0.0:5000 app:app

配置参数说明

program后面是应用的名称,自己定义
directory是flask应用的根目录,我这里flask项目的主入口文件为app.py,所以下面的命令最后的参数用到了app:app
冒号前的app即app.py,冒号后的app代表实例化的flask对象名称
-w 4表示使用4个线程
0.0.0.0:5000所有本地的网络地址均使用5000端口提供服务
这里需要注意,使用非系统root账户由于权限原因,不能绑定80之类的小端口号,就用默认的5000就行,80端口后面由nginx提供
执行下面命令测试一下:

$ supervisord -c ~/supervisord.conf

运行成功后使用浏览器直接访问服务器地址或者加上5000端口号均可以打开flask开发的web程序

配置开机自动启动

Ubuntu中修改/etc/rc.d/rc.local实现开机启动

$ sudo vim /etc/rc.d/rc.local
# 这个文件是不存在的,插入下面内容后保存退出:
supervisord -c ~/supervisord.conf
$ sudo chmod +x /etc/rc.local

故障处理

服务跑起来内网访问是没问题了,把服务器在防火墙设备上做了NAT转换映射给公网IP+端口后发现从外网访问只能打开首页,登录无法正常跳转到下个页面。
nginx跑的内网服务地址:10.x.x.x:80
防火墙NAT映射后的公网地址:218.x.x.x:60001
用Firefox查了下调试器中的网络,发现首页的登录界面点击登录按钮后跳转的地址没有了60001端口号,当然也就走不动了。
原来是之前nginx配置的时候这一行出的问题:
proxy_set_header Host $host:80;
应该修改为NAT后的端口:
proxy_set_header Host $host:60001;
重启一下nginx,再从公网访问,OJBK~

更新uwsgi+nginx部署

使用gunicorn发现存在个问题,应该是项目中没有考虑到多线程之间的通信共用变量的情况,在gunicorn中如果设置-w 4使用4个worker启动后,貌似每个worker之间的session是独立的,所以出现了直接python app.py跑一点问题都没有,但是用gunicorn -w 4 -b 0.0.0.0:5000 app:app这种方式跑就老出问题,试了下如果改成-w 1也没事儿.不过这样的话就失去用gunicorn的意义了嘛~
记录一下用uwsgi实现的步骤,nginx配置部分和上面一样,不用改

# 装轮子
$ pip3 install uwsgi
# 写配置
$ vim uwsgi.ini

配置部分内容自己看着改

[uwsgi]
http = 127.0.0.1:5000
chdir = /home/lyzy/server
module = app:app
processes = 4
master = true
threads = 2
daemonize = /home/lyzy/server/uwsgi.log
pidfile = /home/lyzy/server/uwsgi.pid

跑起来

$ uwsgi --ini uwsgi.ini
发布了181 篇原创文章 · 获赞 82 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/lpwmm/article/details/102759223