# 部署

Django 项目正式部署时的推荐步骤:

  1. 用 Django 自带的测试服务器运行 Django 项目。
    • 如果能成功启动则证明项目正常,可以停止运行它。因为测试服务器的功能少,性能低,只适用于测试环境。
  2. 用 uWSGI 服务器运行 Django 项目。
    • 此时可用于正式环境。
    • 此时,uWSGI 负责记录网站的 access 日志,Django 本身只输出报错和主动记录的日志。
  3. 用 Nginx 代理 uWSGI 和静态文件,提高处理静态文件的效率。
  • 此时,客户端应该统一访问 Nginx 。当 Nginx 收到 HTTP 请求时,如果是请求静态文件,就直接寻找相应文件作出 HTTP 响应。否则转发给 uWSGI 处理,然后得到 uWSGI 的响应报文,返回给客户端。
  • 可以部署多个 uWSGI ,由 Nginx 代理,实现负载均衡。

# 部署 uWSGI

  1. 安装:

    yum install gcc python3-devel mailcap
    pip install uwsgi
    
  2. 进入项目的根目录,创建一个 etc 目录,再创建一个配置文件 etc/uwsgi.ini ,内容如下:

    [uwsgi]
    http      = 0.0.0.0:80                # 监听来的 IP 地址、端口号
    # socket  = 127.0.0.1:79              # 采用 socket 方式访问(这样被 Nginx 代理时更快)
    chdir     = /root/django              # 工作目录,这里是 Django 项目的根目录
    wsgi-file = %(chdir)/mysite/wsgi.py   # 指定 wsgi.py 文件
    
                                          # 以下为可选配置
    daemonize = %(chdir)/etc/uwsgi.log    # 将 uWSGI 作为守护进程运行,并将日志保存在该路径
    pidfile   = %(chdir)/etc/uwsgi.pid    # pid 文件的保存路径
    
    stats     = 127.0.0.1:9191            # 启用 uWSGI 的 stats 服务器,访问它可以查看状态信息
    home      = %(chdir)/.venv            # 指定 Python 解释器的安装目录
    processes = 2                         # 让 uWSGI 启动 2 个进程(称为 worker )
    threads   = 2                         # 每个 worker 创建 2 个线程
    max-requests = 2000                   # 每个 worker 最多处理多少个请求
    
    # 自定义路由
    route     = ^/index.html$      rewrite:/index         # 将目标 URL 与 ^/index.html$ 正则匹配的 HTTP 请求重定向到 /index
    route     = ^/upload    http:127.0.0.1:79
    route     = ^/index     static:/opt/django/index.html # 将路由转发到单个静态文件
    
    # 映射静态文件目录
    static-map = /images=/var/www/img
    static-map = /images=/var/www/img2    # 可以重复映射同一个 URL
    
  3. 命令:

    uwsgi                           # 启动 uWSGI(默认以 daemon 方式运行)
    uwsgi --ini etc/uwsgi.ini       # 使用指定的配置文件启动 uWSGI
    uwsgi --stop etc/uwsgi.pid      # 停止(根据 pid 文件)
    uwsgi --reload etc/uwsgi.pid    # 重启
    

# 部署 Nginx

  1. 进入项目的根目录,收集静态文件:

    python manage.py collectstatic --no-input
    
  2. 在 Nginx 的配置文件 etc/nginx.conf 中加入配置:

    server {
        listen  80;
    
        # 设置网站的根目录
        location / {
            include    /etc/nginx/uwsgi_params;   # 连接 uWSGI 时的配置文件
            uwsgi_pass    127.0.0.1:79;           # 将 HTTP 请求转发给 uWSGI
        }
    
        # 设置静态文件的目录
        location /static {
            root /root/django;
        }
    }
    
  3. 启动 uWSGI 服务器之后,再启动 Nginx :

    nginx -c etc/nginx.conf           # 启动服务器
                            -s quit   # 停止服务器