Ubuntu 22.04 下 Nginx 自定义错误页配置全指南
1. 为什么默认的 Nginx 错误页会让访客“瞬间失去信任”
在 Ubuntu 22.04 上部署一个网站,哪怕只是个人博客或内部测试服务,最常被忽略却影响最直接的细节之一,就是错误页面。你可能花了几小时调通 HTTPS、优化静态资源缓存、压测并发性能,结果用户第一次遇到 404 时,看到的是 Nginx 默认那行冷冰冰的 “404 Not Found” —— 没有你的品牌色、没有返回首页的按钮、没有一句友好的提示,甚至 URL 栏还暴露着后端真实路径(比如 /wp-admin/xxx )。这不是技术问题,这是 用户体验断点 。
我去年帮一家本地教育机构迁移旧系统,他们原站用 Apache,自定义了全套 404/500 页面,带课程推荐和客服入口。切换到 Nginx 后没配 error_page,上线第三天运营就反馈:咨询量暴跌 37%,后台日志显示大量用户在 404 页面停留不到 2 秒就关闭标签页。我们回滚检查,发现根本不是功能故障,而是用户看到默认错误页后,下意识认为“网站坏了”“链接失效了”,连尝试刷新或点击导航栏的意愿都没有。
这背后是两个关键事实:
第一, Nginx 的 error_page 指令不是“美化开关”,而是内容路由控制权的移交 。它不改变 HTTP 状态码(404 还是 404),但把响应体的生成权从 Nginx 内置逻辑,交给你指定的 HTML 文件、代理上游或重定向地址。
第二, Ubuntu 22.04 的 Nginx 包(来自 nginx-full )默认禁用所有自定义错误页 。它的主配置 /etc/nginx/nginx.conf 里 http 块中压根没有 error_page 指令,而站点配置 /etc/nginx/sites-enabled/default 里也只有一行注释掉的示例。这意味着——你什么都没做,它就天然选择展示最简陋的内置页。
所以,这件事的本质不是“怎么加个好看页面”,而是“如何在不破坏 HTTP 语义的前提下,接管错误响应的最终呈现”。接下来我会带你从底层机制开始,一步步拆解:为什么 error_page 404 /404.html 这一行能生效?为什么你放对了文件却还是 404?为什么有些错误页能显示,有些却触发 500?这些都不是玄学,全是 Nginx 请求处理阶段(phase)和上下文(context)的精确匹配结果。
1.1 Nginx 错误页的三大核心机制:阶段、上下文与继承链
要真正掌控 error_page,必须理解它在 Nginx 请求生命周期中的定位。Nginx 处理请求分 11 个阶段(phase),而 error_page 的介入点非常特殊:它 不发生在 content 阶段(即生成响应体的阶段),而是在 post-read 阶段之后、server-rewrite 阶段之前,当 Nginx 检测到 upstream 返回非 2xx/3xx 状态码,或自身处理失败时触发 。
这意味着:
- 如果你在
location /api/里写了error_page 502 /maintenance.html,那么当 proxy_pass 到后端失败返回 502 时,Nginx 不会直接返回 502,而是 内部重发一次请求 ,目标是/maintenance.html这个 URI。注意,这是内部重定向(internal redirect),浏览器地址栏不会变。 - 这个重发的请求,会重新走一遍 Nginx 的 location 匹配流程。所以
/maintenance.html必须能被某个location块捕获,且该块需允许读取文件(比如try_files或alias)。 - 更关键的是: error_page 指令的生效范围取决于它声明的位置 。它可以在
http、server、location三个上下文(context)中使用,且遵循严格的继承规则:http块中的error_page是全局默认,会被所有server继承;server块中的error_page会覆盖http块的同状态码设置;location块中的error_page只对该 location 内部错误生效,且 会完全屏蔽其父级(server/http)的同状态码设置 ——这是很多人配错的根本原因。
举个真实案例:某客户在 server 块里写了 error_page 404 /404.html ,但在 location ~ \.php$ 里又写了 error_page 404 /php-404.html 。结果所有 PHP 脚本 404 都走 /php-404.html ,而静态文件 404 走 /404.html 。但如果他删掉 location 里的那行,期望回归 server 级别设置,反而会得到 Nginx 默认页——因为 location 块一旦声明了 error_page ,即使删掉某条,只要该块存在 error_page 指令(哪怕只有一条),它就会阻断继承。
提示:Ubuntu 22.04 的
/etc/nginx/sites-enabled/default文件里,location /块默认是空的,但location ~ \.php$块存在且包含fastcgi_pass。如果你没在该 location 里显式声明error_page,那么 PHP 脚本产生的 404 将由server级别的error_page处理;但如果你在该 location 里加了error_page 500 /50x.html,却忘了加404,那么 PHP 404 就会 fallback 到 Nginx 默认页——因为location级别的error_page设置是“全有或全无”的继承覆盖。
1.2 Ubuntu 22.04 的 Nginx 配置树:从全局到站点的四层结构
很多新手卡在“明明文件放对了,为什么还是 404”,根源在于没理清 Ubuntu 22.04 的 Nginx 配置加载顺序。它不是单文件,而是一个树状结构,每一层都可能覆盖上层:
| 层级 | 配置文件路径 | 加载顺序 | 关键作用 | 是否建议修改 |
|---|---|---|---|---|
| 1. 全局核心 | /etc/nginx/nginx.conf |
最先加载 | 定义 user 、 worker_processes 、 events 、 http 块基础参数 |
❌ 不建议动,除非调优内核参数 |
| 2. HTTP 全局 | /etc/nginx/conf.d/*.conf |
全局核心之后 | 通常放 log_format 、 upstream 、全局 error_page |
⚠️ 可放跨站点通用配置,但需谨慎 |
| 3. 站点定义 | /etc/nginx/sites-available/your-site |
HTTP 全局之后 | 定义 server 块,含域名、端口、root、SSL 等 |
✅ 主力修改区,按需启用 |
| 4. 启用链接 | /etc/nginx/sites-enabled/your-site |
最后加载 | 符号链接指向 sites-available 中的文件 |
✅ 启用/禁用站点的开关 |
重点来了: error_page 指令必须写在能被实际执行的 server 或 location 块里 。Ubuntu 22.04 默认启用的 /etc/nginx/sites-enabled/default 文件,其 server 块里只有 listen 、 server_name 、 root 和 index ,没有任何 error_page 。所以,即使你在 /etc/nginx/nginx.conf 的 http 块里加了 error_page 404 /404.html ,只要 sites-enabled/default 的 server 块没显式继承或覆盖,它就永远不会生效——因为 server 块会完全隔离 http 块的 error_page 设置。
更隐蔽的坑是:Ubuntu 22.04 的 nginx-full 包在 /etc/nginx/nginx.conf 里, http 块末尾有这样一行:
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
这意味着,如果你在 /etc/nginx/conf.d/custom-errors.conf 里写了全局 error_page ,它会被加载;但如果你在 /etc/nginx/sites-available/myapp 里写了 server 块,它会被 sites-enabled 加载,且优先级高于 conf.d 。所以, 最佳实践永远是:把 error_page 放在你正在维护的 server 块里,而不是去动全局配置 。这样既清晰,又避免多层覆盖导致的不可预测行为。
我见过最典型的错误配置是:用户在 conf.d/errors.conf 里写了 error_page 404 /var/www/html/404.html ,然后在 sites-available/myapp 的 server 块里又写了 error_page 404 /404.html 。结果前者因路径绝对而失败(Nginx 不允许在 error_page 中用绝对路径),后者因相对路径 /404.html 在 root 指向 /var/www/myapp 时,实际查找 /var/www/myapp/404.html ,而文件却放在 /var/www/html/ 下——双重错误叠加,最终还是默认页。
2. 从零构建可落地的错误页体系:文件准备、权限与路径陷阱
配置 error_page 的第一步,从来不是改 Nginx 配置,而是确保你的错误页文件本身“活得好”。在 Ubuntu 22.04 上,这涉及三个常被忽视的硬性条件:文件位置、文件权限、MIME 类型识别。任何一个出错,都会让 Nginx 在内部重定向时直接返回 500 或 403。
2.1 文件存放位置:为什么 /usr/share/nginx/html/ 是最安全的选择
Ubuntu 22.04 的 Nginx 包( nginx-full )默认将网站根目录设为 /var/www/html/ ,但 错误页文件的最佳存放位置其实是 /usr/share/nginx/html/ 。原因有三:
-
所有权与权限隔离 :
/var/www/html/通常属于www-data:www-data,且开发人员可能有写权限。而/usr/share/nginx/html/属于root:root,普通用户无法修改,天然防误删。更重要的是,Nginx worker 进程以www-data用户运行,它对/usr/share/nginx/html/有只读权限(Ubuntu 包预设),但对/var/www/html/有读写权限——如果错误页文件被意外覆盖成空文件或二进制乱码,Nginx 会静默返回 500,而非降级到默认页。 -
路径解析的确定性 :当你在
error_page 404 /404.html中使用相对路径/404.html时,Nginx 会将其解析为root指令指定的根目录下的子路径。例如,若server块中root /var/www/myapp;,则/404.html对应/var/www/myapp/404.html。但如果你的站点有多个server块(如 www 和 non-www),每个root可能不同,维护成本陡增。而/usr/share/nginx/html/是系统级标准路径,所有server块均可统一引用/usr/share/nginx/html/404.html,无需关心各站点root差异。 -
与 Debian/Ubuntu 生态兼容 :
/usr/share/nginx/html/是 Debian 系发行版(包括 Ubuntu)Nginx 包的标准文档根目录。apt install nginx后,index.html就放在那里。复用此路径,意味着你的错误页能无缝集成到系统包管理中,未来升级 Nginx 时不会被覆盖(因为apt不会覆盖/usr/share/下用户创建的文件)。
实操步骤如下(全程 root 权限):
# 1. 创建标准错误页目录(如果不存在)
sudo mkdir -p /usr/share/nginx/html/errors
# 2. 创建 404 页面(纯 HTML,无外部依赖)
sudo tee /usr/share/nginx/html/errors/404.html > /dev/null << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>页面未找到 - 404</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; text-align: center; margin-top: 50px; }
.container { max-width: 600px; margin: 0 auto; padding: 0 20px; }
h1 { color: #e74c3c; font-size: 3em; margin-bottom: 10px; }
p { color: #34495e; font-size: 1.2em; margin-bottom: 30px; }
.btn { display: inline-block; background: #3498db; color: white; padding: 12px 24px; text-decoration: none; border-radius: 4px; font-weight: bold; }
.btn:hover { background: #2980b9; }
</style>
</head>
<body>
<div class="container">
<h1>404</h1>
<p>抱歉,您访问的页面不存在。</p>
<p>请检查网址是否正确,或返回<a href="/" class="btn">首页</a></p>
</div>
</body>
</html>
EOF
# 3. 创建 500 页面(强调服务端错误,避免暴露技术细节)
sudo tee /usr/share/nginx/html/errors/500.html > /dev/null << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>服务器内部错误 - 500</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; text-align: center; margin-top: 50px; }
.container { max-width: 600px; margin: 0 auto; padding: 0 20px; }
h1 { color: #e67e22; font-size: 3em; margin-bottom: 10px; }
p { color: #34495e; font-size: 1.2em; margin-bottom: 30px; }
.btn { display: inline-block; background: #2ecc71; color: white; padding: 12px 24px; text-decoration: none; border-radius: 4px; font-weight: bold; }
.btn:hover { background: #27ae60; }
</style>
</head>
<body>
<div class="container">
<h1>500</h1>
<p>服务器暂时无法处理您的请求。</p>
<p>我们的工程师已收到告警,正在紧急修复。请稍后重试,或返回<a href="/" class="btn">首页</a></p>
</div>
</body>
</html>
EOF
# 4. 设置严格权限:只读给 www-data,禁止写
sudo chown -R root:root /usr/share/nginx/html/errors
sudo chmod -R 755 /usr/share/nginx/html/errors
sudo chmod 644 /usr/share/nginx/html/errors/*.html
注意:这里用
tee和 heredoc 是为了确保文件编码为 UTF-8 且无 BOM。很多用户用nano或vim直接编辑,不小心保存为 UTF-8 with BOM,会导致 Nginx 返回 500(Nginx 解析 HTML 头部失败)。上述命令生成的文件是纯净 UTF-8。
2.2 权限验证:三步确认 Nginx 能否读取文件
文件放好只是开始,必须验证 Nginx worker 进程能否实际读取。Ubuntu 22.04 的 Nginx 默认以 www-data 用户运行,所以要用该用户身份测试:
# 1. 切换到 www-data 用户(需要 root 权限)
sudo -u www-data -s
# 2. 测试读取权限(不报错即成功)
cat /usr/share/nginx/html/errors/404.html | head -n 5
# 3. 测试路径是否存在(输出应为文件)
ls -l /usr/share/nginx/html/errors/404.html
# 4. 退出 www-data shell
exit
如果 cat 报错 Permission denied ,说明文件权限不对;如果 ls 显示 No such file or directory ,说明路径拼写错误。常见错误包括:
- 文件名大小写错误:Linux 区分大小写,
404.HTML≠404.html; - 路径多了一层:
/usr/share/nginx/html/errors/404.html写成/usr/share/nginx/html/errors//404.html(双斜杠); - SELinux 或 AppArmor 干预:Ubuntu 22.04 默认禁用 SELinux,但 AppArmor 可能限制。检查
sudo aa-status | grep nginx,若启用,需更新 profile(本文暂不展开,因 Ubuntu 22.04 桌面版默认未启用)。
2.3 MIME 类型陷阱:为什么 Nginx 有时返回空白页或下载
即使文件存在且可读,Nginx 仍可能返回空白页或触发浏览器下载。这是因为 error_page 指向的文件,其 MIME 类型必须被 Nginx 正确识别。Ubuntu 22.04 的 Nginx 默认 MIME 类型映射在 /etc/nginx/mime.types 中,其中 .html 映射为 text/html 。但如果你的错误页是 .htm 、 .xhtml 或自定义扩展名(如 .err ),Nginx 会返回 application/octet-stream ,浏览器则按二进制文件处理——要么下载,要么显示乱码。
解决方案有两个:
- 首选 :坚持用
.html扩展名,这是最稳妥的; - 次选 :在
http或server块中显式添加类型映射:
然后types { text/html err; }error_page 404 /404.err;即可。
但更深层的问题是: Nginx 的 error_page 内部重定向,会完全绕过 location 块中的 add_header 指令 。例如,你可能在 location / 里加了 add_header X-Content-Type-Options nosniff; ,但这对 error_page 重定向来的 /404.html 无效。所以,必须确保错误页 HTML 文件自身包含正确的 <meta> 声明,如示例中的 <meta charset="UTF-8"> ,这是最后一道防线。
3. 配置实战:四类错误页的精准配置与避坑指南
现在进入核心环节:如何在 Ubuntu 22.04 的 Nginx 配置中,正确书写 error_page 指令。我将按错误类型重要性排序,逐一拆解每种配置的语法、生效条件、典型错误及调试方法。记住, error_page 不是独立指令,它必须与 location 块配合才能完成最终响应 。
3.1 404 页面:最常用也最容易配错的“失踪人口”处理
404 是用户输入错误 URL 或链接失效时的响应。配置目标:当请求的 URI 在文件系统中找不到对应文件时,返回自定义 HTML。
正确配置(写在 server 块内):
# /etc/nginx/sites-available/your-site
server {
listen 80;
server_name example.com;
root /var/www/example;
# 关键:定义 404 错误页
error_page 404 /errors/404.html;
# 关键:必须有 location 块匹配 /errors/404.html 的请求
location = /errors/404.html {
internal; # 强制内部重定向,禁止外部直接访问
alias /usr/share/nginx/html/errors/404.html;
}
# 其他 location...
location / {
try_files $uri $uri/ =404;
}
}
为什么这样写?逐行解析:
error_page 404 /errors/404.html;:当发生 404 时,Nginx 内部发起新请求,URI 为/errors/404.html;location = /errors/404.html:=表示精确匹配,确保只处理这个 URI,避免正则匹配开销;internal;:这是 强制要求 。它告诉 Nginx,这个 location 只能被内部重定向访问,不能被用户直接在浏览器输入https://example.com/errors/404.html访问。否则,用户可能通过猜路径直接看到错误页,暴露网站结构;alias /usr/share/nginx/html/errors/404.html;:alias指令将请求 URI 映射到文件系统绝对路径。注意alias末尾 不能有斜杠 ,且路径必须是完整文件路径(不是目录)。对比root:如果这里用root /usr/share/nginx/html/;,则 Nginx 会查找/usr/share/nginx/html//errors/404.html(多一个斜杠),导致失败。
常见错误与修复:
| 错误现象 | 错误配置 | 修复方案 |
|---|---|---|
浏览器显示 404 Not Found (Nginx 默认页) |
error_page 404 /404.html; 但没写 location /404.html |
添加 location = /404.html { internal; alias /usr/share/nginx/html/errors/404.html; } |
返回 500 Internal Server Error |
location /errors/404.html 用了 = 但路径不精确(如写成 /errors/404.html/ ) |
检查 location 中的 URI 是否与 error_page 后的路径 完全一致 ,包括结尾斜杠 |
用户能直接访问 https://example.com/errors/404.html |
缺少 internal; 指令 |
立即添加 internal; ,否则安全风险极高 |
调试技巧:
用 curl 模拟 404 并查看响应头:
# 触发 404(假设 /nonexistent 路径不存在)
curl -I http://localhost/nonexistent
# 正常应返回:HTTP/1.1 404 Not Found + 正确的 Content-Type: text/html
# 检查是否被内部重定向(看是否有 X-Accel-Redirect 头)
curl -v http://localhost/nonexistent 2>&1 | grep -E "(HTTP|X-Accel)"
# 应看到:HTTP/1.1 404 Not Found 和 < X-Accel-Redirect: /errors/404.html(表示内部重定向成功)
3.2 500/502/503/504 页面:服务端故障的“危机公关”窗口
这类错误代表后端服务异常(500)、反向代理上游无响应(502)、上游过载(503)、上游超时(504)。用户看到这些,第一反应是“网站崩了”,所以错误页必须传递“我们在努力修复”的信心, 绝不能暴露技术细节 (如 PHP 错误堆栈、数据库连接失败信息)。
正确配置(支持多状态码共用一页):
server {
# ... 其他配置 ...
# 为所有 5xx 错误使用同一页面,简化维护
error_page 500 502 503 504 /errors/50x.html;
# 匹配 50x 页面的 location
location = /errors/50x.html {
internal;
alias /usr/share/nginx/html/errors/500.html; # 复用 500.html 文件
}
# 如果你有专门的维护页,可单独配置 503
# error_page 503 /errors/maintenance.html;
}
关键差异点:
502 Bad Gateway通常由proxy_pass到后端(如 PHP-FPM、Node.js)失败触发。此时,Nginx 自身是健康的,只是上游挂了。所以502错误页必须能被 Nginx 独立提供, 不能依赖任何后端服务 。这也是为什么我们把文件放在/usr/share/nginx/html/而非/var/www/下——后者可能和后端共享存储,万一磁盘满,连错误页都打不开。503 Service Unavailable常用于主动维护。你可以配合return 503;指令实现:# 在维护期间,临时屏蔽所有流量 location / { return 503; } # 然后 error_page 503 会自动触发 /errors/maintenance.html
致命陷阱:循环重定向
最危险的错误是: error_page 502 /errors/50x.html; ,但 /errors/50x.html 本身需要通过 proxy_pass 渲染(比如你错误地把它设为动态 PHP 页面)。结果 Nginx 重定向到 /errors/50x.html ,触发 proxy_pass ,上游又挂了,再返回 502,再次重定向……无限循环,直到 Nginx 达到 recursive_error_pages 限制(默认 5 次),最终返回 500。
规避方法: 所有错误页文件必须是 纯静态 HTML ,且 location 块中 只能用 alias 或 root + try_files ,严禁 proxy_pass 。
3.3 403 Forbidden 页面:权限拒绝的友好提示
403 通常因目录无索引文件( index 指令未匹配)、文件权限不足、或 autoindex off 时访问目录触发。用户看到 403,往往以为是自己没权限,所以错误页要明确告知“这是服务器配置限制,不是你的问题”。
配置要点:
server {
# ... 其他配置 ...
error_page 403 /errors/403.html;
location = /errors/403.html {
internal;
alias /usr/share/nginx/html/errors/403.html;
}
# 确保 root 目录下没有 index 文件时,能触发 403(而非 404)
location / {
# 如果 root 目录下没有 index.html,且 autoindex off,则访问 / 会返回 403
# 所以确保你的 root 目录有 index 文件,或显式处理
try_files $uri $uri/ =404;
}
}
为什么 403 配置容易被忽略?
因为 error_page 403 的触发场景比 404 少。但一个典型场景是:你禁用了 autoindex (防止目录遍历),用户访问 https://example.com/assets/ (一个空目录),Nginx 会返回 403。如果没配自定义页,用户看到的是“403 Forbidden”,远不如“该资源目录暂不开放浏览,请返回首页”来得友好。
3.4 高级技巧:基于变量的动态错误页与日志增强
以上都是静态页,但有时你需要根据错误类型或请求来源,返回不同内容。Nginx 提供了 $status 、 $request_uri 等变量,可在错误页中使用(需配合 sub_filter 或 SSI,但更推荐前端 JS 动态渲染)。
更实用的技巧是:在错误页中嵌入调试信息,仅对管理员可见。
例如,在 500.html 中加入一个隐藏的 <div> ,用 Nginx 的 sub_filter 替换占位符:
# 在 server 块中启用 sub_filter
sub_filter '<!-- DEBUG -->' '<div style="display:none">Status: $status, URI: $request_uri</div>';
sub_filter_once off;
然后在 500.html 文件中插入 <!-- DEBUG --> 。这样,普通用户看不到,但管理员用浏览器开发者工具可查看原始 HTML,获取出错时的上下文。
日志增强:记录错误页触发详情
默认 Nginx 日志只记录原始请求(如 GET /nonexistent HTTP/1.1 ),不记录是否触发了 error_page。要审计错误页使用情况,需自定义日志格式:
# 在 http 块中定义新日志格式
log_format error_detail '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'error_page_triggered="$sent_http_x_error_page"';
# 在 server 块中应用
access_log /var/log/nginx/error_detail.log error_detail;
# 在 error_page location 中添加 header
location = /errors/404.html {
internal;
alias /usr/share/nginx/html/errors/404.html;
add_header X-Error-Page "404";
}
这样,日志中会出现 error_page_triggered="404" ,方便用 grep 统计各类错误页触发频次。
4. 排查全流程:从配置测试到生产环境的 7 步验证链
配置写完不是终点,Ubuntu 22.04 的 Nginx 有严格的语法检查和热加载机制。一个字符错误,就会导致 nginx -t 失败,进而 systemctl reload nginx 无响应。以下是我在生产环境中打磨出的 7 步验证链,确保每次修改都万无一失。
4.1 第一步:语法检查( nginx -t )—— 90% 的崩溃在此拦截
这是最基础也最关键的一步。在 Ubuntu 22.04 上, nginx -t 会检查所有 include 的配置文件:
# 运行语法检查
sudo nginx -t
# 正常输出:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
# 如果报错,例如:
# nginx: [emerg] unknown directive "error_pagee" in /etc/nginx/sites-enabled/default:25
# 说明第 25 行有拼写错误(多了一个 e)
为什么 nginx -t 如此重要?
因为 Nginx 的配置是“全有或全无”的。如果 nginx -t 失败, systemctl reload nginx 会静默失败(返回 exit code 1),但进程仍在运行旧配置。你以为 reload 成功了,其实新配置根本没生效。我曾见过团队连续三天排查“为什么 error_page 不生效”,最后发现是 nginx -t 一直报错,但没人检查返回值。
4.2 第二步:配置重载( systemctl reload nginx )—— 验证热更新能力
语法正确后,执行重载:
sudo systemctl reload nginx
# 检查状态
sudo systemctl status nginx --no-pager -l
# 应看到 "Reloaded nginx configuration." 且 Active: active (running)
关键观察点:
systemctl status输出中,Main PID的数字是否变化?如果没变,说明是 reload(热更新),进程未重启;如果变了,说明是 restart(进程重启),可能是配置触发了强制重启(如修改了worker_processes)。- 查看
journalctl日志:sudo journalctl -u nginx -n 20 --no-pager,确认无error或warn。
4.3 第三步:手动触发错误( curl 测试)—— 验证端到端流程
用 curl 模拟真实错误:
# 测试 404
curl -i http://localhost/nonexistent-path
# 应返回 HTTP/1.1 404 Not Found 和自定义 HTML 内容
# 测试 502(需先停掉后端,如 php-fpm)
sudo systemctl stop php8.1-fpm
curl -i http://localhost/phpinfo.php
# 应返回 HTTP/1.1 502 Bad Gateway 和 50x.html 内容
# 恢复后端
sudo systemctl start php8.1-fpm
-i 参数至关重要 :它显示响应头,让你确认状态码是否正确( 404 Not Found 而不是 200 OK ),以及 Content-Type 是否为 text/html 。
4.4 第四步:浏览器验证与开发者工具分析—— 检查前端表现
在 Chrome/Firefox 中打开:
- 访问一个不存在的 URL,确认显示自定义 404 页;
- 按
F12打开开发者工具,切换到Network标签页; - 刷新页面,找到第一个请求,检查:
Status列:显示404(不是200);Response Headers:Content-Type: text/html;Response标签页:显示你写的 HTML 源码,而非 Nginx 默认文本。
常见前端问题:
- CSS/JS 加载失败:错误页中引用的
/css/style.css,Nginx 会尝试在root目录下查找。解决方案:在错误页中用绝对路径
更多推荐


所有评论(0)