uWSGI+django+nginx部署流程及原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38684419/article/details/83661615

在进行部署的时候不知道走了多少坑。走通过后才发现原来也就是那么回事,说难也不难,说简单也确实有很多坑。

部署环境

系统:Centos7

Python: python3.6.5

Django:Django2.1

web服务器:Nginx

应用程序服务器:uWSGI

一、原理讲解

在项目开发阶段用runserver运行起来的服务器只是一个简单的服务器,它在处理高并发的时候回发生严重的丢包现象,最总要的是在Debug改为False后这个服务器无法返回静态文件。所以必须改为使用web服务端进行静态文件的返回。Nginx又是一个高性能的反向代理服务器。下面讲解Nginx,uWSGI, WSGI等的关系。

1.WSGI

WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器,python模块,框架或者API。它只是一个描述Web服务器如何与web应用程序的通信规范

2.uWSGI

uWSGI是一个全功能的HTTP服务器,它实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化为语言支持的网络协议。比如吧HTTP协议转化为WSGI协议,让python程序可以直接使用。

uwsgi与WSGI一样是一个uWSGI服务器的独占通信协议,用于定义传输信息的类型。每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西。

3.Nginx

Nginx是一个高性能代理服务器,其中的HTTP服务器功能和uWSGI功能很类似,但是Nginx还可以用作更多用途,比如最常用的反s向代理功能。

4.wsgi.py

Django项目带的wsgi接口文件。

5.执行流程

  1. 当客户端发送请求时,会先请求我们的web服务器即Nginx。
  2. Nginx做为对外的服务接口,接受到客户端发送的请求后对其进行解包分析。如果是静态文件请求就直接返回请求的静态文件。
  3. 如果是动态的请求,Nginx就通过配置文件,将请求传递给uWSGI,uWSGI将接受到的包进行处理,并转发给wsgi
  4. wsgi根据请求调用想要的处理程序。程序处理完成后将数据返回给wsgi
  5. wsgi接受后将数据打包转发给uWSGI
  6. uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端

图解如下:

二、安装与配置

1.部署前的准备:

首先确保你的Django项目已经完成。并将其settings的DEBUG改为True,ALLOWED_HOSTS也要加入允许访问的地址。确保已经成功安装Nginx服务器。Ubuntu下sudo apt-get install nginx。Centos下sudo yum install nginx。接着部署Django运行环境,我建议是运行到虚拟环境下。至于虚拟环境的安装配置请查考virtualenv或者virtualenvwrapper。

pip install uwsgi。验证uWSGI,新建test.py文件

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

运行:

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

浏览器访问,网页能显示 Hello Django 说明uWSGI运行正常。

如果端口占用,查看端口占用的进程号(lsof是一个列出当前系统打开文件的工具,Ubuntu自带这个工具,Centos需要安装yum install lsof)如果不想装可以使用netstat -lnp | grep 8000查看

lsof -i :8000

找PID,杀死进程

sudo kill -9 pid

2.配置uwsgi

我都放在项目的根目录下了,在项目的根目录下建立uwsgi.ini文件,写入配置

[uwsgi]

# 通过uwsgi访问django需要配置http
# 通过Nginx请求uwsgi访问Django需要配置成socket,这里设置uwsgi端口号为9000
socket = :9000

# web项目根目录
chdir = /home/hph/py/dailyfresh

# module指定项目的wsgi文件,项目名.wsgi
module = dailyfresh.wsgi

# 允许存在主进程
master = true

# 开启进程数量
processes = 2

# 开启的线程数量
threads = 2

# 服务器退出后自动清理环境
vacuum = true

# uWSGI日志
daemonize = /home/hph/py/dailyfresh/uwsgi.log

启动uwsgi

uwsgi --ini uwsgi.ini

3.配置Nginx

为了不修改默认的配置文件我在/etc/nginx/conf.d/下新建了一个df.conf的配置文件,写入如下内容

server {
    listen 8088;
    #listen [::]:8088;
    #server_name 127.0.0.1
    #charset utf-8;
    # 接受请求日志
    access_log  /etc/nginx/conf.d/log/access.log;
    # 错误日志
    error_log  /etc/nginx/conf.d/log/error.log;

    location / {
        include /etc/nginx/uwsgi_params;
        # 指定uwsgi运行的端口
        uwsgi_pass 127.0.0.1:9000;
    }

    location /static/ {
        alias  /home/hph/py/dailyfresh/collect_static/;
    }
}

其中listen是Nginx监听的端口。uwsgi_pass是Nginx反向代理到uwsgi的端口,这个端口一定要对应,否则重启Nginx会报错。

然后重启Nginx服务

systemctl restart nginx  // Centos重启
service nginx restart  // Ubuntu重启

在Nginx上可以配置负载均衡, 常用的负载均和策略有轮询,加权轮询,ip hash,

三、结束

到这里就算部署完成了,可以在浏览器上访问Nginx监听的端口。如果静态文件没有加载 可能是由于权限不够。Nginx默认的用户是nginx,可以用chown命令将静态文件的访问权限给nginx,或者可以直接将Nginx的用户改为root,在/etc/nginx/nginx.conf的第一行有一个user 将后面的nginx改为root就行了。我还看过一种是静态文件无法加载返回的状态码500,可以检查settings.py里的DEBUG是否为False。

猜你喜欢

转载自blog.csdn.net/qq_38684419/article/details/83661615