Django + Uwsgi + Nginx 实现生产环境部署

uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  1. WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
  2. uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  3. 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
  4. uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

 

uwsgi性能非常高

 

uWSGI的主要特点如下

  1. 超快的性能
  2. 低内存占用(实测为apache2的mod_wsgi的一半左右)
  3. 多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
  4. 详尽的日志功能(可以用来分析app性能和瓶颈)
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

 

Uwsgi 安装使用

#安装最新的稳定版本:
pip install uwsgi
# ... 或者如果您想安装最新的LTS(长期支持)版本,
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

基本测试

创建一个名为 test.py 的文件 :

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

运行

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

用uwsgi 启动django

uwsgi --http :8000 --module mysite.wsgi

可以把参数写到配置文件里

复制代码
[root@centos:]#  cat crazye-uwsgi.ini
 
 
[uwsgi]
http = :9000
# the local unix socket file than commnuincate to Nginx
socket = 127.0.0.1:8001
# 项目目录(完整路径)
chdir = /opt/CrazyEye
# Django  wsgi 文件
wsgi-file = /opt/CrazyEye/CrazyEye/wsgi.py 
# 最大工作进程数
processes
= 4
# thread numbers startched
in each worker process
threads
= 2
# 监控uwsgi状态
stats
= 127.0.0.1:9191
#
clear environment on exit
vacuum
= true
# 设置pid文件
pidfile = /opt/CrazyEye/uwsgi.pid

# 设置日志目录
daemonize= /opt/CrazyEye/uwsgi.log
 
复制代码

启动

uwsgi -ini crazye-uwsgi.ini

重启

uwsgi --reload /opt/CrazyEye/uwsgi.pid

停止

uwsgi --stop /opt/CrazyEye/uwsgi.pid

 

 

Nginx安装使用  

复制代码
[root@lb-node1 ~]# useradd -s /sbin/nologin -M www
[root@lb-node1 ~]# cd /usr/local/src/
[root@lb-node1 src]# wget http://nginx.org/download/nginx-1.15.8.tar.gz
[root@lb-node1 src]# tar xf nginx-1.15.8.tar.gz
[root@lb-node1 src]# cd nginx-1.15.8
[root@lb-node1 nginx-1.10.2]# ./configure --prefix=/usr/local/nginx-1.15.8 \
--user=www --group=www --with-http_ssl_module \
--with-http_stub_status_module --with-file-aio --with-stream
[root@lb-node1 nginx-1.10.2]# make && make install
[root@web-node1 ~]# ln -s /usr/local/nginx-1.15.8/ /usr/local/nginx
## 测试配置并启动Nginx
[root@lb-node1 ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.15.8/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.15.8/conf/nginx.conf test is successful
[root@lb-node1 ~]# /usr/local/nginx/sbin/nginx
复制代码

为你的项目生成Nginx配置文件

您将需要uwsgi_params文件,该文件位于uWSGI发行版的nginx目录中,或者来自https://github.com/nginx/nginx/blob/master/conf/uwsgi_params

将其复制到项目目录中。 稍后我们将告诉nginx引用它。

现在创建一个名为mysite_nginx.conf的文件,并将其放入其中:

复制代码
# mysite_nginx.conf
 
# 上游组件nginx需要连接
upstream django {
    # server unix:///path/to/your/mysite/mysite.sock; # 用于文件套接字
    server 127.0.0.1:8001; # 用于Web端口套接字(我们将首先使用它)
}
 
# 服务器的配置
server {
    # 您的网站将被开放的端口
    listen      8000;
    # 它将服务的域名
    server_name .example.com; # 替换您机器的IP地址或FQDN
    charset     utf-8;
 
    #最大上传大小
    client_max_body_size 75M;   # adjust to taste
 
    # Django media
    location /media  {
        alias /opt/CrazyEye/media;  # 您的Django项目的媒体文件 - 根据需要进行修改
    }
 
    location /static {
        alias /opt/CrazyEye/static; # 您的Django项目的静态文件 - 根据需要进行修改
    }
 
    # 最后,将所有非媒体请求发送到Django服务器。
    location / {
        uwsgi_pass  django;
        include     /usr/local/nginx/conf/uwsgi_params; # 您安装的uwsgi_params文件
    }
}
复制代码

部署静态文件

在运行nginx之前,您必须收集静态文件夹中的所有Django静态文件。 首先你需要编辑mysite/settings.py添加:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

然后运行

python manage.py collectstatic

此时启动Nginx 和Uwsgi,你的django项目就可以实现高并发啦!

posted @   py哥  阅读(390)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示