Nginx+uWSGI为Django提供高并发

2020-11-09 11:29:23 浏览数 (1)

Nginx uwsgi部署Django

#0 GitHub

代码语言:javascript复制
None

#1 环境

代码语言:javascript复制
CentOS6.9 ( 腾讯云服务器 )
Python 3.6.4
Django==2.0.7

#2 开始

#2.1 新建一个Django项目

项目根目录(把django项目放在opt目录下)

代码语言:javascript复制
/opt/pro

#2.2 项目结构

工程名:pro app名:app

代码语言:javascript复制
.
├── app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── pro
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── templates

#2.3 修改settings.py

因为不涉及到数据库,所以把数据库配置删掉

代码语言:javascript复制
#DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

允许所有url访问

代码语言:javascript复制
ALLOWED_HOSTS = ["*"]

#3 uwsgi

#3.1 安装uwsgi

代码语言:javascript复制
pip3 install uwsgi

#3.2 使用uwsgi启动django项目

安装django

代码语言:javascript复制
pip3 install django==2.0.7

进入项目根目录(/opt/pro)

代码语言:javascript复制
cd /opt/pro/ 
uwsgi --http 0.0.0.0:8080 --file pro/wsgi.py --static-map=/static=static

解释上述命令

代码语言:javascript复制
--http 0.0.0.0:8080 # 指定ip,因为我用的是云服务器,所以是0.0.0.0,如果用的是虚拟机,把0.0.0.0改成虚拟机内网ip(猜测,没有实践过)
--file pro/wsgi.py # 指定django项目中wsgi.py文件
--static-map=/static=static # 静态文件

#3.3 使用uwsgi配置文件启动django项目(重点)

在项目根目录下新建文件夹 script

代码语言:javascript复制
cd /opt/pro/ 
mkdir script

在script目录下新建 uwsgi.ini

代码语言:javascript复制
cd script
vim uwsgi.ini

填入以下内容

代码语言:javascript复制
# uwsig使用配置文件启动                                                                                                    
[uwsgi]                                                                                                                    
# 项目目录                                                                                                                 
chdir=/opt/pro/                                                                                                            
# 指定项目的application                                                                                                    
module=pro.wsgi:application                                                                                                
# 指定sock的文件路径                                                                                                       
socket=/opt/pro/script/uwsgi.sock                                                                                          
# 进程个数                                                                                                                 
workers=5                                                                                                                  
pidfile=/opt/pro/script/uwsgi.pid                                                                                          
# 指定IP端口 云服务器需要改成 0.0.0.0                                                                                      
http=0.0.0.0:8080                                                                                                          
# 指定静态文件                                                                                                             
static-map=/static=/opt/pro/pro/static                                                                                     
# 启动uwsgi的用户名和用户组                                                                                                
uid=root                                                                                                                   
gid=root                                                                                                                   
# 启用主进程                                                                                                               
master=true                                                                                                                
# 自动移除unix Socket和pid文件当服务停止的时候                                                                             
vacuum=true                                                                                                                
# 序列化接受的内容,如果可能的话                                                                                           
thunder-lock=true                                                                                                          
# 启用线程                                                                                                                 
enable-threads=true                                                                                                        
# 设置自中断时间                                                                                                           
harakiri=30                                                                                                                
# 设置缓冲                                                                                                                 
post-buffering=4096                                                                                                        
# 设置日志目录                                                                                                             
daemonize=/opt/pro/script/uwsgi.log 

启动uwsgi

代码语言:javascript复制
cd /opt/pro/script/ 
uwsgi --ini uwsgi.ini # 启动uwsgi

uwsgi相关操作

代码语言:javascript复制
uwsgi --ini uwsgi.ini # 启动
uwsgi --stop uwsgi.pid # 关闭

#4 Nginx

#4.1 安装Nginx

配置yum源

代码语言:javascript复制
vim /etc/yum.repos.d/nginx.repo
代码语言:javascript复制
[nginx]
name=nginx repo
# 下面这行centos根据你自己的操作系统修改比如:OS/rehel
# 6是你Linux系统的版本,可以通过URL查看路径是否正确
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

安装nginx

代码语言:javascript复制
yum -y install nginx

测试是否安装完成,命令启动nginx

代码语言:javascript复制
/etc/init.d/nginx start

#4.2 Django Uwsgi Nginx

创建配置文件

代码语言:javascript复制
cd /etc/nginx/conf.d/
vim pro.conf
代码语言:javascript复制
server {                                                                                                               
        listen 80;                                            
        server_name 192.144.190.22; # 如果服务器已经被域名解析,必须填域名                        
        access_log  /var/log/nginx/access.log  main;                                                           
        charset  utf-8;                                                 
        gzip on;                                              
        gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;                          
        error_page  404           /404.html;                                                                   
        error_page   500 502 503 504  /50x.html;          
        # 指定项目路径uwsgi                                      
        location / {                                            
            include uwsgi_params;                  
            uwsgi_connect_timeout 30;                               
            uwsgi_pass unix:/opt/pro/script/uwsgi.sock;              
        }                                                        
        # 指定静态文件路径                                       
        location /static/ {                                    
            alias  /opt/pro/pro/static/;                                            
            index  index.html index.htm;                               
        }   
    }

完美 !!!

Nginx相关命令

代码语言:javascript复制
/etc/init.d/nginx start # 开始
/etc/init.d/nginx stop # 关闭
/etc/init.d/nginx restart # 重启

#5 注意

  • 用Nginx uwsgi部署django,必须Nginx和uwsgi都启动

#6 番外篇

#1 uWSGI

# 启动django
代码语言:javascript复制
# file : Django项目中wsgi.py文件路径
uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py
# uWSGI参数

参数

说明

http

地址和端口号,例如:uwsgi --http 0.0.0.0:8000

socket

地址和端口号,例如:uwsgi --socket :8001

listen

设置socket的监听队列大小(默认:100)

processes

开启的进程数量

workers

开启的进程数量,等同于processes

threads

运行线程(processes的线程数)

master

允许主进程存在,启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。

daemonize

使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。

log-maxsize

以固定的文件大小(单位KB),切割日志文件

pidfile

指定pid文件的位置,记录主进程的pid号。

chdir

指定运行目录

wsgi-file

载入wsgi-file

stats

在指定的地址上,开启状态服务

vacuum

当服务器退出的时候自动清理环境,删除unix socket文件和pid文件

disable-logging

不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。如果不开启这项,那么你的日志中会大量出现这种记录

  • http 和 socket 的区别

http : nginx 和 uwsgi 中间走的是 http 协议,文本

socket : nginx 和 uwsgi 中间走的是 wsgi 协议,二进制

生产环境百分之九十九是 unix Socket 的方式,ngnix 是做反向代理用的,因为 uwsgi 不具备路由、过滤等方向代理功能,但论执行效率,可以做性能测试,如果是 http 协议的话,性能是没有 unix Socket 方式好的

# uWSGI 加进程启动Django
代码语言:javascript复制
# 添加4个进程,每个进程2个线程

uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2

#2 Nginx

未完待续…

0 人点赞