前言:

  • 在python2环境启动supervisor拉起其它虚拟环境中的程序,不必担心跨虚拟环境的依赖问题
  • uwsgi不建议用root用户运行,文中以非root用户运行
  • uwsgi与supervisor配置项很多,用法也多,文中示例只是基础用法,读者自行配置以适合习惯和保障安全
  • 按本文示例,如果flask项目运行有权限错误,根据实际情况更改目录/文件权限或属主/属组

1. 试验环境

  • Debian8
  • 域名有SSL证书
  • flask/uwsgi均安装于python3虚拟环境中
  • supervisor安装于python2虚拟环境中

2. 安装python3.6.5

不用多说,可以下编译安装,
不需要自定义图省事可用网上大佬的一键脚本

3. 安装pipenv虚拟环境工具

pipenv与virtualenv,都可以管理虚拟环境,但个人用起来觉得更简单方便一点,参见Requests库作者另一神器Pipenv的用法

pip3 install pipenv

4. 安装nginx

不用多说,可以下编译安装,也可以用lnmponeinstack等安装脚本

———-以下操作均以非root用户进行———-

5. 上传flask项目

比如上传到/home/newuser/flaskapp

6. 创建python3虚拟环境用于flask项目

cd /home/newuser/flaskapp
pipenv --python 3

7. 接上一步,在python3虚拟环境中安装配置uwsgi

pipenv shell
pip3 install uwsgi

编辑uwsgi.ini配置文件,本文选择放在/home/newuser/flaskapp/目录下

[uwsgi]
socket = 127.0.0.1:8000 
chidir = /home/newuser/flaskapp
# flask项目的运行文件 
wsgi-file = run.py 
callable = app

这里有个坑:
flask的python程序(run.py)最后如果象下面这样来启动,用”python run.py”执行没有问题,但是在上面配置里用uwsgi来启动,则会卡住;有意思的是如果此时按一下Ctrl+c,会跳过卡住的地方,程序正常运行.

app.run()

这样写来启动就是不卡住

if __name__ == '__main__':
    app.run()

8. 在nginx配置中设置uwsgi

假设在此配置前nginx作为服务已经能正常使用,在location/项里象这样写

location / {                                                                                            
            include      uwsgi_params; 
            # 端口与上面uwsgi.ini里的端口一致                                                                         
            uwsgi_pass   127.0.0.1:8000;
            # 虚拟环境里python程序路径
            uwsgi_param UWSGI_PYHOME /home/fort/.local/share/virtualenvs/flaskapp/bin;                       
            uwsgi_param UWSGI_CHDIR  /home/newuser/flaskapp;                                                  
            uwsgi_param UWSGI_SCRIPT run:app;                                                                   
        }

对于新手,这里也有个坑:
因为已经用flask来路由route网址,nginx里的其它location段,除非确信有必要,否则视情况就不要写了,否则可能会冲突出错

9. 创建python2虚拟环境并安装supervisor

mkdir /home/newuser/py2env
cd /home/newuser/py2env
pipenv --python 2
pipenv shell
pipenv install supervisor

10. 配置并启动supervisor

从模板恢复标准配置文件

echo_supervisord_conf > /home/newuser/supervisord.conf

编辑以上文件加入待守护程序

[program:flaskapp]
# 在python3虚拟环境中安装的uwsgi的路径+uwsgi配置文件
command=/home/newuser/.local/share/virtualenvs/flaskapp/bin/uwsgi --ini /home/newuser/flaskapp/uwsgi.ini
directory=/home/newuser/flaskapp
autostart = true
autorestart=true
tartsecs = 5
stopwaitsecs=5
startretries = 3
user=newuser
stdout_logfile=/home/newuser/supervisord_stdout.log
stderr_logfile=/home/newuser/supervisord_stderr.log

启动supervisor
现在的情况是supervisord安装在python2虚拟环境中,flask及其程序及uwsgi在python3虚拟环境中

用supervisord守护程序正确步骤是
* 进入python3虚拟环境
* 用python2虚拟环境中supervisord的绝对路径来启动
* 不需要进入python2虚拟环境

/home/fort/.local/share/virtualenvs/fortpy2env/bin/supervisord -c /home/fort/fortpy2env/supervisord.conf


## 参考
Debian部署python3+flask+uwsgi+Nginx+Supervisor
https://juejin.im/post/5a040e5cf265da432b4a455b

阿里云部署 Flask + WSGI + Nginx 详解
https://www.cnblogs.com/Ray-liang/p/4173923.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注