最近工作中遇到Nginx進程異常重啟卻沒有產生core文件問題,經過排除發現問題所在,下面是這個問題的兩個原因。
開啟生成core文件功能
linux系統下默認是不產生core文件的,需要在進程崩潰時產生core文件要確保開啟了此功能,使用命令 ulimit -c 查看,如果顯示 0 就是沒有開啟,使用命令 ulimit -c unlimited 開啟即可。
寫入權限
生成core文件是需要數據寫入的,因此進程要對存放 core 文件的目錄擁有寫入權限。
一般情況下,master 進程的屬主是 root,而 worker 進程的屬主是 nobody,如下所示:
[root@nginx-test ~]# ps -ef | grep nginx root 74941 1 0 Sep10 ? 00:00:00 nginx: master process sbin/nginx nobody 74943 74941 0 Sep10 ? 00:10:35 nginx: worker process nobody 74944 74941 0 Sep10 ? 00:10:03 nginx: worker process nobody 74945 74941 0 Sep10 ? 00:11:28 nginx: worker process nobody 74946 74941 0 Sep10 ? 00:10:40 nginx: worker process nobody 74947 74941 0 Sep10 ? 00:12:36 nginx: worker process nobody 74948 74941 0 Sep10 ? 00:35:50 nginx: worker process nobody 74949 74941 0 Sep10 ? 00:17:29 nginx: worker process nobody 74950 74941 0 Sep10 ? 00:15:01 nginx: worker process
默認情況下,nginx進程的core文件位置就是nginx服務的部署目錄,而這個目錄的屬主和屬組都不會是nobody的,因此core是無法寫入的。
我遇到的就是這第二種情況,修改方案如下:
1. 在配置文件 conf/nginx.conf 中增加兩行配置:
worker_rlimit_core 500m; //core文件大小限制
working_directory core_files; //core文件目錄
2. 在nginx部署目錄下創建一個core文件存放目錄(core_files),修改其屬主和屬組為nobody,確保有w權限即可,如下:
drwxr-xr-x. 2 nobody nobody 4.0K Sep 24 21:18 core_files