在 Django + uWSGI 架构中,如何让 Nginx 单独托管一个 HTML 页面
作者:XD / 发表: 2025年12月12日 01:52 / 更新: 2025年12月12日 01:52 / 编程笔记 / 阅读量:66
在使用 Django + uWSGI + Nginx 的架构时,默认所有请求都会被转发给 Django 处理。但在实际场景中,经常会遇到这种需求:
我只想单独暴露一个 HTML 页面(如 verification.html), 不想经过 Django,也不想改 uWSGI。
本文记录一次真实排错过程,重点讲清楚正确配置方式以及最容易踩的坑。
一、问题背景
- 主站架构:
Nginx → uWSGI → Django - Django 负责绝大多数请求
- 目标 URL:
http://eadst.com/verification.html
* 目标文件路径:
/home/www/blog/templates/verification.html
* 要求:
- 仅由 Nginx 静态返回
- 不修改 Django / uWSGI
- 不影响现有站点
二、核心原则(非常重要)
1️⃣ 使用 精确匹配
必须使用:
location = /verification.html
否则请求会被:
location / { uwsgi_pass ... }
抢走,进入 Django。
2️⃣ 避免 alias + try_files 混用(坑点)
这是这次 404 的根因。
很多人会写成这样(❌ 不推荐):
location = /verification.html {
alias /home/www/blog/templates/verification.html;
try_files /home/www/blog/templates/verification.html =404;
}
在 精确匹配 + 单文件场景 下,这种写法非常容易导致 Nginx 判定文件不存在,最终触发 error_page 404。
三、最终正确 & 稳定的配置方式(推荐)
✅ 使用 root + try_files(最稳)
直接把下面这段加到 对应 server 块中,并且放在 location / 前面:
location = /verification.html {
root /home/www/blog/templates;
try_files /verification.html =404;
default_type text/html;
access_log off;
}
路径映射逻辑
请求: /verification.html
实际文件: /home/www/blog/templates/verification.html
四、完整示例 server 配置(节选)
server {
listen 80;
server_name eadst.com www.eadst.com 100.xxx.xxx.xxx;
access_log /home/www/blog/script/access.log;
error_log /home/www/blog/script/error.log;
charset utf-8;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 单独托管 verification.html(不进 Django)
location = /verification.html {
root /home/www/blog/templates;
try_files /verification.html =404;
default_type text/html;
access_log off;
}
location /static/ {
alias /home/www/blog/static/;
}
location / {
include uwsgi_params;
uwsgi_pass 10.0.8.8:8888;
}
}
五、验证是否生效(非常关键)
1️⃣ 重载配置
sudo nginx -t
sudo /etc/init.d/nginx reload
2️⃣ 本机 curl 验证(推荐)
curl -i http://127.0.0.1/verification.html -H "Host: eadst.com"
正确结果应该是:
HTTP/1.1 200 OKServer: nginx- 返回
verification.html内容 - 不是 Django 的 404 页面
六、排错思路总结(非常实用)
如果你遇到类似 404,可以按这个顺序排:
- 是不是精确匹配
location = - 配置文件是否真的被加载
nginx -T | grep verification
3. 是否命中了 Django 的 404 页面
- 是 → location 没生效
- 是否混用了 alias + try_files
- 路径权限是否可达
namei -l /path/to/file.html
七、工程级建议(长期)
不建议把对外暴露的 HTML 放在
templates目录
更合理的做法是:
- 放到
/static/或/var/www/html/ - 由 Nginx 统一管理静态资源
- Django
templates只给后端渲染用
八、总结一句话
在 Django + uWSGI 架构中, 想单独托管一个 HTML 页面, 用
location =+root + try_files, 简单、稳定、不踩坑。
如果你后面还想扩展成单独托管一个目录 / 验证文件 / SEO 校验页 / CDN 回源页,这套方法都能直接复用。
