# 使用Nginx+uWSGI部署Django项目
Django是一个功能全面、高效且安全的Web框架，旨在帮助开发者快速构建高性能、安全且可维护的Web应用程序。本文主要介绍如何在Linux服务器中使用Nginx+uWSGI部署Django项目。
#### 前提条件·
- 已购买一台弹性云服务器，且为其绑定弹性公网IP。
- 操作系统为CentOS 7/8、Ubuntu 22/10/18、Huawei Cloud EulerOS 2.0。
- 弹性云服务器所在安全组添加了如下表所示的安全组规则，具体步骤参见[为安全组添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
  表1安全组规则 
  | 方向     | 优先级   | 策略  | 类型     | 协议端口        | 源地址         |
  |:---|:---|:---|:---|:---|:---|
  | 入方向    | 1     | 允许  | IPv4   | TCP: 22     | 0.0.0.0/0   |
  | 入方向    | 1     | 允许  | IPv4   | TCP: 80     | 0.0.0.0/0   |
  | 入方向    | 1     | 允许  | IPv4   | TCP: 8001   | 0.0.0.0/0   |
  | 入方向    | 1     | 允许  | IPv4   | TCP: 8002   | 0.0.0.0/0   |
  | 入方向 | 1 | 允许 | IPv4 | TCP: 8003 | 0.0.0.0/0 |
     
  
- 为了更好地获取和更新系统和软件，建议您更新镜像源为华为云镜像源，详细操作，请参见[如何使用华为云开源镜像配置yum源(x86_64和鲲鹏)？](https://support.huaweicloud.com/ecs_faq/zh-cn_topic_0118948562.html)。
 
#### 操作步骤
1. 登录弹性云服务器。 
   具体操作请参见[Linux ECS登录方式概述](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0013771089.html)。
   
   
2. 搭建Python环境。具体操作请参见[搭建Python环境](https://support.huaweicloud.com/bestpractice-ecs/ecs_bp_6008.html)。
3. 已安装Nginx。具体操作请参见[搭建LNMP环境](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0000001956778633.html)。
4. 部署uWSGI。 
   1. 执行以下命令，安装uWSGI。
      ```
      sudo pip3 install uwsgi
      ```
      回显信息如下所示，表示uWSGI已安装成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002248722796.png "点击放大")
      
   
   2. 执行以下命令，创建测试目录。 本示例以创建/home/myblog目录为例，您可以根据需求自定义文件路径。
      ```
      sudo mkdir /home/myblog
      ```
      
   
   3. 执行以下命令，创建并编辑测试程序文件test.py。
      ```
      cd /home/myblog
      sudo vim test.py
      ```
      
   
   4. 按**i** 键进入编辑模式，将以下内容复制到文件中。
      ```
      def application(env,start_response):
              start_response('200 ok',[('Content-Type','text/html')])
              return [b"Hello World"]
      ```
      
   
   5. 按**Esc** 键，输入**:wq** ，按**Enter**键关闭并保存配置文件。
   
   6. 执行以下命令，测试运行访问。
      - CentOS 7/8
        ```
        sudo /usr/local/bin/uwsgi --http :8001 --wsgi-file test.py
        ```
        
      
      - Ubuntu 18/20/22
        ```
        sudo uwsgi --http :8001 --wsgi-file test.py
        ```
        
      
      
      回显信息如下图所示。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002248948100.png "点击放大")
      
   
   7. 使用浏览器访问"http://*服务器IP地址:8001* "，显示如下页面，说明环境搭建成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002283907437.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/notice_3.0-zh-cn.png)
      在运行test.py命令执行期间才可以正常通过8001访问内容，访问期间会新增如下回显。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002410186394.png "点击放大")
      
   
   
   
   
5. 部署Django。 
   1. 执行以下命令，安装Django。
      ```
      sudo pip3 install Django
      ```
      回显信息如下图所示。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002248949744.png "点击放大")
      
   
   2. 执行以下命令，创建项目。 本示例以创建项目文件django_project为例，您可以根据需求自定义文件夹。
      ```
      sudo /usr/local/bin/django-admin startproject django_project
      ```
      
   
   3. 执行以下命令，编辑settings.py文件。
      ```
      sudo vim /home/myblog/django_project/django_project/settings.py
      ```
      1. 按**i**键进入编辑模式。
      
      2. 将ALLOWED_HOSTS = \[ \]属性修改成如下值：
         ```
         ALLOWED_HOSTS = ["*"]
         ```
         表示允许任何IP地址访问，否则访问会被拒绝，具体以您实际环境为准。
         ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002248795744.png "点击放大")
         
      
      3. 将DATABASES中的内容注释。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002283836825.png "点击放大")
         ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
         DATABASE用于指定Django项目的数据库设置，此次未使用数据库，因此注释。部署时以实际情况为准，按需配置。
         
      
      4. 修改完成后，按**Esc** 键，输入**:wq**保存并退出文件。
       
   
   4. 执行以下命令，启动Django环境。
      ```
      cd /home/myblog/django_project
      sudo python3 manage.py runserver 0.0.0.0:8003
      ```
      此处端口号可以自由配置，下一步访问时按执行命令中的端口号访问。
      
   
   5. 使用浏览器访问"http://*服务器IP地址:8003* "，即可访问相关Django页面。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002410044338.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      在启动Django环境期间才可以正常通过8003访问内容。
      
   
   
   
   
