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.1uwsgi.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的相关配置
 在nginxhttp{}

 

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

 

posted @ 2021-03-08 11:45  张Star  阅读(623)  评论(0编辑  收藏  举报