最近工作中遇到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