
nginx進程不斷自行關閉,錯誤如下
2023/04/18 11:47:29 [alert] 11073#0: worker process 11312 exited on signal 9
2023/04/18 11:47:29 [alert] 11073#0: fork() failed while spawning "worker process" (12: Cannot allocate memory)
2023/04/18 11:47:29 [alert] 11073#0: could not respawn worker process
我知道它有足夠的內存,這是我控制的 VPS,我已經將其內存提升到 4GB,但仍然是同樣的情況。這是一個非常輕量級的 nginx 伺服器,沒有 PHP,簡單的映像服務。運行 nginx 1.0.15,我知道它很舊,但它工作了很多年沒有任何問題。這個 VPS 多年來沒有任何變化。
答案1
fork() failed while spawning "worker process" (12: Cannot allocate memory)
就是線索。
如果你仔細觀察,man 2 fork
你會發現是什麼條件導致了這個職位。
ENOMEM fork()
由於記憶體緊張,無法分配必要的內核結構。
ENOMEM
嘗試在「init」進程已終止的 PID 命名空間中建立子程序。請參閱 pid_namespaces(7)。
它應該是這兩個條件之一。整個 VPS 是否會在同一時間重新啟動?如果是這樣,那就有你的答案。
如果您無法透過ps -o lstart 1
在容器中執行操作並檢查init
進程何時啟動來判斷,您可以潛在地測試這一點。
否則,如果當它說“內存緊張”時您仍然收到此訊息,則可能是因為整個系統內存緊張。這不是您在容器中可能了解的內容,因此您需要向託管提供者請求更多資訊。
答案2
根據您提供的錯誤訊息,工作進程似乎由於signal 9
指示SIGKILL
信號而退出。此外,錯誤訊息表明fork() system call is failing
,這意味著該進程無法建立新的子進程。
錯誤訊息「無法分配記憶體」表示系統可能記憶體不足,這可能導致 fork() 系統呼叫失敗。此問題的一種可能解決方案是增加系統可用的記憶體量。
您可以嘗試使用“free -tm”命令檢查伺服器上的可用內存,該命令將顯示有關可用內存和交換空間的資訊。如果系統記憶體不足,您可能需要在伺服器上添加更多記憶體或調整 nginx 配置以使用更少的記憶體。
另一個可能的解決方案是減少 nginx 配置中的工作進程數量。您可以透過調整 nginx.conf 檔案中的「worker_processes」設定來做到這一點。透過減少工作進程的數量,您可以減少 nginx 伺服器的記憶體使用量。