Django REST framework 部署实战

2,072

写在前面

前面的文章说了很多有关于 DRF 的功能的介绍与使用。但是作为一个项目显然是不完善了,服务最终是要上线面向用户的。 Django 默认提供的运行方式,仅能满足日常开发、调试。当然 Django 为我们提供了一套比较完善的部署方式。下面就就一起看看目前比较流行的部署方式。

正文开始

说到 Web 服务的部署可能都绕不开 Nginx 这个代理工具。 Nginx的作用一般分为正向代理与反向代理,在一般的 Web 程序开发中多数情况是用来做反向代理,主要的作用有隐藏业务服务器、负载均衡等。 下图就展示反向代理大致的逻辑。

image.png

下面部署方式使用 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 更多的功能可能需要运维参与配置。

参考文档