• 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
  • 相关阅读:
    Delphi Stream(流)介绍
    springboot 启动慢分析
    内网穿透NPS
    Docker非root用户使用
    springBoot项目中的log导入,ELK
    基于Addrparser根据经纬度分析所在地区位置
    java ArrayList条件排序
    未完成事项记录
    Python数据挖掘——银行分控模型的建立
    unity ugui的拖拽与放置
  • 原文地址:https://www.cnblogs.com/zhangxingcomeon/p/14498851.html
Copyright © 2020-2023  润新知