6. 配置nginx+uwsgi+Django应用集成。 
   1. 执行以下命令，打开Nginx配置文件。
      - CentOS 7/8
        ```
        sudo vim /etc/nginx/nginx.conf
        ```
        
      
      - Ubuntu 22/20/18
        ```
        sudo vim /etc/nginx/sites-enabled/default
        ```
        
       
   
   2. 按**i** 键进入编辑模式，在server中修改或添加以下参数。
      ```
      upstream django { 
              server 127.0.0.1:8001;   #具体端口必须与您uWSGI配置文件中定义的端口一致 
          } 
          server { 
              listen       8002;    #设置的访问端口 
              server_name  test; 
              charset      utf-8; 
              location /static { 
                  autoindex on;     # 启用目录列表 
                  alias /home/myblog/django_project/static; # 静态文件的绝对路径。请根据实际情况修改这个路径。 
              } 
       
              location / { 
                   
                  uwsgi_pass 127.0.0.1:8001;  # 将请求传递给uWSGI服务器，这里的地址与upstream块中的定义相匹配。 
                  include uwsgi_params;   # 包含 uwsgi 参数配置 
                  include /etc/nginx/uwsgi_params;  # Nginx自带的uWSGI参数文件，具体目录请根据实际情况修改 
                  index index.html index.htm;   # 指定默认的索引文件。 
                  client_max_body_size 35m; 
              } 
          }
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002444412713.png "点击放大")
      
   
   3. 编辑完成后，按**Esc** 键，输入**:wq**保存并退出文件。
   
   4. 执行以下命令，创建日志目录，uWSGI 将会作为守护进程在后台运行，并将它的输出重定向到这个日志文件中。
      ```
      sudo mkdir -p /var/log/uwsgi/
      ```
      
   
   5. 执行以下命令，新建uWSGI配置文件uwsgi_config.ini。
      ```
      sudo vim uwsgi_config.ini
      ```
      
   
   6. 按**i** 键进入编辑模式，在文件中配置以下参数。
      ```
      [uwsgi] 
      socket = 127.0.0.1:8001  #此处的8001端口需要和nginx配置文件中定义的uwsgi_pass端口一致。 
      chdir = /home/myblog/django_project/  #指定项目目录，根据您的实际项目修改该路径。  
      wsgi-file = django_project/wsgi.py   #指定Django的wsgi file文件，根据项目修改。 
      processes = 4  #最大工作进程。 
      threads = 2  #每个工作进程processes启动后开启的线程个数。 
      vacuum = true  #环境退出时自动清理。 
      buffer-size = 65536  #设置用于uwsgi包解析的内部缓存区大小为64k，默认是4k。 
      daemonize = /var/log/uwsgi/uwsgi_project.log  #日志文件路径，请确保此路径可写。根据您的实际项目修改该路径。 
      enable-threads = true  #确保线程支持已启用。
      ```
      
   
   7. 编辑完成后，按**Esc** 键，输入**:wq**保存并退出文件。
   
   
   
   
7. 验证。 
   1. 执行以下命令，重启Nginx服务。
      ```
      sudo systemctl restart nginx
      ```
      
   
   2. 执行以下命令，启动uWSGI服务。
      - CentOS 7/8
        ```
        uwsgi --ini uwsgi_config.ini
        ```
        
      
      - Ubuntu 22/20/18
        ```
        sudo uwsgi --ini uwsgi_config.ini
        ```
        
      
      
      回显信息如下。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002284112077.png "点击放大")
      可以通过**netstat -tuln\| grep 8002**观察到8002端口已配置成功，处于监听中状态。
      ```
      sudo netstat -tuln | grep 8002
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002410063556.png "点击放大")
      
   
   3. 使用浏览器访问"http://*服务器IP地址:8002* "，即可访问相关Django页面。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002410226596.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/caution_3.0-zh-cn.png)
      以上相关配置仅用于测试演示，业务环境请谨慎使用。
      
   
   
   
   
 
