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
相关产品推荐
相关产品推荐

