這個錯誤非常明確,直接指出了問題的根源:

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')打開該文件,但操作失敗。

為什麼會發生這個錯誤?

這個問題通常由以下幾種原因導致:

  1. 文件路徑錯誤:你在 Nginx 配置文件中指定的路徑 /usr/local/nginx/conf/2_web.key 不正確。
  2. 文件名錯誤:文件名可能不是 2_web.key,可能存在拼寫錯誤、大小寫錯誤(在 Linux 系統下文件名區分大小寫)。
  3. 文件不存在:該文件可能根本就沒有被創建,或者被誤刪除了。
  4. 文件不在正確的目錄下:私鑰文件可能存在,但不在 /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 運行的用户(通常是 nginxwww-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