背景
Flask应用开发成,部署到服务器。首先,查找了各种方法、资料,网上方法教程很多,以下内容是真实操作,比较详细,留作以后备用。
准备工作
名称 | 参数 |
系统 | Centos7 |
Python | Python3 (Ancona3 也行) |
Nginx | 1.17.8,其他版本也行,版本不要太老就行 |
为了方便操作说明,可以用最简单的项目进行测试,如下: |
部署方式有2种
第一种,命令行方式,也是最简单的方式。
此方式适合开发测试,因为有命令行交互,可以发现很多问题,便于调试。
python3 xxx.py
第二种,Flask + Nginx + uwsgi。
当然,Flask+uwsgi也能完成部署,想要了解详细的,以及为啥不推荐这样,可以百度深入学习一下,这方面资料很多。
安装 Nginx
可以参考这篇文章:
CentOS7中安装Nginx
https://www.jianshu.com/p/5a6b2151da95
安装uwsgi
注意:安装之前要先安装依赖环境,否则报错,如下图
安装依赖:
yum -y install gcc
yum -y install python3-devel
pip3 install uwsgi
创建test.py 文件,内容为
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
uwsgi常用命令
# uwsgi --ini uwsgi.ini # 启动
# uwsgi --reload uwsgi.pid # 重启
# uwsgi --stop uwsgi.pid # 关闭
uwsgi 基础配置
在web部署目录,创建一下几个文件:touch uwsgi.ini
touch uwsgi.pid
touch uwsgi.log
touch uwsgi.status
其他文件无需编辑,只用编辑ini文件即可,如下:
uwsgi.ini
[uwsgi]
socket=192.168.4.22:88 #你的机器的IP地址:web服务的端口(自定义,非flask run中的端口)
pythonpath=/webDir/web/dailywork # 你的web程序部署路基,注意,写到根目录即flask主文件所在
module=dailyRepo # 你定义的flask module名字,不能乱写,与代码中名字保持一致。
wsgi-file=/webDir/web/dailywork/dailyRepo.py # 你代码主程序
callable=app # 看截图吧
processes=1 #进程数,这个看你服务器是几核CPU了
threading=3 # 线程数,这两个值相乘就是服务器承载能力了
daemonize=/webDir/web/dailywork/uwsgi.log # 建议与uwsgi.ini在同一个目录,方便管理
stats=/webDir/web/dailywork/uwsgi.status # 建议与uwsgi.ini在同一个目录,方便管理
pidfile=/webDir/web/dailywork/uwsgi.pid # 建议与uwsgi.ini在同一个目录,方便管理
Nginx 配置
server {
listen 82;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass IP地址:端口; #uwsgi.ini 文件中的IP与端口
uwsgi_param UWSGI_CHDIR /webDir/web/dailywork; #与uwsgi.ini 中pythonpath 路径保持一致
uwsgi_param UWSGI_SCRIPT dailyRepo:app; # 同上,与ini文件中 保持一致
}
}
配置完成,重启Nginx。/usr/local/nginx/sbin/nginx -s reload
完成
注意
- CentOS要关闭防火墙,或者 将web端口加入防火墙列表,否则无法访问。
- 首次运行时,建议先通过命令行,执行查看是否有缺失的组件,及时安装。
如下:根据报错安装 pymsql即可
python3 dailyRepo.py
Traceback (most recent call last):
File "dailyRepo.py", line 6, in <module>
from Tools import mysqlOperation as mysql
File "/webDir/web/dailywork/Tools/mysqlOperation.py", line 1, in <module>
import pymysql
ModuleNotFoundError: No module named 'pymysql'
- 后期有更改,通过
uwsgi --reload uwsgi.pid
重启即可 - 很多组件需要root权限,建议安装时用root。