这是我参与更文挑战的第24天,活动详情查看: 更文挑战
写在前面
前面的文章说了很多有关于 DRF 的功能的介绍与使用。但是作为一个项目显然是不完善了,服务最终是要上线面向用户的。 Django 默认提供的运行方式,仅能满足日常开发、调试。当然 Django 为我们提供了一套比较完善的部署方式。下面就就一起看看目前比较流行的部署方式。
正文开始
说到 Web 服务的部署可能都绕不开 Nginx 这个代理工具。 Nginx的作用一般分为正向代理与反向代理,在一般的 Web 程序开发中多数情况是用来做反向代理,主要的作用有隐藏业务服务器、负载均衡等。
下图就展示反向代理大致的逻辑。
下面部署方式使用 Uwsgi + Nginx 部署项目
1. Uwsgi 部署
uWSGI 致力于为构建一个全栈式的托管服务。应用服务器(多种编程语言和协议),代理,进程管理器和监视器 全部都以通用 api 和通用配置风格实现了。多说一句:名字中的 “WSGI” 部分是对 Python 标准中的同名一个东西的致敬,因为它 是这个项目的第一个开发的插件。多功能,高性能,占用资源少和可靠性是这个项目的优势(也是唯一遵循的规则)。
环境准备
# 安装 uwsgi
pipenv install uwsgi
# 查看 uwsgi 版本
uwsgi --version
# 2.0.19.1
复制代码
静态文件准备
# demo/settings.py 新增配置文件
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 执行收集静态文件
python manage.py collectstatic
复制代码
新增 uwsgi 配置文件
cat uwsgi.ini
[uwsgi]
http = 0.0.0.0:8080
chdir=./
module=demo.wsgi:application
master=True
pidfile=/tmp/demo-master.pid
vacuum=True
daemonize=./demo.log
static-map = /static=./static
uwsgi --ini uwsgi.ini
复制代码
打开浏览器查看 部署结果 http://127.0.0.1:8080/
注意事项:
invalid request block size: 21573 (max 4096)...skip
原因是因为采用了 socket 方式启动项目。static-map
参数是指定静态资源的路由交由 uwsgi,uwsgi 托管了静态资源。
2. Nginx 部署
Nginx是一个十分轻量级并且高性能HTTP和反向代理服务器,同样也是一个IMAP/POP3/SMTP代理服务器。一句话来说 Nginx 功能很多,性能很好;大多数项目中都用来做网站网络的代理商。
题外话,谈到 Nginx 不得不说 另一款竞品 Apache。这两者的区别可以查看 Apache和Nginx的区别 。
环境准备,安装 Nginx
# Mac 安装 Nginx 配置文件地址 /usr/local/etc/nginx
brew install nginx
# Ubuntu 安装 Nginx
sudo apt-get install nginx
复制代码
修改配置文件,这里 nginx 支持 uwsgi 的转发,所以直接修改 Nginx 的转发规则。
cat uwsgi.ini
[uwsgi]
socket = 127.0.0.1:8001
chdir=./
module=demo.wsgi:application
master=True
pidfile=/tmp/demo-master.pid
vacuum=True
daemonize=./demo.log
static-map = /static=./static
# vi /usr/local/etc/nginx/nginx.conf
# 对应的 server 的配置类似下面,具体的配置文件需要确认
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 配置 uwsgi 转发
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
# root html;
# index index.html index.htm;
}
复制代码
重启 uwsgi nginx,不同环境对应的启动命令可能会有差异,这里演示的是 Mac 的命令。
# 对应的uwsgi的pid 需要与配置文件中指定的相同
uwsgi --reload /tmp/demo-master.pid
# 对于nginx的操作一定要先校验配置文件
nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
nginx -s reload
复制代码
打开浏览器查看 部署结果 http://127.0.0.1:8080/
3. 优化配置
由于 Nginx 对于静态文件的处理效率高,所以需要将静态资源的请求放在 Nginx 。
# 1.删除 uwgsi 静态资源的配置
cat uwsgi.ini
[uwsgi]
socket = 127.0.0.1:8001
chdir=./
module=demo.wsgi:application
master=True
pidfile=/tmp/demo-master.pid
vacuum=True
daemonize=./demo.log
# 2. 修改Nginx的静态资源配置
server {
listen 8080;
server_name localhost;
location /static {
alias /path/to/your/site/static; # 根据自己文件的位置修改
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8081;
}
}
# 3. 重启 uwsgi nginx
uwsgi --reload /tmp/demo-master.pid
nginx -s reload
复制代码
4. 其他配置
关于 Uwsgi Nginx 有着许许多多的配置具体情况需要大家自行查看文档,下面推荐几个网站
由于 Nginx 与 uWSGI 在功能上会有冲突,所以在参数配置的时候 uWSGI 关心的更多是性能上的参数; Nginx 更多的功能可能需要运维参与配置。