本质是Nginx加载include、ssl_certificate等指令引用的文件路径不存在或权限不足;需检查include通配符匹配结果、证书绝对路径存在性及root/alias拼写,用nginx -t -v和grep定位具体行。

当执行 nginx -t 提示“文件找不到”类错误(如 open() "/etc/nginx/conf.d/xxx.conf" failed (2: No such file or directory)),本质是 Nginx 在加载配置时尝试读取某个被 include 指令引用的路径,但该路径不存在或权限不足。排查需聚焦在配置中的 include、ssl_certificate、root、alias 等涉及文件路径的指令上。
检查 include 指令引用的文件或目录是否存在
Nginx 配置中大量使用 include 加载子配置,比如:
-
include /etc/nginx/conf.d/*.conf;—— 确保/etc/nginx/conf.d/目录存在且可读 -
include sites-enabled/default;—— 检查sites-enabled/default是相对路径还是绝对路径;若为相对路径,它基于 Nginx 的--prefix(通常是/etc/nginx),即实际查找/etc/nginx/sites-enabled/default - 通配符匹配为空(如目录下无 .conf 文件)不会报错,但写死的文件名(如
include extra/upstream.conf;)一旦缺失就会直接失败
验证 SSL 证书和密钥路径是否真实存在且可读
常见错误日志形如:
nginx: [emerg] cannot load certificate "/etc/nginx/ssl/example.com.crt": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory)
此时应确认:
-
ssl_certificate和ssl_certificate_key指向的路径是绝对路径(推荐),或相对于--prefix的相对路径 - 文件确实存在:
ls -l /etc/nginx/ssl/example.com.crt - Nginx 主进程用户(通常是
root)有读取权限;若用非 root 用户运行工作进程,还需确保该用户也能读取证书(尤其启用了user指令时)
留意 root、alias、error_page 中的路径是否拼写错误或路径未创建
虽然这些指令不影响 nginx -t 的语法检查,但部分场景下(如 error_page 404 /404.html 后跟 location /404.html { alias /usr/share/nginx/html/404.html; })若 alias 路径不存在,nginx -t 不会报错;但若用了 root 拼接出的完整路径不存在,Nginx 在启动时可能静默失败或记录 warning。真正会在 -t 阶段报“文件找不到”的,更可能是:
-
log_format引用的变量不合法(极少) - 自定义模块要求预加载的配置文件(如
lua_package_path中的 .lua 路径) - 但最常见仍是
include和证书路径
快速定位问题行的方法
运行 nginx -t -v(加 -v 开启详细输出)可看到 Nginx 实际加载了哪些文件;再配合 grep -n "include\|ssl_certificate\|ssl_certificate_key" /etc/nginx/*.conf /etc/nginx/conf.d/*.conf 2>/dev/null 快速列出所有可疑路径;对每个路径执行 ls -l 验证即可。











