作者 | 四杆老烟枪
出品 | 脚本之家(ID:jb51net)
linux 服务器中,使用 uwsgi、nginx 部署 django 网站,以及在部署过程中规避较为常见的坑,期望对各位同仁有所帮助。读者须知:本文不再赘述 django、uwsgi、nginx 是什么,baidu有大量文章详细介绍了这些,因此请读者自行了解
创建用例项目
mkdir /www/mysite
cd /www/mysite
# 搭建虚拟环境
python3 -m venv .env
. .env/bin/activate
python -m pip install -U pip
pip install django==3.2 uwsgi
# 创建 Django 项目
django-admin startproject conf .
python manage.py migrate
避坑一:除非项目使用的是全局环境,且全局环境安装了 uwsgi,否则必须在项目虚拟环境中安装 uwsgi。
部署项目时通常不推荐使用全局环境,所以总是得在项目虚拟环境内安装 uwsgi。
修改项目准备部署
# File conf/settings.py
DEBUG = False
ALLOWED_HOSTS = ['*']
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'static'
# 收集静态资源
python manage.py collectstatic
避坑二:部署时一定要将 DEBUG 设置为 False,避免网页响应调试信息,且避免因 django 的静态文件搜索应用拖慢网站的运行效率。
避坑三:修改项目设置文件后,一定要收集静态资源。收集起来的静态资源将在 STATIC_ROOT 目录中,使用 nginx 进行托管。
开始部署
默认读者都已经正确配置了 uwsgi 和 nginx 配置文件,且网站可以正常访问。但是页面如下,查看 nginx 日志如下:
读者可参考附录部分进行 uwsgi 和 nginx 配置文件的配置。
2022/07/25 15:20:45 [error] 39158#39158: *18 open() "/home/one/workspace/projects/www/mysite/static/admin/js/nav_sidebar.js" failed (13: Permission denied), client: 192.168.18.8, server: 192.168.19.18, request: "GET /static/admin/js/nav_sidebar.js HTTP/1.1", host: "192.168.19.18:8000", referrer: "http://192.168.19.18:8000/admin/login/?next=/admin/"
192.168.18.8 - - [25/Jul/2022:15:20:45 +0800] "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 403 196 "http://192.168.19.18:8000/admin/login/?next=/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36 Edg/103.0.1264.71"
从网站页面可知静态文件没有加载或者加载失败,进一步从日志中可以看见 failed (13: Permission denied)
,且静态文件响应 403 状态码。相信你没猜错,这就是遇到了权限问题,nginx 没有权限访问静态资源文件所导致的。只需更改 nginx 用户即可解决,读者可创建新的系统账户作为 nginx 用户,也可使用现有账户,但切记用户拥有访问静态资源文件的权限,更改 nginx 用户如下:
# File: /etc/nginx/nginx.conf
user root;
# 重启 nginx 服务
sudo service nginx restart
避坑四:修改 nginx 用户,使其有权限访问静态资源,不建议使用最高权限账户,如 root。
附录
# File: mysite/uwsgi.ini
[uwsgi]
threads = 2
processes = 1
vacuum = true
master = true
socket = 127.0.0.1:7000
chmod-socket = 660
max-requests = 1000
wsgi-file= conf/wsgi.py
chdir = /www/mysite
logto = %(chdir)/logs/uwsgi.log
pidfile = %(chdir)/logs/uwsgi.pid
stats = %(chdir)/logs/uwsgi.status
# File: /etc/nginx/conf.d/mysite.conf
server {
listen 80;
server_name 192.168.19.18;
root /www/mysite;
error_log /www/mysite/logs/nginx.log;
access_log /www/mysite/logs/nginx.log;
location /media/ {
alias /www/mysite/public/;
}
location /static/ {
alias /www/mysite/static/;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:7000;
uwsgi_param UWSGI_SCRIPT conf.wsgi;
uwsgi_param UWSGI_CHDIR /www/mysite/conf;
}
}