linux 服务器使用 uwsgi、nginx 部署 django 网站避坑指南
作者 | 四杆老烟枪
出品 | 脚本之家(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; } }