【使用uWSGI和Nginx来设置Django和你的Web服务器】

目录

  • 安装使用uWSGI
  • 配置Nginx结合uWSGI
  • supervisor
  • Django静态文件与Nginx配置

@

***

所谓WSGI

.

WSGI是Web服务器网关接口,它是一个规范,描述了Web服务器如何与Web应用程序通信,以及如何与Web应用程序链接在一起处理一个请求(接收请求、处理请求、响应请求).

.

基于wsgi运行的框架有Bottle、Django、Flask,用于解析动态HTTP请求.

.

---------??

支持WSGI的服务器

.

wsgiref

Python自带的服务器.

.

Gunicorn

用于Linux的python wsgi Http服务器,常用于各种Django、Flask结合部署服务器.

.

mode_wsgi

实现了Apache与wsgi应用程序的结合.

.

uWSGI

C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发.

---------??

.

在部署Python程序的Web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程、多进程、多线程、协程的区别,其功能相似,无非是请求路由,执行对应的函数,返回处理结果.

关于Django环境中的wsgi.py文件

上图是Django环境中的wsgi.py文件.

.

Django的主要部署平台是WSGI,其用于Web服务器和应用程序的Python标准.

.

Django的startproject管理命令设置一个简单的默认WSGI设置,可以根据需求为我们的项目进行调整,并指示任何符合WSGI的应用程序服务器使用.

.

application使用WSGI部署的关键概念是应用程序服务器用于与代码通信的application可调用,它通常在服务器可访问的Python模块中作为名为application的对象提供.

.

startproject命令创建包含这样的application可调用的文件:

<project_name>/wsgi.py,它被Django的开发服务器和生产WSGI部署使用,WSGI服务器从其配置中获取application可调用的路径。Django的内置服务器,即runserver命令,从WSGI_APPLICATION设置读取它.

为什么使用Nginx,uWSGI

.

首先,nginx是对外的服务接口,外部浏览器通过url访问nginx.

.

然后,nginx接收到浏览器发送过来的http请求,将包进行解析并分析url。如果是静态文件请求就访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,如果不是静态文件请求(即动态请求),那么nginx就将请求转发给uwsgi,uwsgi接收到请求之后将包进行处理,处理成wsgi可以接收的格式,并发给wsgi。wsgi根据请求调用应用程序中的某个文件,或者某个文件中的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器.

.

最后,要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到下面3种情况.

.

1.安全问题

程序不能直接被浏览器访问到,而是通过nginx,nginx只开发某个接口.

uwsgi本身是内网接口,这样运维人员在nginx中加上安全性的限制,可以达到保护程序的作为.

.

2.负载均衡问题

一个uwsgi很可能不够用,即使开多个work也是不行,毕竟一台机器的cpu和内存是有限的.

而使用nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡.

.

3.静态文件问题

用Django或是uwsgi来负责静态文件的处理是很浪费的行为,它们本身对文件的处理也不如nginx,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的逻辑.

nginx官网:http://nginx.org/en/

nginx有关uwsgi模块的介绍:http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html

***

下面将对Nginx、WSGI、uwsgi、uWSGI、Django之间的关系进行梳理.

.

---------??

wsgi

全称web server gateway interface,wsgi不是服务器,也不是Python模块,而是一种通信协议.

其用于描述web server如何与web application进行通讯.

运行在wsgi上的web框架有Bottle、Flask、Django.

.

uwsgi

与wsgi一样,是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型.

.

uWSGI

是一个web服务器,实现了WSGI协议,uwsgi协议.

.

Nginx

web服务器,更加安全,更好的处理静态资源,缓存功能,负载均衡.

nginx的强劲性能,配合我WSGI服务器会更加安全,性能有保障.

.

Django

高级的Python框架,用于快速开发,解决web开发的大部分麻烦,程序员可以更加专注于业务逻辑,无序重新造轮子.

---------??

.

逻辑图:

---------??

web服务器

传统的C/S架构,请求的过程是:

客户端 > 服务器

服务器 > 客户端

