Debian9部署python3:flask+uwsgi+Nginx+supervisor(旧)-请前往主页查看最新

1,032 阅读7分钟
  • 经过浏览网上大量文章与查阅相关文档和亲自测试最终写下这篇文章。
  • 系统:Debian9 x64
  • python版本:python3.5+
  • 使用root进行安装配置-可以省去sudo的麻烦。

一、获取最新的软件包/升级已安装的所有软件包

  • apt-get update
  • apt-get upgrade

二、安装:pip3(Debian9系统自带python3.5)

  • apt-get install python3-pip

三、安装:python虚拟环境 即:virtualenv

  • pip3 install virtualenv

四、安装:Nginx

  • apt-get install nginx

五、安装:uwsgi(注意用的pip3而且不需要安装在虚拟环境中)

  • pip3 install uwsgi

六、创建一个虚拟环境 即:virtualenv

  • 用于调试所以先不使用真正项目中的包 requirements.txt
  • 在srv下创建一个虚拟环境
  • cd /srv
  • 查看python3路径
  • which python3
  • 创建虚拟环境指向查出来的路径/usr/bin/python3跟上环境名称(名称可以随便取)flask-env
  • virtualenv -p /usr/bin/python3 flask-env
  • 进入虚拟环境安装flask因为调试需要用到
  • . flask-env/bin/activate
  • pip install flask (在虚拟环境中无论是py2还是py3用的时候都是用pip)
  • deactivate(安装成功后退出)
  • 在srv下创建一个项目(调通之后用生产的项目替换即可)
  • mkdir myproject

七、创建一个flask项目做调试(调试成功后再从Git或Svn等仓库拉项目)

  • cd /myproject
  • vim run.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def helloWorld():
    return "Hello World"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  • 保存并退出:esc : wq

八、测试一下Nginx

  • 启动:Nginx
  • service nginx start
  • 在浏览器中访问ip+80端口 如:59.12.32.4:80
  • 出现以下页面表示成功

九、使用:uwsgi启动项目

  • 在项目根目录创建uwsgi配置文件.ini:文件名称随便取我取名:test.ini
  • cd /srv/myproject/
  • vim test.ini
  • chdir:项目的路径
  • module:模块:启动文件的名称不需要加上.py
  • home:python的虚拟环境路径
  • master:是否启用mater模式
  • processes:进程数(根据你服务器的配置去设定)
  • socket:socket文件地址用于与Nginx进行通讯(不需要手动创建·只需设置)
  • wsgi-file:wsgi文件(相当于flask的启动文件run.py)
  • callable:wsgi文件中的app变量(也就是flask的实例)
  • chmod-socket:
  • plugins:调用python35 插件
  • log-maxsize:以固定的文件大小(单位KB),切割日志文件。 例如:log-maxsize = 50000000 就是50M一个日志文件
  • disable-logging:不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。
  • pidfile:指定pid文件的位置,记录主进程的pid号(此项可以不配置)
  • vacuum:当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)(此项可以不配置)
[uwsgi]
chdir           = /srv/myproject
module          = run
home            = /srv/flask-env
master          = true
processes       = 10
socket          = /srv/myproject/myproject.sock
wsgi-file       = /srv/myproject/run.py
callable        = app
chmod-socket    = 666
plugins 	= python35

log-maxsize     = 50000000
disable-logging = true
pidfile         = /tmp/uwsgi.pid
vacuum          = true
  • 保存退出
  • 由于需要与Nginx进行通信才能启动,接下来我们配置Nginx。

十、配置:Nginx

  • 在以下路径下创建配置文件(名字可以随便取)这里我取名:myproject.conf
  • 如果需要使用Nginx代理多个项目就创建多个配置文件(不一样的端口)
  • cd /etc/nginx/conf.d/
  • vim myproject.conf
  • upstream myproject:同一台服务器之间的请求转化,使用套接字方式通信。配置nginx与uwsgi的通信方式和名称.名称为:myproject 即 项目的名称
  • server unix:///srv/okc/okc.sock;:nginx使用socket的方式与uwsgi进行通信,指向项目目录下的cocket文件 即 上面uwsgi配置的.sock(不需要手动创建·只需设置.运行时自动创建)
  • listen:监听的端口(配置完之后需要打开该端口否则无法访问)
  • server_name:IP地址或者域名
  • charset:编码
  • client_max_body_size:最大的上传
  • uwsgi_pass:需要与upstream的一致 即 myproject
  • include:参数文件
