Code前端首页关于Code前端联系我们

在 Linux 服务器上使用 uwsgi 和 nginx 部署 Django 网站的陷阱指南

terry 2年前 (2023-09-28) 阅读数 61 #未命名
linux 服务器使用 uwsgi、nginx 部署 django 网站避坑指南作者 |由四个老烟民

制作 | Script House(ID:jb51net)

在Linux服务器上,使用uwsgi和nginx实现Django网站。除了避免实施过程中常见的陷阱之外,希望对各位同事有所帮助。读者注:本文不详细介绍什么是django、uwsgi、nginx。百度有很多文章详细介绍这些,自己学学吧

创建用例项目

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安装在全局环境中,否则,uwsgiMing 必须安装在虚拟项目环境中。

部署项目时通常不建议使用全局环境,因此uwsgi应始终安装在虚拟项目环境中。

定制项目并准备部署

# File conf/settings.py
DEBUG = False
ALLOWED_HOSTS = ['*']

STATIC_URL  = '/static/'
STATIC_ROOT = BASE_DIR / 'static'
# 收集静态资源
python manage.py collectstatic

避免陷阱二:部署时务必将DEBUG设置为False,防止网页响应调试信息,避免降低运行效率,导致网站速度变慢Django 文件搜索应用程序的静态。

避免陷阱3:确保修改项目设置文件后收集静态资源。收集到的静态资源使用nginx托管在STATIC_ROOT目录中。

开始部署

读者默认已经正确配置了uwsgi和nginx配置文件,网站可以正常访问。但页面如下,查看nginx日志如下:

读者可以参考附件部分配置uwsgi和nginx配置文件。

linux 服务器使用 uwsgi、nginx 部署 django 网站避坑指南

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"

从网站页面可以看到静态文件没有加载或者无法加载。从日志中我们可以看到失败(13:权限被拒绝),静态文件响应403状态码。我相信你猜对了。这是由于权限问题导致的,nginx没有访问静态源文件的权限。只需更改nginx用户即可解决。读者可以创建一个新的系统帐户作为nginx用户,或者使用现有帐户,但请记住该用户具有访问静态源文件的权限。更改nginx用户如下:

# File: /etc/nginx/nginx.conf
user root;
# 重启 nginx 服务
sudo service nginx restart

避免陷阱4:更改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;
  }
}

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门