centos7下 django+uwsgi+nginx

一、前言

在工作中 写了一个小的 django项目,需要上线,考虑使用 uwsgi+nginx ,就对部署过程进行总结一下。

二、理论铺垫

1、为什么要用 uwsgi+nginx

一个成熟的站点提供服务,需要 Web 服务器 [静态数据] 和 App 服务器[动态数据]
Web 服务器目前属 Nginx 最强大,请求代理过来后,把数据返回给请求客户端,但是目前的互联网发展时代,都是包含动态数据处理的,这样一般 Nginx 不处理业务逻辑,就外包给后端的 App 服务器,这里就是你的 django 服务器。

2、python manage.py runserver 启动方式

平时开发的时候 大家都基本上启动服务都是通过 python manage.py runserver 去直接启动项目,那为什么上线就不可以通过这种方式启动呢?

大佬源码解析:https://blog.csdn.net/Aifore/article/details/86721626

从上可以看到,其实通过 python manage.py runserver 开启也是 django内置的web服务器是封装的wsgiref,是一个用于开发调试的简易服务器。此服务器和uwsgi都符合wsgi协议,当然是可以实现你的需求。但是性能肯定是很低的。

3、uWSGI

1、wsgi:
	一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
	利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;
2、uwsgi:
	同WSGI一样是一种通信协议
3、uwsgi协议:
	是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。
4、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服务器进行交换。

参考大佬文章:https://blog.csdn.net/c465869935/article/details/532421262

4、WSGI的工作原理,从http原始请求到web框架的处理过程

http的请求 - 响应过程,简单而言,就是浏览器向服务器发送请求,服务器处理请求并返回响应给浏览器展示。
这个请求 - 响应的过程具体是如何实现的呢?整个过程,如下图所示。
在这里插入图片描述

参考大佬文章:https://blog.csdn.net/qq_39378657/article/details/107302561

5、项目流程和每个组件的用途

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

6、作用

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

三、安装与配置

1、安装 nginx

yum install nginx 

2、安装 uwsgi

pip3 install uwsgi

四、项目配置

1、django项目配置

1、setting.py 文件配置

# 用于收集静态文件
STATIC_ROOT = '/usr/share/nginx/dpia/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

2、运行 python manage.py collectstatic
通过运行上边代码就可以从 /usr/share/nginx/dpia/static/ 目录下看到你的静态文件
在这里插入图片描述

2、配置 uwsgi

1、项目地址:/opt/dpia
2、uwsg.ini 文件地址 /opt/dpia/uwsgi.ini
在这里插入图片描述
3、uwsg.ini 文件内容

[uwsgi]
# 项目目录
chdir = /opt/dpia
# 指定sock的文件路径,用于和 nginx 进行数据交互的端口,一定要和nginx配置保持一致!!
socket = 127.0.0.1:8082
# 指定项目的application
module = dpia.wsgi
# 启用主进程
master = true
# 进程数量
processes = 10
# 配置每个进程的线程数
threads = 2
max-requests = 2000
# 前后端传输数据大小
buffer-size = 65536
# 指定uWSGI日志的存储路径
daemonize = /opt/dpia/uwsgi.log
# 服务启动 pid 
pidfile = /opt/dpia/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum = true

3、uwsgi操作命令

# 后台运行
uwsgi -d --ini uwsgi.ini
# 单纯启动  
uwsgi --ini uwsgi.ini

# 查看对应程序的进程号码
ps aux|grep uwsgi

# 关闭
uwsgi --stop uwsgi.pid

# 杀死进程
pkill -f uwsgi -9

# 重启uwsgi
uwsgi --reload uwsgi.pid

4、配置 nginx

1、文件路径:/etc/nginx/conf.d/dpia.conf
2、文件内容

server {
    
    
    # 启动的nginx进程监听请求的端口
    listen      80;
    #定义使用域名访问
    server_name  localhost;  
    charset     utf-8;
	access_log  /etc/nginx/logs/dpia_access.log;
	error_log  /etc/nginx/logs/dpia_error.log;

    # max upload size  
    client_max_body_size 75M;    # adjust to taste
	
    # 静态文件访问的url
    location /static/ {
    
    
        # 指定静态文件存放的目录
        alias /usr/share/nginx/dpia/static/;
    }
    #location /static/ {
    
    
       #try_files $uri /usr/share/nginx/dpia/static/;
   # }

#  将所有非媒体请求转到Django服务器上
    location / {
    
    
        # 包含uwsgi的请求参数,路径为uwsgi_params绝对路径
        include  /etc/nginx/uwsgi_params; 
        # 转交请求给uwsgi
        uwsgi_pass  127.0.0.1:8082; 
    }
}

3、nginx命令

nginx -t
nginx -s reload

五、总结

总体不是特别难,注意小细节。

猜你喜欢

转载自blog.csdn.net/weixin_42812527/article/details/115463663