服务器就是:1.接收请求 2.处理请求 3.返回响应

.

web框架层

HTTP的动态数据交给web框架,例如Django遵循MTV模式处理请求.

HTTP协议使用url定位资源,urls.py将路由请求交给views视图处理,然后返回一个结果,完成一次请求.

web框架使用者只需要处理业务的逻辑即可.

---------??

.

如果将一次通信转化为“对话”的过程:

Nginx:“Hello WSGI,我刚收到了一个请求,你准备下,然后让Django来处理吧。”

WSGI:“好的,Nginx,我马上设置环境变量,然后把请求交给Django。”

Django:“谢谢 WSGI,我处理完请求马上给你响应结果。”

WSGI:“好的,我在等。”

Django:“搞定啦,麻烦WSGI把响应结果传递给Nginx。”

WSGI:“Very good Nginx,响应结果请收好,已经按照要求传递给你了。”

Nginx:“好的,我这就把响应结果交给客户,合作愉快。”

***

安装使用uWSGI

安装uWSGI

# 进入虚拟环境,安装uWSGI
(venv) [[email protected] ~]# pip3.6 install uwsgi

# 检查uWSGI版本
(venv) [[email protected] ~]# uwsgi --version
2.0.17.1

# 检查uWSGI Python版本
(venv) [[email protected] ~]# uwsgi --python-version
3.6.7

运行简单的uWSGI

test.py文件如下:

def application(env, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html‘)])
    return [b‘Hello World‘]  # Python3

运行命令如下:

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

"""参数详解:
--http :8000  -> 使用http协议,端口8000
--wsgi-file test.py  -> 加载test.py文件
"""

运行后,可从浏览器访问:

***

uWSGI运行Django环境

.

----------------------------------

通过命令运行Django环境

# 在项目根目录下执行如下命令
uwsgi --http :8000 --module project.wsgi

"""参数详解:
--http :8000  -> 使用http协议,端口8000
----module  -> 加载project项目下的wsgi模块
"""

.

----------------------------------

使用脚本运行Django环境

.

uWSGI支持inixml等多种配置方式.

这里将以ini为例,在/etc/目录下新建uwsgi_nginx.ini配置文件,如下:

# 项目配置文件
[uwsgi]

# 项目的绝对路径 定位到第一层
chdir = /root/oldboy

# 指定项目的wsgi文件路径(从项目的根路径开始)
module = oldboy.wsgi

# 指定虚拟解释器的第一层路径
home = /root/Envs/oldboy

# 指定通过uwsgi启动多少个进程
processes = 4

# 如果你已经配置了nginx,请使用这个socket连接
socket = 0.0.0.0:9999

# 如果你没有配置nginx,想通过uwsgi直接启动web服务,请使用这个http连接,指明http协议
# http = 0.0.0.0:9999

# 用于在退出uwsgi环境后清空环境变量
vacuum = true

指定配置文件启动命令:

uwsgi --ini /etc/uwsgi_nginx.ini

uWSGI热加载Python程序

.

在启动命令的后面加上--py-autoreload=1即可

# 命令启动
uwsgi --http :8000 --module mysite.wsgi --py-autoreload=1

# 配置文件启动
uwsgi --ini uwsgi.ini --py-autoreload=1

此时修改Django代码,uWSGI会自动加载Django程序,页面生效.

***

配置Nginx结合uWSGI

这里我们只讲解Nginx配置文件部分

worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                    ‘$status $body_bytes_sent "$http_referer" ‘
                    ‘"$http_user_agent" "$http_x_forwarded_for"‘;
    access_log logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    # 负载集群
    upstream load {
         server 192.168.1.100:9999;
         server 192.168.1.200:9999;
         server 192.168.1.300:9999;
    }
    server {
        listen 80;
        server_name 192.168.43.149;
        location / {
             # nginx自带的ngx_http_uwsgi_module模块,起到nginx和uwsgi交互的作用
             # 通过uwsgi_pass指定服务器地址和协议,将动态请求转发给uwsgi处理
            uwsgi_pass load;
            include /usr/local/nginx1.12/conf/uwsgi_params;
        }
        # nginx处理静态页面资源
        location /static {
            alias /data/static/;
        }
        # nginx处理媒体资源
        location /media {
            alias/data/media/;
        }
    }
} 

