阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

uWSGI+Django+Nginx的工作原理流程与部署过程

175次阅读
没有评论

共计 5858 个字符,预计需要花费 15 分钟才能阅读完成。

一、前言

献给和我一样懵懂中不断汲取知识,进步的人们。

霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光

二、必要的前提

2.1 准备知识

django

一个基于 Python 的开源 web 框架,请确保自己熟悉它的框架目录结构。

uWSGI

一个基于自有的 uwsgi 协议、wsgi 协议和 http 服务协议的 web 网关

nginx

常用高性能代理服务器

wsgi.py

django项目携带的一个 wsgi 接口文件
如果项目名叫 destiny 的话,此文件就位于[destiny/destiny/wsgi.py]

2.2 相关资料

wsgi:一种实现 python 解析的通用接口标准 / 协议,是一种通用的接口标准或者接口协议,实现了 python web 程序与服务器之间交互的通用性。
利用它,web.py 或 bottle 或者 django 等等的 python web 开发框架,就可以轻松地部署在不同的 web server 上了;

uwsgi: 同 WSGI 一样是一种通信协议
uwsgi 协议是一个 uWSGI 服务器自有的协议,它用于定义传输信息的类型,它与 WSGI 相比是两样东西。

uWSGI : 一种 python web server 或称为 Server/Gateway
uWSGI 类似 tornadoweb 或者 flup,是一种 python web server,uWSGI 是实现了 uwsgi 和 WSGI 两种协议的 Web 服务器,负责响应 python 的 web 请求。
因为 apache、nginx 等,它们自己都没有解析动态语言如 php 的功能,而是分派给其他模块来做,比如 apache 就可以说内置了 php 模块,让人感觉好像 apache 就支持 php 一样。
uWSGI 实现了 wsgi 协议、uwsgi 协议、http 等协议。Nginx 中 HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换。

2.3 项目流程
其实网上很多教程,都是关于 uwsgi+nginx 部署 django 的,StackOverflow 也有一些解决常见错误的方法,但是部署还是容易出问题,新手难解决。
归根到底是自己 不了解整个项目的流程 。教程都只教方法,但为什么这样部署,这样部署有什么好处,每个组件都起什么作用却只字不提。致使只要部署稍微有那么一点不同,就无可是从了。
所以说,项目流程和每个组件的用途才是此次部署 最重要的 部分。

首先客户端请求服务资源,nginx 作为直接对外的服务接口, 接收到客户端发送过来的 http 请求, 会解包、分析,如果是静态文件请求就根据 nginx 配置的静态文件目录,返回请求的资源,如果是动态的请求,nginx 就通过配置文件, 将请求传递给 uWSGI;uWSGI 将接收到的包进行处理,并转发给 wsgi,wsgi 根据请求调用 django 工程的某个文件或函数,处理完后 django 将返回值交给 wsgi,wsgi 将返回值进行打包,转发给 uWSGI,uWSGI 接收后转发给 nginx,nginx 最终将返回值返回给客户端(如浏览器)。* 注: 不同的组件之间传递信息涉及到数据格式和协议的转换

作用:
1. 第一级的 nginx 并不是必须的,uwsgi 完全可以完成整个的和浏览器交互的流程;
2. 在 nginx 上加上安全性或其他的限制,可以达到保护程序的作用;
3. uWSGI 本身是内网接口,开启多个 work 和 processes 可能也不够用,而 nginx 可以代理多台 uWSGI 完成 uWSGI 的负载均衡;
4. django 在 debug=False 下对静态文件的处理能力不是很好,而用 nginx 来处理更加高效。

三、安装与配置