upstream myproject {
        server unix:///srv/myproject/myproject.sock;
}
server {
	listen      8099;
	server_name 66.42.100.165;
	charset     utf-8;
	client_max_body_size 75M;
	location / {
		uwsgi_pass myproject;
		include         /etc/nginx/uwsgi_params;
	}
}
  • 保存并退出
  • 验证配置文件是否正常使用以下命令
  • nginx -t 或者 service nginx configtest
  • 出现以下提示证明配置已经ok了

  • 别忘记打开你所配置的端口号
  • iptables -A INPUT -p tcp --dport 8099 -j ACCEPT
  • 如果你想关闭它
  • iptables -A INPUT -p tcp --dport 8099 -j DROP
  • 重启以下Nginx
  • service nginx restart

十一、启动项目

  • 进去项目目录
  • cd /srv/myproject/
  • 启动项目
  • uwsgi --ini test.ini
  • 打开浏览器输入IP+端口号 例子如下
  • 66.42.100.165:8099
  • 到了这里我们的项目部署是完成了。接下来我门使用supervisor来管理它。
  • 先把uwsgi所有进程先停止
  • Ctrl + c

十二、supervisor

ps:这个真的是深坑,网上的教程都Tm缺斤少两各种不通,本人查阅大量文章-文档与调试,断断续续花费近两周时间-最终得出以下配置方式,希望大伙伴认真阅读并且跟着操作操作。


  • supervisor:是一个python2写的linux下管理进程的工具。
  • 分为:服务端:supervisord启动进程,与客户端:supervisorctl管理进程。
  • 首先安装pip(虽然说它是python2写的但是使用起来并没有什么关系。因为supervisor还可以管理非python的项目进程)
  • apt-get install supervisor
  • cd /etc/supervisor/

  • supervisord.conf:是主配置文件
  • conf.d:是存放每一个项目配置文件的地方(每一个被管理的项目都需要一个配置文件存在在这里面)如果想改变配置文件存放的路径需要在supervisord.conf的[include]中修改。一般来说不需要修改。
  • 创建配置文件 cd /etc/supervisor/conf.d
  • vim myproject.conf 名字随便取
  • [program:myproject]:应用程序的名字(但是这个不是规定的只是一个标示.当然你也可以随便取.开心就好)
  • command:启动方式 即 uwsgi --ini myproject.ini
  • directory:项目的目录
  • startsecs:开始时候等待多少秒
  • stopwaitsecs:停止的时候等待多少秒
  • startretries:启动失败重复次数
  • autostart:自动开始(启动supervisor时启动该项目)
  • autorestart:程序挂了自动重启
  • stdout_logfile:输出log
  • stderr_logfile:输出错误的log
  • user:使用那个用户启动
  • stdout_logfile_maxbytes:日志文件最大大小
  • stdout_logfile_backups:日志文件备份数
  • environment:该子进程的环境变量,和别的子进程是不共享(使用该命令查看环境变量:which python3)
  • redirect_stderr:为true的话,stderr的log会并入stdout的log里面,默认为false
  • stopasgroup:主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。需要注意的是,该选项发送的是stop信号,默认为false
  • killasgroup:和上面的stopasgroup类似,不过发送的是kill信号。
[program:myproject]
command         = uwsgi --ini /srv/myproject/test.ini
directory       = /srv/myproject
startsecs       = 0
stopwaitsecs    = 0
startretries    = 3
autostart       = true
autorestart     = true
stdout_logfile  = /srv/myproject/super_log/supervisord.log
stderr_logfile  = /srv/myproject/super_log/supervisord.err
user            = root 
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
environment=PYTHONPATH = "/usr/bin/python3"
redirect_stderr = false
stopasgroup     = false
killasgroup     = false
  • 创建supervisord日志目录
  • cd /srv/myproject
  • mkdir super_log
  • 让配置文件生效-重启-查看状态。
  • supervisorctl update
  • supervisorctl reload
  • supervisorctl status

  • 出现以上~项目已经启动
  • 最后:配置supervisorctl的web可视化管理进程
  • cd /etc/supervisor/
  • vim supervisord.conf
  • 按shift+G 跳至末尾添加
  • port:IP和绑定端口
  • username:管理员名称
  • password:管理员密码
  • 如果不需要密码可以注释在最前面机上;号
  • ;username = user
  • ;password = 666666
 [inet_http_server]
 port = IP:9001   
 username = user 
 password = 666666
  • 让配置文件生效-重启
  • supervisorctl update
  • supervisorctl reload
  • 注意:如果出现error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.py line: 228不要慌重启一下服务器继续执行以上的update和reload
  • 最后打开9001端口
  • iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
  • 用浏览器启动ip+9001端口(如果设置了账号密码就输入)

  • 如果想在服务器启动或重启让supervisor(相当于你的项目也一起启动)启动
  • cd /etc/rc.local
  • 在这个配置文件的 exit 0 前面一行加上service supervisor start保存!

十三、建议

  • 先开个虚拟机来操作,跟我步骤操作一次全部跑同再上项目。

如果大家有什么问题可以评论附上问题哟!

  • QQ-微信同号:417993207
  • 喜欢的可以点个赞-打赏一下支持支持~谢谢!