配置完后重启Nginx,即可实现其功能.

***

supervisor

supervisor是基于Python的任务管理工具,用于自动运行各种后台任务。当然我们也能直接使用Linux的nohup命令是任务自动后台运行,但如果要重启任务,就得手动去kill掉任务进程。这样很繁琐,而且一旦程序错误导致进程退出的话,系统也无法自动重载任务。

下载

# 由于supervisor在python3下无法使用,因此只能用python2去下载
yum install python-setuptools
easy_install supervisor

通过下面的命令生成supervisor的配置文件

echo_supervisord_conf > /etc/supervisord.conf

然后在/etc/supervisord.conf末尾添加如下代码

[program:django_test]  # [program:项目名称]
command=/root/Envs/djang1.11.11/bin/uwsgi --ini /root/django_test/uwsgi.ini
# 程序启动命令

autostart=true
# 在supervisord启动的时候也自动启动,可使uWSGI程序被杀掉后自动运行

# 这里我们只使用到了上面两个参数??

# startsecs=10
# 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒

# autorestart=true
# 程序退出后自动重启,可选值有:[unexpected,true,false],默认为unexpected,表示进程被意外杀死后才重启

# startretries=3
# 启动失败自动重试次数,默认是3

# user=django1.11.11
# 用哪个用户启动进程,默认为root

# priority=999
# 进程启动优先级,默认999,值小的优先启动

# redirect_stderr=true
# 把stderr重定向到stdout,默认false

# stdout_logfile_maxbytes=20MB
# stdout 日志文件大小,默认50MB

# stdout_logfile_backups = 20
# stdout 日志文件备份数,默认是10

# stdout
# 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)

# stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out

# stopasgroup=false
# 默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程

# killasgroup=false
# 默认为false,向进程组发送kill信号,包括子进程

其中command是结合virtualenv的命令和supervisor的精髓:

command=/root/Envs/djang1.11.11/bin/uwsgi --ini /root/django_test/uwsgi.ini

command=/root/Envs/djang1.11.11/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /root/django_test --home=/root/venv --module django_test.wsgi
# --chdir:指定项目的根
# --home:指的是虚拟环境目录
# --module:找到Django项目环境中的wsgi.py文件

启动supervisor

# 启动supervisor
supervisord -c /etc/supervisord.conf

# 重启my项目
supervisorctl -c /etc/supervisord.conf restart my

supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all]

重新加载supervisor

supervisorctl update
# 更新新的配置到supervisord 

supervisorctl reload
# 重新启动配置中的所有程序

supervisorctl start program_name
# 启动某个进程(program_name=你配置中写的程序名称)

supervisorctl
# 查看正在守候的进程

pervisorctl stop program_name
# 停止某一进程 (program_name=你配置中写的程序名称)

supervisorctl restart program_name
# 重启某一进程 (program_name=你配置中写的程序名称)

supervisorctl stop all
# 停止全部进程

# 注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

Django静态文件与Nginx配置

mysite/settings.py

# 此参数会将将所有STATICFILES_DIRS中所有文件夹中的文件,以及各app中static中的文件都复制到指定的路径下
STATIC_ROOT=‘/data/static‘

STATIC_URL=‘/static‘
STATICFILES_DIRS=[
    os.path.join(BASE_DIR, ‘static‘),
]

配置完毕后,运行命令:

python3.6 manage.py collectstatic

上面的命令会收集所有我们项目中所有的静态文件并保存到STATIC_ROOT指定的路径下.

把这些文件放到一起是为了用nginx等部署的时候更方便.

***

参考文献:https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html

原文地址:https://www.cnblogs.com/zyk01/p/10176536.html

时间: 2024-08-01 01:22:45

【使用uWSGI和Nginx来设置Django和你的Web服务器】的相关文章

