You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django部署DigitalOcean服务器Nginx报403 Forbidden如何解决

Django + Nginx部署403错误修复方案

错误根源:

你当前的Nginx配置未将请求转发给Django服务,而是尝试从/var/www/html目录读取静态文件响应,因对应路径不存在返回403错误,请求也根本没有到达Django服务,所以无对应GET日志。

修复步骤

1. 前置准备:配置Django生产服务

Django自带的runserver仅适用于开发调试,生产环境需使用Gunicorn/uWSGI作为应用服务:

  • 进入项目虚拟环境,执行安装:pip install gunicorn
  • 进入项目根目录(包含manage.py所在的/mysite1/mysite/),测试启动服务:gunicorn --bind 127.0.0.1:8000 mysite.wsgi,其中mysite.wsgi对应项目内wsgi.py文件的模块路径,按需调整为你项目的实际名称即可。

2. 修正Nginx配置

替换原有443端口的server块配置为以下内容:

server {
    listen 443 ssl http2;
    ssl_certificate /etc/ssl/server_merged_key.crt;
    ssl_certificate_key /etc/ssl/other_key.key;
    server_name domain.net www.domain.net;

    # 处理静态文件请求(Django生产环境由Nginx直接返回静态资源
    location /static/ {
        root /var/www/mysite; # 对应后面STATIC_ROOT的上级目录
        expires 30d;
    }

    # 处理媒体文件请求
    location /media/ {
        root /var/www/mysite;
        expires 30d;
    }

    # 转发动态请求到Gunicorn
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}
# 可选配置:将HTTP请求自动跳转HTTPS
server {
    listen 80;
    server_name domain.net www.domain.net;
    return 301 https://$host$request_uri;
}

3. 修正Django settings.py配置

DEBUG = False
# ALLOWED_HOSTS仅保留允许访问的IP/域名,删除无关参数项
ALLOWED_HOSTS = ['IP-IN-NUMBERS','localhost', '127.0.0.1','domain.net','www.domain.net']
# 新增配置,告诉Django请求来自Nginx的HTTPS代理
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True 
SECURE_SSL_REDIRECT = True
# 新增静态/媒体文件目录配置
STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/mysite/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = '/var/www/mysite/media/'

配置完成后执行静态文件收集命令:python manage.py collectstatic,该命令会将所有Django静态文件统一收集到STATIC_ROOT配置的目录下。

4. 权限配置

给静态文件目录授予Nginx运行用户访问权限:

mkdir -p /var/www/mysite
chown -R www-data:www-data /var/www/mysite

5. 生效配置

  • 测试Nginx配置合法性:nginx -t,返回success后执行重启:systemctl restart nginx
  • 配置Gunicorn开机自启(推荐),新增文件/etc/systemd/system/gunicorn.service,内容如下:
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/mysite1/mysite
ExecStart=/path/to/your/virtualenv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 mysite.wsgi

[Install]
WantedBy=multi-user.target

替换/path/to/your/virtualenv/为你项目虚拟环境的实际路径,之后执行:

systemctl daemon-reload
systemctl start gunicorn
systemctl enable gunicorn

配置完成后访问域名即可正常访问Django服务。

内容的提问来源于stack exchange,提问作者starship

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:24:02