這個錯誤非常明確,直接指出了問題的根源:
Nginx 在嘗試加載 SSL 私鑰文件時失敗,因為它在指定的路徑下找不到這個文件。
錯誤信息解讀
cannot load certificate key "/usr/local/nginx/conf/2_web.key": Nginx 無法加載位於/usr/local/nginx/conf/2_web.key的證書私鑰。No such file or directory: 系統返回的具體錯誤是“沒有這樣的文件或目錄”。fopen('/usr/local/nginx/conf/2_web.key','r'): Nginx 內部使用fopen函數以只讀模式('r')打開該文件,但操作失敗。
為什麼會發生這個錯誤?
這個問題通常由以下幾種原因導致:
- 文件路徑錯誤:你在 Nginx 配置文件中指定的路徑
/usr/local/nginx/conf/2_web.key不正確。 - 文件名錯誤:文件名可能不是
2_web.key,可能存在拼寫錯誤、大小寫錯誤(在 Linux 系統下文件名區分大小寫)。 - 文件不存在:該文件可能根本就沒有被創建,或者被誤刪除了。
- 文件不在正確的目錄下:私鑰文件可能存在,但不在
/usr/local/nginx/conf/目錄中。
解決方案:如何排查和修復?
請按照以下步驟進行排查:
步驟 1: 確認文件是否存在
首先,登錄到你的服務器,直接檢查 /usr/local/nginx/conf/ 目錄下是否存在 2_web.key 文件。
# 進入 Nginx 配置目錄
cd /usr/local/nginx/conf/
# 列出目錄下的所有文件,查看是否有 2_web.key
ls -l
仔細查看 ls -l 的輸出,確認 2_web.key 是否在列表中。
步驟 2: 確認文件路徑和名稱
如果在上一步中沒有找到 2_web.key,你需要找到正確的私鑰文件所在的位置和它的準確名稱。
如果你是通過 Certbot 生成的證書,私鑰文件通常在 /etc/letsencrypt/live/你的域名/privkey.pem。
# 示例:查找 Certbot 生成的私鑰
ls -l /etc/letsencrypt/live/web1.heimadevops.top/
如果你是手動生成的自簽名證書,回想一下你生成文件時使用的命令和路徑。
步驟 3: 修正 Nginx 配置
找到正確的私鑰文件路徑和名稱後,修改你的 Nginx 配置文件(通常是 nginx.conf)。
錯誤的配置:
ssl_certificate_key /usr/local/nginx/conf/2_web.key;
修正後的配置(示例): 假設你找到的正確私鑰路徑是 /etc/letsencrypt/live/web1.heimadevops.top/privkey.pem,那麼配置應該改為:
ssl_certificate_key /etc/letsencrypt/live/web1.heimadevops.top/privkey.pem;
同時,確保 ssl_certificate 指向的證書文件也是存在且正確的。
步驟 4: 檢查文件權限(可選)
即使文件存在,Nginx 運行的用户(通常是 nginx 或 www-data)也需要有讀取該文件的權限。
# 檢查文件權限
ls -l /path/to/your/private.key
# 如果權限不足,修改權限
chmod 600 /path/to/your/private.key # 推薦的安全權限
chown nginx:nginx /path/to/your/private.key
總結
你遇到的 BIO_new_file() failed 錯誤,核心原因就是 Nginx 配置中指定的私鑰文件路徑或名稱不正確,導致文件無法找到。
請按照上述步驟,先找到正確的私鑰文件,然後修正 Nginx 配置中的 ssl_certificate_key 指令,問題即可解決。
修改完成後,別忘了測試配置並重新加載 Nginx:
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload