通过 uWSGI 部署 Django 项目到云服务器的完整步骤及常见问题
目录
注意事项
本文默认读者已经安装完毕 Python 环境、git、Nginx 以及相应的数据库,同时读者已经将项目托管(无论在哪个平台上,如 GitHub、Gitee……),请在部署之前确认这一点。
本文举的例子(仅针对后端)均监听 8000 端口,请读者根据自己的需求自行更改。
部署步骤
签出项目
这是个非必须步骤,不过建议完成该步骤。
基于当前项目新建一个分支并签出(可以参考该文章)然后推送,建议分支名为 production,然后以下改动均在原分支上修改。
修改前端
在新的分支中(如果有的话,以下不再特别提起)更改前端测试时使用的 URL 至自己的主机的公网 IP(不建议)或者域名。此处笔者采用 axios 完成网络请求,修改 baseURL 至自己的域名,代码看起来如下:
const httpGet = axios.create({
baseURL: 'url',
timeout: 3000
}
)
修改 Django 项目
首先先说明几个在此处可能会出现的错误:
400 ALLOWED_HOSTS 未正确配置。
403 未正确配置 corsheaders 包下的一些配置。
接下来说明步骤:
修改 ALLOWED_HOSTS:添加你的内网 IP 以及如果有的话添加你在 nginx.conf 中配置的 upstream 的 URL(所有字母无论如何小写,稍后会提到)。
修改 CORS_ORIGIN_WHITELIST、CSRF_TRUSTED_ORIGINS 和 CORS_ALLOWED_ORIGINS:添加 http:// 加上内网 IP 以及如果有的话添加域名。
如果你在 nginx.conf 中配置了 upstream,请修改 url.py 文件,在该文件处添加你在 Nginx 中配置的相应 location 的前缀。
配置 Nginx
在你的 nginx.conf 中,添加一个 server 并提供监听的端口,当然这在你配置前端时应该做过这件事了,如果你没有前端那请参照如下:
server {
listen 8000;
server_name ...;
location / {
uwsgi_pass ...;
include /etc/nginx/uwsgi_params
}
}
如果有前端的话相信你的 nginx.conf 应该大致如下:
server {
listen 80;
server_name ...;
location / {
root ...;
try_files $uri $uri/ /index.html;
index index.html;
}
}
那么可以在此基础上进行修改,为 server 添加一个 location 同时为该 location 提供一个转发地址:
upstream xyz {
server ...:8000;
}
server {
listen 80;
server_name ...;
location / {
root ...;
try_files $uri $uri/ /index.html;
index index.html;
}
location /api/ {
proxy_pass http://xyz;
}
}
配置 uWSGI
新建一个文件 uwisg.ini,其内容如下:
[uwsgi]
project = [project_name]
master = true
chdir = [Django 项目根目录]
http = 内网 IP:8000
wsgi-file = [project_name]/wsgi.py
processes = 4
threads = 2
buffer-size = 65536
pidfile = uwsgi.pid(或者任何一个你希望存储 pid 的位置)
daemonize = /var/log/uwsgi.log(或者任何一个你希望存储 log 的位置)
virtualenv = (虚拟环境地址)
记得不要拼错前面属性名的任何一个单词,否则会在 uwsgi 运行时认为找不到 Python 应用。
上服务器!
首先先找到一个你想要放你的项目的目录,本文后续均用 root 表示。
上传项目
还记得你在 GitHub 上面上传了项目吗?把那个项目 clone 下来。
配置虚拟环境
(建议)在 root 下(必须)执行:
virtualenv venv
然后通过 pip install
或者如果有 requirements 的话 pip install -r requirements.txt
安装项目所需要的依赖包。
随后执行 pip install uwsgi --no-cache-dir
,uwsgi 请在全局和虚拟环境中均安装。
上传 uwsgi.ini 以及 nginx.conf
通过 FinalShell 或者别的什么可以上传文件的软件上传你的文件,请注意你的权限问题,如果你使用了非 root 登录,这里提供一种思路:
先上传到用户目录下,然后执行 su root
获取 root 权限,最后通过 cd 命令上传到相应目录,其中:
nginx.conf 上传到 etc/nginx 下,uwsgi.ini 可以任意上传但是建议上传到 root 下。
运行!
启动 Nginx 和 uwsgi:
nginx -c /etc/nginx/nginx.conf
uwsgi --ini root/uwsgi.ini
大功告成!
一个有点扯淡的错误
如果你启动了多个相同 uwsgi 则会报 500 的错误,请按照如下步骤执行:
lsof -i tcp:8000
然后根据显示的进程 pid 进行 kill。此时不要通过 pid 文件进行 kill,那个不是准确的 pid!