配置Nginx实现主域名静态站点与子域名Django站点分离
修复Nginx配置:主域名静态站/子域名Django站分离
问题根源
- 端口错误:你的静态站点配置监听的是7080端口,但用户访问
example.com用的是默认的80(HTTP)/443(HTTPS)端口,Nginx根本不会把请求转到7080的server块。 - 拼写错误:所有
exemple.com都是example.com的误拼,导致Nginx匹配不到正确的域名规则。 - 默认配置干扰:如果默认的Nginx站点配置(比如
default)还在启用状态,它会优先匹配未明确指定的请求。
修正步骤
1. 修正Django站点配置(/etc/nginx/sites-available/mydjangosite)
把所有拼写错误的exemple.com改成example.com,同时确保证书路径正确:
server { listen 80; server_name django.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name django.example.com; # 修正证书路径里的拼写错误 ssl_certificate /etc/letsencrypt/live/example.com-0001/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com-0001/privkey.pem; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
2. 重写静态站点配置(/etc/nginx/sites-available/staticsite)
改成监听默认的80/443端口,只匹配主域名example.com,并配置SSL:
# HTTP跳转HTTPS server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } # HTTPS静态站点 server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com-0001/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com-0001/privkey.pem; location / { root /home/jamelaumn/portfolio; index index.html; # 可选:如果是单页应用,添加这行处理路由 # try_files $uri $uri/ /index.html; } }
3. 清理干扰配置
禁用默认的Nginx站点(如果它还在启用状态):
sudo unlink /etc/nginx/sites-enabled/default
4. 验证并重启Nginx
# 检查配置语法是否正确 sudo nginx -t # 重启Nginx服务 sudo systemctl restart nginx
5. 测试访问
- 访问
https://example.com:应该加载你的静态站点 - 访问
https://django.example.com:应该跳转并加载Django站点
内容的提问来源于stack exchange,提问作者Jamelaumn
相关产品推荐
相关产品推荐

