flask部署
1. 基本环境
- 操作系统:centerOS 8.0
- python 3.6.8
- flask 1.1.2
- uwsgi 2.0.19.1
- nginx 1.14.1
2. 创建虚拟环境
项目路径为:/root/usr/local/pywkplace/helloFlask03,进入项目根目录中,创建虚拟环境:
[root@bill helloFlask03]# virtualenv flask
激活虚拟环境:
[root@bill helloFlask03]# source flask/bin/activate
(flask) [root@bill helloFlask03]#
...
如何需要退出虚拟环境:执行deactivate即可
下载flask:
pip3 install flask
pip3 freeze可以查看所有下载的Python库
安装好uwsgi和nginx,未安装的请执行
pip3 install uwsgi
yum install nginx
查看版本:
uwsgi --version
nginx -V
3. 编写Flask helloWorld
创建helloWorld.py文件:
(flask) [root@bill helloFlask03]# touch helloWorld.py
编辑helloWorld.py文件:
(flask) [root@bill helloFlask03]# vim helloWorld.py
vim基本操作:i编辑模式,ggVG全选,y复制,p粘贴,d删除,0行首,$行尾。
编辑得到以下代码:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def helloWorld():
return "<h1 style='color:blue'>Hello World!</h1>"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=443, debug=True)
运行helloWorld.py文件:
(flask) [root@bill helloFlask03]# python3 helloWorld.py
在浏览器中打开你的公网ip地址:
4. 配置uwsgi和nginx
可以发现上面直接在程序中给他ip和端口就能直接在web中访问,这是因为flask自带了一个简单的web服务器,但是在生产环境中,这个测试版的服务器是满足不了性能的需求的。
- uWSGI是一个基于自有的uwsgi协议、WSGI协议和http服务协议的web网关。那么在python中,uWSGI实现了uwsgi和WSGI两种协议的Web服务器,负责响应python的web请求。
- nginx是常用的代理服务器,加上安全性和其他限制,可以达到保护程序的作用。而uWSGI本身时内网接口,开启多个work和precesses可能也不够用,而nginx可以代理多态uWSGI完成负载均衡。
配置uwsgi.ini文件:
(flask) [root@bill helloFlask03]# touch uwsgi.ini
(flask) [root@bill helloFlask03]# vim uwsgi.ini
内容:
[uwsgi]
socket=0.0.0.0:443
# 项目根目录
base=/root/usr/local/pywkplace/helloFlask03
# flask 启动app的名字
app=helloWorld
chdir=%(base)
module=%(app)
# 虚拟环境
home=%(base)/flask
pythonpath=%(base)
master=true
processes=2
workers=2
chmod-socket=644
# helloWorld app.run()返回
callable=app
# 运行log文件
logto=%(base)/uwsgi443.log
创建log文件:
(flask) [root@bill helloFlask03]# touch uwsgi443.log
配置nginx.conf:
首先需要找到nginx.conf,使用命令:whereis nginx,然后ls文件夹里面的内容,即可找到conf文件。
进入nginx.conf编写一下内容:
(flask) [root@bill helloFlask03]# vim /etc/nginx/nginx.conf
修改server
server {
listen 80 default_server;
server_name 0.0.0.0;
location / {
include uwsgi_params;
uwsgi_pass 0.0.0.0:443;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
修改helloWorld.py,即把app.run里面的host和port配置全部删掉即可。之后,因为前面运行过python3 helloWorld.py,虽然终止了进程,但是还是存在僵尸进程,就会一直占用443端口,因此还需要强制杀死进程,精准的杀死:首先lsof -i:443,找到进程ip,然后kill -9 进程ip;懒人的做法:killall -9 python3。
执行运行命令:
(flask) [root@bill helloFlask03]# uwsgi --ini uwsgi.ini & /usr/sbin/nginx
输入公网ip,注意不用加端口(默认80端口)运行成功:
与前面相对比,发现这里不用加端口,也就是80端口,前一次运行指定了443端口,而这里不用,说明nginx起到了作用,在server配置中,明确指出了代理端口是80端口,所以直接80端口即可访问web。
5. 参考文献
uwsgi+nginx项目部署
Pyblog software
关于nginx配置出现错误 [emerg] open() “/usr/local/var/run/nginx.pid” failed (13: Permission denied)]