【使用uWSGI和Nginx来设置Django和你的Web服务器】 -- 2019-08-08 20:39:49

目录 安装使用uWSGI 配置Nginx结合uWSGI supervisor Django静态文件与Nginx配置 原文: http://106.13.73.98/__/101/ @ *** 补充 查所有已安装的pip包: pip3.6 list 将当前环境中所有的Python包导入到文件内: pip3.6 freeze > test.txt 将文件内所有的Python包安装到当前环境: pip3.6 install -r test.txt 所谓WSGI . WSGI是Web服务器网关接口,它是

nginx+uWSGI+django+virtualenv+supervisor发布web服务器

wsgi 全称web server gateway interface,wsgi不是服务器,也不是python模块,只是一种协议,描述web server如何和web application通信的规则.运行在wsgi上的web框架有bottle,flask,django uwsgi 和wsgi一样是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型 uWSGI 是一个web服务器,实现了WSGI协议,uwsgi协议.a nginx web服务器,更加安全,更好的处理处理静态资源,缓存

Django项目部署(nginx+uWSGI+django+virtualenv+supervisor发布web服务器 )

一.简介 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架有bottle,DJango,Flask,用于解析动态HTTP请求 支持WSGI的服务器 wsgiref python自带的web服务器 Gunicorn 用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器. mode_wsgi 实现了Ap

Nginx学习笔记(二)——搭建Web服务器

背景介绍 Nginx自诞生起就采用了2.6以后内核所支持的epoll模型进而使得处理效率大幅提升而受到了广大用户的青睐,但就Web服务来讲,Nginx所拥有的功能Apache都可以实现,但反过来确不行,这就是大多数场景时使用Nginx作为反向代理而不能取代Apache的原因.本文以Nginx_1.12.1版本为例,介绍Nginx充当Web服务器时的配置及用法. 软件安装 尽管Nginx已经被收录进epel源,但仍然推荐使用编译的方式进行安装,这样更为灵活.安装步骤为: 1.从Nginx官网下载1

08 nginx+uWSGI+django+virtualenv+supervisor发布web服务器

一.为什么要用nginx,uwsgi? 1 1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx, 2 3 2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件, 4 5 如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序

用Nginx搭建一个可用的静态资源web服务器

[[email protected] conf]# vim nginx.conf [[email protected] conf]# cat nginx.conf http { # log_format 关键字定义日志的格式 # $remote_addr 源端的IP地址 # $time_local 当前的时间 include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $re

利用uWSGI和nginx进行服务器部署

搭建服务器虚拟环境 1)在本机进入虚拟环境,执行命令导出当前需要的所有包. pip freeze > plist.txt 2)通过ftp软件将项目代码和plist.txt文件上传到服务器. 3)创建虚拟环境,在虚拟环境上安装包. mkvirtualenv 虚拟环境名称 pip install -r plist.txt WSGI: 全称是Web Server Gateway Interface(web服务器网关接口) 它是一种规范,它是web服务器和web应用程序之间的接口 它的作用就像是桥梁,连

构建高效安全的Nginx Web服务器

一 一.为什么选择Nginx搭建Web服务器 Apache和Nginx是目前使用最火的两种Web服务器,Apache出现比Nginx早. Apache HTTP Server(简称Apache)是世界使用排名第一的Web服务器软件, 音译为阿帕奇,是Apache软件基金会的一个开放源码Web服务器, 可以运行几乎所有的计算机平台,其次开放的API接口, 任何组织和个人都可以在它上面扩展和增加各种需要功能,达到为自己量身定制的功能. Nginx("engine x")是一个高性能的HTT

Nginx反向代理、缓存、负载均衡服务器构建

代理服务可简单的分为正向代理和反向代理: 正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务器的HTTP请求先发送到代理服务器上,然后由代理服务器去访问Web服务器, 并将Web服务器的Response回传给客户端: 反向代理: 与正向代理相反,如果局域网向Internet提供资源,并让Internet上的其他用户可以访问局域网内资源, 也可以设置一个代理服务器, 它提供的服务就是反向代理. 反向代理服务器接受来