Flask+uWGSI+Nginx的部署
0. 使用该框架部署目的:
- 提高并发访问支持(-p 进程数, –threads 线程数)
- 提高服务运行稳定性
1. 安装uwsgi
(如果用系统默认的Python环境,pip install uwsgi 安装即可)
如果系统有多个Python版本,且项目需要执行在某个指定Python版本时,按照如下安装
下载安装包并解压
$ wget http://projects.unbit.it/downloads/uwsgi-1.4.10.tar.gz
$ tar -zxvf uwsgi-1.4.10.tar.gz
$ cd uwsgi-1.4.10
修改配置文件
修改文件夹下 buildconf/core.ini 文件,设置uwsgi执行文件(bin)及Python编译版本插件文件目录(plugin_dir)
plugin_dir = /usr/lib/uwsgi #自定义目录
bin_name = /usr/bin/uwsgi #自定义目录
编译 uWSGI
$ python uwsgiconfig.py --build core
编译各Python版本的plugins
例如系统中有python2和python3,可分别编译:
$ python2 uwsgiconfig.pu --plugin plugins/python core python2
$ python3 uwsgiconfig.py --plugin plugins/python core python3
然后调用uwsgi时,添加以下参数即可
--plugin <directory> <buildprofile> <pluginname>
启动测试程序foobar
foobar.py:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
启动程序代码脚本如下,根据选择绝对路径(uwsgi、python2、foobar.py),打开本地浏览器http://ip:3902查看是否安装成功
$ uwsgi --http-socket :3902 --plugin python2 --wsgi-file foobar.py
创建配置文件uwsgiconfig.ini,启动时通过 uwsgi –ini uwsgiconfig.ini 调用配置即可
更多配置详解可查看 UWSGI配置中文说明
[uwsgi]
socket = 127.0.0.1:5051 # 如果通过Nginx调用, 启动与Nginx进行通信的socket服务的ip和端口
# http = 10.90.243.37:3701 # 如果不通过Nginx调用, 启动服务的ip端口设置
pythonpath = /home/users/work/grammar_dingbang # 代码目录
module = run_model_dingbang # 启动服务的脚本模块
wsgi-file =/home/users/work/grammar_dingbang/run_model_dingbang.py # 启动服务的脚本文件
callable = app # 一般指app=Flask(__name__)的变量名app
processes = 4 # 进程数【似乎存在问题,看文末】
threads = 2 # 每个进程的线程数
plugin = python2 # python版本,如需要请用绝对路径
daemonize = /home/users/work/grammar_dingbang/log/server.log # 日志文件
pidfile = uwsgi.pid # 保存pid信息,方便停止服务和重启的时候用
特别提醒:如果需要调用别的gcc库,可通过在之前uwsgi命令前将库加入,如下所示
/opt/compiler/gcc-4.8.2/lib/ld-linux-x86-64.so.2 –library-path /opt/compiler/gcc-4.8.2/lib /home/users/work/python2.7/bin/uwsgi –ini uwsgiconfig.ini
2. 安装Nginx
下载安装包并解压安装
$ wget http://nginx.org/download/nginx-1.15.2.tar.gz
$ tar -zxvf nginx-1.15.2.tar.gz
$ cd nginx-1.15.2
$ ./configure
$ sudo make & make install
修改配置文件,./conf/nginx.conf
server {
listen 3701; //服务端口
server_name 10.90.243.37; //服务器ip
location / {
include uwsgi_params; //这里是导入的uwsgi配置
uwsgi_pass 127.0.0.1:5051; //需要和uwsgi的配置文件里socket项的地址相同,否则无法让uwsgi接收到请求。
uwsgi_param UWSGI_CHDIR /home/users/work/grammar_dingbang; //项目根目录
uwsgi_param UWSGI_SCRIPT run_model_dingbang:app; //启动项目的主程序【flask】
}
}
启动程序:先启动nginx,再启动uwsgi
$ nginx -c ./nginx/conf/nginx.conf
$ uwsgi --ini ./uwsgi/uwsgiconfig.ini
实测发现,uwsgi似乎不能充分的利用cpu和内存来达到无上限的并发。有一定瓶颈,并且到达瓶颈后,还有大量的计算资源剩余!故而为了充分利用资源不妨多开几个uwsgi服务,与其让一个uwsgi服务跑10个进程,不如开10个uwsgi服务,然后用nginx做负载均衡!
参考
https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html
https://www.cnblogs.com/franknihao/p/7202253.html
https://blog.csdn.net/hit0803107/article/details/53264066