Nginx+uwsgi部署Python 后台服务: Django、Flask,Python django工程化部署看这篇就够了
一、熟悉以下概念
WSGI
WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器、python模块、框架、API或者任何软件,只是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信的规范、协议。
server和application的规范在PEP3333中有具体描述,要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有,Flask, Django。
uWSGI服务器
uWSGI是一个全功能的HTTP服务器,是一个C语言编写的高性能服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。
uwsgi协议
与WSGI一样,是uWSGI服务器的独占通信协议,用于定义传输信息的类型。每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
Nginx
Nginx是一个Web服务器其中的HTTP服务器功能和uWSGI功能很类似,但是Nginx还可以用作更多用途,比如最常用的反向代理功能。
Django
Django是一个Web框架,框架的作用在于处理request和 reponse,其他的不是框架所关心的内容。所以如何部署Django不是Django所需要关心的
二、常见的Python项目部署流程(anaconda部署)
virtual环境部署请搜索相关部署命令,且virtual环境中依赖包安装也与conda不同
1、anaconda新环境搭建
1-1、创建新的conda环境:
conda create -n your_env_name python=3.6
1-2、查看和进入刚才创建的环境:
conda info -e
source activate your_env_name
1-3、用pip批量安装项目依赖:
1-3.1 安装前先确认下使用的pip是否为本conda环境的pip:
(本环境的pip在anaconda/envs/sip_http_server/bin/pip,非该路径需要进入检查是否进入了新建的conda环境及该环境里是否有pip,若无,conda install pip)
which -a pip
1-3.2 批量安装python依赖包:
pip install -r requirements.txt
2、下载及配置UWSGI
1、安装UWSGI:
(注意此处用conda来装,pip里的uwsgi包比较旧,系统中的gcc版本过高,会有报错的情况,当然也可自行解决gcc问题后,pip install uwsgi来安装)
(直接pip install安装uwsgi出现gcc版本问题,,可参考笔者之前博客进行解决)
conda install -c conda-forge uwsgi # 查看版本 uwsgi --version
2、写一个测试uwsgi的临时脚本temp.py测试uwsgi是否安装成功
2.1新建一个temp.py ,写入下面测试代码:(来自uwsgi官方文档)
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
(本文档中上述代码缩进可能在linux真实使用有误,自行修正缩进问题)
2.2 使用 uwsgi --http :8000 --wsgi-file temp.py
用wsgi来启动这个测试脚本,然后浏览器访问本服务器iP:8000,
若输出 Hello World ,则uwsgi安装成功
3、新建uwsgi配置文件uwgsi.ini,之后我们多样的uwsgi参数即写到配置文件中,同时保证和nginx配置的联动
3.1、uwsgi.ini配置文件中写入下面配置:(我们新建文件夹uwsgi_script用来放uwsgi信息)
注意其中的:socket、listen、works、threads、harakiri、post-buffering等项
[uwsgi]
# 使用nginx和uwsgi联动时,用socket= ;若欲单独使用uwsgi,可http = socket = 127.0.0.1:9090
# listen= 用于调整uwsgi的listen queue队列缓存长度,
# 可用于解决listen queue full等问题 listen=10240 #项目目录 chdir=/temp/sip_http_server/ wsgi-file = /temp/sip_http_server/sip_http_server/wsgi.py # home=/root/projects/venv/ # 虚拟环境目录 # 指定项目的application # module=Hello.wsgi:application # 指定sock的文件路径 socket=/temp/sip_http_server/uwsgi_script/uwsgi.sock # 启用主进程 master=true # 进程个数 workers=2 pidfile=/temp/sip_http_server/uwsgi_script/uwsgi.pid # 自动移除unix Socket和pid文件当服务停止的时候 vacuum=true # 序列化接受的内容,如果可能的话 thunder-lock=true # 启用线程 enable-threads=true
# thread=可增加uwsgi并行性能, threads=1000 # 设置自中断时间 harakiri=30 # 设置缓冲 post-buffering=4096 # 设置日志目录 daemonize=/temp/sip_http_server/uwsgi_script/uwsgi.log
3.2、使用uwsgi --ini ......./uwsgi.ini用配置文件的方式启动uwsgi
Eg:
uwsgi --ini /temp/sip_http_server/uwsgi_script/uwsgi.ini
之后可以在我们创建的uwsgi_sctipt文件夹下看的uwsgi的log日志和sock文件、pid文件,可以检查下log文件中是否有uwsgi的异常
另外:关闭和重启uwsgi:
uwsgi --reload ......./uwsgi.pid
uwsgi --stop ......./uwsgi.pid
4、修改nginx对应于uwsgi的相关配置
在nginx的 http{}里
server { listen 80; server_name localhost; location / { uwsgi_pass 127.0.0.1:9090; // 必须和uwsgi中的设置一致
#uwsgi_pass unix:/temp/sip_http_server/uwsgi_script/uwsgi.sock;
include /etc/nginx/uwsgi_params; # 加载nginx和uwsgi通信的模块,需找到该路径 #include /usr/local/openresty/nginx/conf/uwsgi_params; uwsgi_connect_timeout 30; # 超时时间 # (第一行与最后一行有一个即可,均需与uwsgi中配置的一致) }
5、启动服务
配置好nginx和uwsgi的相关配置文件后,执行下述命令启动整个服务,之后访问nginx中配置的ip及port即可访问服务
nginx -s reload
uwsgi --ini ....../uwsgi.ini