首先 ,确保你已经安装好了 nginx 并可以 正常使用
其次 ,确保自己安装完成了 python,并已经完成了 pip 的安装。如果没有,请先安装。
接着 ,别忘了确认自己项目所需的 django 已经完成 安装 正常工作
没有的话参考以下命令安装 django , 建立一个工程 或利用已经写好的工程,打开浏览器,输入部署地址 (如:http://127.0.0.1:8000/)(或 http:// 内网 ip:8000、或 http:// 外网 ip:8000) 测试,确认是否可正常打开浏览。

安装:sudo pip install django==1.10
测试:python manage.py runserver 0.0.0.0:8000

上面的工作都完成了,接着安装uWSGI

sudo pip install uwsgi

测试 uWSGI: 新建文件 test.py,写入以下内容

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

运行

sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py

如果端口占用,使用

lsof -i :8000

列出占用端口的程序的 pid 号,并使用以下命令杀掉所有占用端口的程序

sudo kill -9 pid

然后浏览 http://127.0.0.1:8000(或 http:// 内网 ip:8000、或 http:// 外网 ip:8000)查看效果,有”Hello World”输出即安装成功。

下一步,建立工程单独的 nginx 配置文件
首先确认自己准确的知道 nginx 的默认配置文件目录 (nginx.conf) 的路径,如果不清楚,请使用如下命令获取:

nginx -t

大概会列出以下类似信息:

nginx: the configuration file /etc/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/conf/nginx.conf test is successful

里面说明了 nginx 默认配置文件的路径是:/etc/nginx/conf/nginx.conf;

然后,确保 nginx.conf 的同目录下有 uwsgi_params 文件(/etc/nginx/conf/uwsgi_params),没有的话根据链接获取,后面要用到。

自己的工程目录下 ,建立如 destiny.conf(/wwwroot/destiny/destiny.conf)的配置文件;复制 nginx.conf 里面 全部 的内容,全部写入 destiny.conf 中。
然后按照下面写的,把 destiny.conf 配置文件中的 server 段部分全部 替换 掉。

server {listen 80;
    server_name localhost;
    charset     utf-8;
    access_log      /wwwroot/destiny/nginx_access.log;
    error_log       /wwwroot/destiny/nginx_error.log;
    client_max_body_size 75M;


    location /static {alias /wwwroot/destiny/destiny/static;
    }

    location / {
        include     /etc/nginx/conf/uwsgi_params;
        uwsgi_pass  127.0.0.1:9090;
    }
}

其中的 listen 80 代表服务器开放 80 端口;
location [目录名]代表项目路径的引导;
access_log 和 error_log 是定义 nginx 访问日志和错误日志的存放路径。
“location /static”中的”/static”是自己定义的项目引用静态文件时,浏览器中显示的静态资源所在的根目录名; 这样的话,用户在浏览器中查看到的所有 image、css 或 js 资源都是处在 http://127.0.0.1/static 下的。
django 静态文件的绝对路径是根据自己的实际情况来确定的,一般在自己的 django 的 app 名 /static 目录下, 或自己 python manage.py collectstatic 后的路径下。像我的是在 /wwwroot/destiny/destiny/static 根目录下。
“location /”是指访问项目根目录时,nginx 要做的事。其中需要指定 uwsgi_params 文件的绝对路径,上面已经提到了;如果还有 media 文件��类的静态目录,仿照 static 的写法,自己补充。
127.0.0.1:9090 是指 uWSGI 绑定的监听地址,这里使用了 9090 端口。
需要注意的是,请确认自己 django 的静态文件目录所有者是 www 用户,如果不是,请用以下命令更改静态目录权限归属者:

sudo chown -R www:www /wwwroot/destiny/destiny/static

下面接着建立uWSGI 的配置文件,在自己工程目录下创建 uwsgi.ini 文件, 写入以下内容

[uwsgi]
socket = 127.0.0.1:9090
chdir=/wwwroot/destiny
module=destiny.wsgi
master = true         
processes=2
threads=2
max-requests=2000
chmod-socket=664
vacuum=true
daemonize = /wwwroot/destiny/uwsgi.log

其中的 socket 字段值”127.0.0.1:9090”必须要和上面写的 density.conf 配置文件中的 uWSGI 监听地址 完全一样;
chdir 指自己工程的绝对路径;
module 指的是 wsgi.py 在自己工程中的相对路径,”.”指代一层目录; 我的 django 工程的 wsgi.py 文件是在”/wwwroot/destiny/destiny/wsgi.py”,所以写成 destiny.wsgi;
daemonize 指定 uWSGI 日志的存储路径。

好了,现在理一下路径:

工程路径:                  /wwwroot/destiny
工程静态文件路径:            /wwwroot/destiny/destiny/static
wsgi.py 的路径:             /wwwroot/destiny/destiny/wsgi.py
uwsgi.ini 的路径:           /wwwroot/destiny/uwsgi.ini
uwsgi 日志路径:             /wwwroot/destiny/uwsgi.log
destiny.conf 的路径:        /wwwroot/destiny/destiny.conf
uwsgi_params 的路径:        /etc/nginx/conf/uwsgi_params
nginx 访问日志路径:          /wwwroot/destiny/nginx_access.log
nginx 错误日志路径:          /wwwroot/destiny/nginx_error.log

可以发现,我几乎把所有有关工程的配置文件和日志文件都放在工程目录下了,方便后期维护与查错。
启动 uWSGI

sudo uwsgi --ini /wwwroot/destiny/destiny.ini

启动 nginx
在这之前,我们要先去 nginx 配置文件的根目录拷贝 mime.types(/etc/nginx/conf/mime.types) 到工程目录 (/wwwroot/destiny/mime.types), 和 destiny.conf 放在一起
否则用配置文件启动 nginx 会报错:

nginx: [emerg] open() "/**/**/**/mime.types" failed (2: No such file or directory)

如果 nginx 已经开启,先关闭 nginx(service nginx stop),再执行以下命令:

nginx -c /wwwroot/destiny/destiny.conf

这里的 -c 表示加载配置文件启动

四、后记

到这里,工作基本就做完了,可以打开浏览器,输入自己项目的 IP 地址,如 http://127.0.0.1/ 查看效果了。

uWSGI+Django+Nginx 的工作原理流程与部署过程

  1. 如果启动时就报错,查看终端信息,解决错误。
    如果终端没有报错,但是浏览时出现 500、502 等错误,就去项目目录查看 nginx 日志和 uWSGI 日志,解决错误。

  2. 自己在部署时,遇到很多坑,网上的教程大多附带 virtualenv 和 supervisor 的部署,但是连最基本的部署都说不明白,部署出来的东西性能再好也没指导意义。基于自己踩坑脱坑的过程,写下此文。

  3. 正如以上所说,我只是用单独的一个 conf 文件,在 nginx 上部署了一个工程,没有说明部署多个工程的问题;也没有使用 virtualenv 开发环境、使用 supervisor 来管理进程等。请根据个人爱好和需要去实践扩展。

更多参考

Nginx+uWSGI+Supervisor 在 Ubuntu 上部署 Flask 应用  http://www.linuxidc.com/Linux/2016-07/133064.htm

Ubuntu Server 12.04 安装 Nginx+uWSGI+Django 环境 http://www.linuxidc.com/Linux/2012-05/60639.htm 

快速部署 Python 应用:Nginx+uWSGI 配置详解  http://www.linuxidc.com/Linux/2016-12/137830.htm

Nginx+uWSGI+Django+Python 应用架构部署  http://www.linuxidc.com/Linux/2015-10/124183.htm

Ubuntu Server 14.04.2 LTS 配置 Nginx + Uwsgi + Django  http://www.linuxidc.com/Linux/2015-04/116397.htm

Flask+uWSGI+Nginx+Ubuntu 部署教程 http://www.linuxidc.com/Linux/2016-06/132690.htm

Ubuntu 16.04 下安装部署 Nginx+uWSGI+Django1.9.7  http://www.linuxidc.com/Linux/2016-07/133484.htm

Nginx+uWSGI+Django 在 Ubuntu 下的部署  http://www.linuxidc.com/Linux/2016-07/133490.htm

Linux 上利用 Nginx 代理 uWSGI 处理 Flask Web 应用  http://www.linuxidc.com/Linux/2016-08/134164.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141785.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计5858字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中