# 部署
Django 项目正式部署时的推荐步骤:
- 用 Django 自带的测试服务器运行 Django 项目。
- 如果能成功启动则证明项目正常,可以停止运行它。因为测试服务器的功能少,性能低,只适用于测试环境。
- 用 uWSGI 服务器运行 Django 项目。
- 此时可用于正式环境。
- 此时,uWSGI 负责记录网站的 access 日志,Django 本身只输出报错和主动记录的日志。
- 用 Nginx 代理 uWSGI 和静态文件,提高处理静态文件的效率。
- 此时,客户端应该统一访问 Nginx 。当 Nginx 收到 HTTP 请求时,如果是请求静态文件,就直接寻找相应文件作出 HTTP 响应。否则转发给 uWSGI 处理,然后得到 uWSGI 的响应报文,返回给客户端。
- 可以部署多个 uWSGI ,由 Nginx 代理,实现负载均衡。
# 部署 uWSGI
安装:
yum install gcc python3-devel mailcap pip install uwsgi
进入项目的根目录,创建一个 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
命令:
uwsgi # 启动 uWSGI(默认以 daemon 方式运行) uwsgi --ini etc/uwsgi.ini # 使用指定的配置文件启动 uWSGI uwsgi --stop etc/uwsgi.pid # 停止(根据 pid 文件) uwsgi --reload etc/uwsgi.pid # 重启
# 部署 Nginx
进入项目的根目录,收集静态文件:
python manage.py collectstatic --no-input
在 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; } }
启动 uWSGI 服务器之后,再启动 Nginx :
nginx -c etc/nginx.conf # 启动服务器 -s quit # 停止服务器