文章目录
前言
近期用uwsgi+nginx在虚拟环境部署了flask的项目,于是做了这篇文章作为一个回顾,并在最后讲出遇到的一些坑
我用的环境是centos7,python版本为3.7.8
一、虚拟环境
1.安装并创建虚拟环境
pip install virtualenv
(安装完成后创建虚拟环境)
virtualenv -p /usr/local/python/bin/python3.7 venv
!!注意,我这里的-p是切换到当前项目目录下,如果没切换到项目的目录下注意修改, venv为虚拟环境的名字用的是python3.7的环境
如果不知道python环境在哪,可以用whereis python 查看
2.激活虚拟环境
source venv/bin/activate
关闭虚拟环境的命令:deactivate
二、安装uwsgi
安装完成后查看uwsgi自带的版本
二、配置uwsgi
在项目路径下创建uwsgi.ini文件
[uwsgi]
; http = 0.0.0.0:8091
socket = 0.0.0.0:8081
callable = app
chdir = /root/pro1
home = /root/pro1/venv
; daemonize = /root/test/uwsgi.log
pidfile = uwsgi.pid
wsgi-file = main.py
processes = 4
threads = 8
buffer-size = 32768
master = true
!!注意,socket是后面配置nginx相关的,如果要直接访问配置http即可,home目录为上面创建的虚拟环境的目录 wsgi-file为主启动文件的名称。
三、启动uwsgi
1.创建flask文件
@app.route('/')
def index():
return 'success'
2.启动uwsgi
(必须先启动虚拟模式)
uwsgi --ini uwsgi.ini
启动完成后即可访问配置的http,用自己服务器外网ip+端口
(注意配置问题,最后会讲我在配置这个文件踩到的坑)
四、配置nginx
只需要在server里加入
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 0.0.0.0:8081;
}
注意:这里的uwsgi_pass和uwsgi.ini配置的socket要一致
我这边是一个小程序的开发,需要用到https
在server里配好ssl后在加入上面的location即可
四、把uwsgi加入到开机自启
1.首先找到uwsgi的安装目录
whereis uwsgi
我的目录是
2.创建配置文件
cd /etc/systemd/system/
touch server_uwsgi.service
3.添加配置信息
vim server_uwsgi.service
然后填入下列信息
[Unit]
Description=HTTP Interface Server
After=syslog.target
[Service]
KillSignal=SIGQUIT
ExecStart=/usr/local/python/bin/uwsgi --ini /root/pro1/uwsgi.ini
#注意,重点:--ini 前面的路径就是刚才获取到的uwsgi的路径,--ini后面的路径是你的uwsgi配置文件的路径
Restart=always
Type=notify
NotifyAccess=all
StandardError=syslog
[Install]
WantedBy=multi-user.target
4.将服务加到系统中
systemctl enable /etc/systemd/system/server_uwsgi.service
到了这一步基本上就ok了,用下列命令即可操作uwsgi
systemctl stop server_uwsgi.service 关闭uwsgi服务
systemctl start server_uwsgi.service 开启uwsgi服务
systemctl restart server_uwsgi.service 重启uwsgi服务
可能遇到的问题
配置好uwsgi后启动发现报了 encoding 的问题,一般就是你的虚拟环境home目录配错了,修改一下就可以了
注意看虚拟环境创建的python版本和uwsgi自带python的版本
不过我遇到的比较大的坑就是导包的问题
我在本地通过pip freeze > requirements.txt
命令获取原项目所有的包,然后再虚拟环境下
pip install -r requirements.txt
安装所有的包,发现导入的包不一致
查看虚拟环境的python版本和本地环境的python版本都是一致的。
查了一下csdn发现这种方式导入的包是环境中所有依赖的包
所以推荐使用 pipreqs
安装
pip install pipreqs
导出
pipreqs . --encoding=utf8 --force