基于阿里云平台负载均衡的 Django 部署(CentOS 7)

Django 配置

(可选)配置信息读取方式尽量使用从配置文件中读取而非从环境变量中读取,本文认为示例配置文件为 config.example.ini 正式配置文件为 config.ini

打开 Django 的获取转发信息的配置项

1
2
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

配置好数据库(数据库应该是位于独立服务器上的数据库或类似于 RDS 的云数据库)

配置好 Cache (同上)

配置好 Session Engine(建议使用 Cache)

1
2
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

将相关域名放入 ALLOWED_HOSTS 配置中

收集静态文件

1
./manage.py collectstatic

阿里云负载均衡配置

这里官方文档写的比较详细了,需要注意的是一定在「附加HTTP头字段」里面选中「通过X-Forwarded-For头字段获取客户端真实 IP」和「通过X-Forwarded-Proto头字段获取SLB的监听协议」

在「后端服务器」设置中配置好后端端口即可,本文以「23301」为例

健康检查如果开启,需要注意 Host 写一个位于「ALLOWED_HOSTS」中的 Host,或者将负载均衡的 IP 地址加入配置文件

配置建议
为了安全,建议只设定好 HTTPS 转发并选择只支持 TLS1.2 以上,然后将 HTTP 流量通过负载均衡直接重定向到 HTTPS

安装 nginx

1
yum install nginx

安装 Python、pip、virtualenv

这里以 Python3.6 的安装为例,实际安装版本请与开发环境保持一致

1
2
3
4
5
6
7
8
yum install epel-release
yum install https://centos7.iuscommunity.org/ius-release.rpm
yum install python36u
ln -s /bin/python3.6 /bin/python3
yum install python36u-pip
ln -s /bin/pip3.6 /bin/pip3
pip3 install pip --upgrade
pip3 install virtualenv

使用以下命令测试安装情况并检查版本

1
2
3
python3 --version
pip --version
virtualenv --version

网站配置

假设网站域名为 test.site,所有文件均存在于 /www/test.site

进入此目录,执行下面的命令来配置环境并安装依赖

1
2
virtualenv --python=python3.6 venv
source venv/bin/activate

安装依赖

1
2
pip install -r requirements.txt
pip install gunicorn

配置 gunicorn

/etc/systemd/system 文件夹中新建 test-site.service 文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=test.site Gunicorn for Django
After=network.target

[Service]
User=www-data # 这里修改为有权限访问网站根目录的用户
Group=www-data # 这里修改为有权限访问网站根目录的用户组
WorkingDirectory=/www/test.site
Environment="PATH=/www/test.site"
ExecStart=/www/test.site/venv/bin/gunicorn --workers 5 --bind unix:/var/run/test.site.socket test_proj.wsgi:application # 将 test_proj 替换为你的 Django 项目名称

[Install]
WantedBy=multi-user.target

配置 nginx

/etc/nginx/conf.d 文件夹中新建文件 test.site.conf,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
charset utf-8;
listen 23301;
server_name test.site;

location / {
proxy_set_header Host $host;
proxy_pass http://unix:/var/run/test.site.socket;
}

location /static {
alias /www/test.site/static;
}
}

需要注意 proxy_pass 中的 unix:/var/run/test.site.socket 应与上面 service 文件中 ExecStart--bind 后参数保持一致

检查配置文件是否正常

1
nginx -t

重启 nginx 服务器

1
nginx -s reload