[实践OK]Nginx error指令把error_log指向非nginx自身的logs目录同时删除掉nginx下的logs目录nginx启动后还去找nginx的logs目录下error.log文件的问题分析备案。
背景:nginx.conf里指定了nginx的error_log:error_log /data/logs/nginx/nginx_error.log; 该文件不在nginx的logs下面,于是我把这个logs文件夹都给删除了: rm -Rf /usr/local/nginx/logs,发现在启动时会会报一个alert错,nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)的研究探讨。
一)删除了logs目录:rm -Rf /usr/local/nginx/logs
二)修改error_log的指向位置,Nginx配置如下:
#error_log /data/logs/nginx/nginx_error.log debug;
#error_log /data/logs/nginx/nginx_error.log notice;
#error_log /data/logs/nginx/nginx_error.log crit;
#error_log /data/logs/nginx/nginx_error.log;
#error_log /dev/null crit;
error_log /data/logs/nginx/nginx_error.log error | debug_core | debug_alloc //这个或配置好像有问题在新版本出现Starting nginx... nginx: [emerg] invalid log level "|" in /usr/local/nginx/conf/nginx.conf:14
, 参考自:http://blog.csdn.net/gsnumen/article/details/7824234
三)启动下nginx试下看,出现如下问题:
root@119.10.6.23:/usr/local/nginx/conf# ../sbin/nginx -c ./conf/nginx.conf
nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)
问题,我都修改指向了,还去读取这个/usr/local/nginx/logs/error.log 干嘛?
一兄弟我查下源码去了,说了一下问题所在,相当感谢:
—————————————————QA—————————————————
说:这个/usr/local/nginx/logs/error.log日志写死了,我昨天查好多个G里面,把我/占了95%。
答:日志是不能少的。可以写个定时删除N天以前日志的功能呀。
问:等nginx启动成功后,会自动替换成你指定的log。这种逻辑真是不符合我的世界观,为何?
答:
1)这个错误是在 ngx_log_init 函数报出来的,也就是NGX_PREFIX/logs/error.log 是nginx启动时用的日志文件,在这个时候连配置都还没去解析,所以和配置里的error_log没有关系。
2)我在启动过程中(在配置读取之前)有错误,我得错误信息该往哪里写呢?我只能用默认的地址。
3)你需要保留 NGX_PREFIX/logs/error.log 这个路径存在,但你配置里可以把 access_log error_log 指向别处的。
等nginx启动成功后,会自动替换成你指定的log。
4)还可能有一个nginx.pid也在这个logs下面。
可我修改了:pid /data/nginx/nginx.pid;
ls /data/nginx/nginx.pid
/data/nginx/nginx.pid
最后的解决办法:
(那要么单独出来,别混一块儿啊,用软链接直接纪念品混一块得了,其实是两个文件才对故意搞一块!)
我不太了解这块,我觉得个系统启动错误得学下mysql...的启动错误,别和用户的虚拟机搞一个文件。
对源码不熟悉,不过也非常感谢了,我现在直接做软链接实现了,在启动时写那地儿你说的替换成你指定的log是一个文件。
根本原因是我不想有nginx下的logs文件夹和nginx的设计有冲突,如下:
一启动就先读配置呢
----
在读配置之前,还有很多事情要做呢,比如 参数处理 os_init 各个模块初始化(配置本身也是一个模块)
其实启动的错误文件和error_log文件混淆成一个文件了。程序员的角度这个/usr/local/nginx/logs/error.log是nginx从系统层面启动时的默认,而这个error_log呢,则是从运行起来后的日志级别来讲的,其实这块有点蒙,呵呵。
—————————————解决办法————————————
—操作记录—这下就忽悠nginx在logs下面有这个文件,其实是个软链接,它再按我配置的error_log写时,还是那个文件—
ln -s /data/logs/nginx/nginx_error.log /usr/local/nginx/logs/error.log
ls -lart /usr/local/nginx/logs
/usr/local/nginx/logs/error.log -> /data/logs/nginx/nginx_error.log
chmod -R 777 /usr/local/nginx/logs/error.log
忽悠nginx启动默认配置文件模块的软链接代码完毕!
Ps:
/data/software/lnmp1.1-full/nginx-1.6.0# vi ./objs/ngx_auto_config.h 查看源码:
也就是说不光是pid和error.log,还有那个access.log: /usr/local/nginx/logs/access.log 好像还有这个问题,操作如下解决:
rm -Rf /usr/local/nginx/logs/access.log
touch /data/logs/nginx/nginx_access.log
chown www /data/logs/nginx/nginx_access.log
ln -s /data/logs/nginx/nginx_access.log /usr/local/nginx/logs/access.log
chown www /usr/local/nginx/logs/access.log
这样干的结果是:
ls -lart /usr/local/nginx/logs
error.log -> /data/logs/nginx/nginx_error.log
access.log -> /data/logs/nginx/nginx_access.log
关于access.log,是这样的一个日志情况,经实践如下:
1)如果有设置会向设置里写。
2)如果没有设置关闭,会默认向:/usr/local/nginx/access.log里写。
3)如果加上:access_log off ,又打开了:access_log /data/logs/nginx/access_justwinit.log access;
(1)打开的指令失效。 (2)也不向nginx默认的/usr/local/nginx/access.log里写。 也就是全关掉了。
location ~ .*\.(js|css)?$
{
expires 1d;
limit_conn addr 5;
limit_conn_status 505;
}
access_log off;#关掉下面日志路径后,不加这一行会向:/usr/local/nginx/logs/access.log写
#access_log /data/logs/nginx/access_justwinit.log wap_access;
#access_log /data/logs/nginx/access_justwinit.log access;
}
Finished...
——————————————————————————————————
为何放在/data下呢,因为/data是另一块大一点的vps磁盘,适合存放日志:
/dev/sda3 14G 6.3G 6.4G 50% /
/dev/sdb 94G 27G 63G 31% /data
一)删除了logs目录:rm -Rf /usr/local/nginx/logs
二)修改error_log的指向位置,Nginx配置如下:
#error_log /data/logs/nginx/nginx_error.log debug;
#error_log /data/logs/nginx/nginx_error.log notice;
#error_log /data/logs/nginx/nginx_error.log crit;
#error_log /data/logs/nginx/nginx_error.log;
#error_log /dev/null crit;
error_log /data/logs/nginx/nginx_error.log error | debug_core | debug_alloc //这个或配置好像有问题在新版本出现Starting nginx... nginx: [emerg] invalid log level "|" in /usr/local/nginx/conf/nginx.conf:14
, 参考自:http://blog.csdn.net/gsnumen/article/details/7824234
三)启动下nginx试下看,出现如下问题:
root@119.10.6.23:/usr/local/nginx/conf# ../sbin/nginx -c ./conf/nginx.conf
nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)
问题,我都修改指向了,还去读取这个/usr/local/nginx/logs/error.log 干嘛?
一兄弟我查下源码去了,说了一下问题所在,相当感谢:
—————————————————QA—————————————————
说:这个/usr/local/nginx/logs/error.log日志写死了,我昨天查好多个G里面,把我/占了95%。
答:日志是不能少的。可以写个定时删除N天以前日志的功能呀。
问:等nginx启动成功后,会自动替换成你指定的log。这种逻辑真是不符合我的世界观,为何?
答:
1)这个错误是在 ngx_log_init 函数报出来的,也就是NGX_PREFIX/logs/error.log 是nginx启动时用的日志文件,在这个时候连配置都还没去解析,所以和配置里的error_log没有关系。
2)我在启动过程中(在配置读取之前)有错误,我得错误信息该往哪里写呢?我只能用默认的地址。
3)你需要保留 NGX_PREFIX/logs/error.log 这个路径存在,但你配置里可以把 access_log error_log 指向别处的。
等nginx启动成功后,会自动替换成你指定的log。
4)还可能有一个nginx.pid也在这个logs下面。
可我修改了:pid /data/nginx/nginx.pid;
ls /data/nginx/nginx.pid
/data/nginx/nginx.pid
最后的解决办法:
(那要么单独出来,别混一块儿啊,用软链接直接纪念品混一块得了,其实是两个文件才对故意搞一块!)
我不太了解这块,我觉得个系统启动错误得学下mysql...的启动错误,别和用户的虚拟机搞一个文件。
对源码不熟悉,不过也非常感谢了,我现在直接做软链接实现了,在启动时写那地儿你说的替换成你指定的log是一个文件。
根本原因是我不想有nginx下的logs文件夹和nginx的设计有冲突,如下:
一启动就先读配置呢
----
在读配置之前,还有很多事情要做呢,比如 参数处理 os_init 各个模块初始化(配置本身也是一个模块)
其实启动的错误文件和error_log文件混淆成一个文件了。程序员的角度这个/usr/local/nginx/logs/error.log是nginx从系统层面启动时的默认,而这个error_log呢,则是从运行起来后的日志级别来讲的,其实这块有点蒙,呵呵。
—————————————解决办法————————————
—操作记录—这下就忽悠nginx在logs下面有这个文件,其实是个软链接,它再按我配置的error_log写时,还是那个文件—
ln -s /data/logs/nginx/nginx_error.log /usr/local/nginx/logs/error.log
ls -lart /usr/local/nginx/logs
/usr/local/nginx/logs/error.log -> /data/logs/nginx/nginx_error.log
chmod -R 777 /usr/local/nginx/logs/error.log
忽悠nginx启动默认配置文件模块的软链接代码完毕!
Ps:
/data/software/lnmp1.1-full/nginx-1.6.0# vi ./objs/ngx_auto_config.h 查看源码:
也就是说不光是pid和error.log,还有那个access.log: /usr/local/nginx/logs/access.log 好像还有这个问题,操作如下解决:
rm -Rf /usr/local/nginx/logs/access.log
touch /data/logs/nginx/nginx_access.log
chown www /data/logs/nginx/nginx_access.log
ln -s /data/logs/nginx/nginx_access.log /usr/local/nginx/logs/access.log
chown www /usr/local/nginx/logs/access.log
这样干的结果是:
ls -lart /usr/local/nginx/logs
error.log -> /data/logs/nginx/nginx_error.log
access.log -> /data/logs/nginx/nginx_access.log
关于access.log,是这样的一个日志情况,经实践如下:
1)如果有设置会向设置里写。
2)如果没有设置关闭,会默认向:/usr/local/nginx/access.log里写。
3)如果加上:access_log off ,又打开了:access_log /data/logs/nginx/access_justwinit.log access;
(1)打开的指令失效。 (2)也不向nginx默认的/usr/local/nginx/access.log里写。 也就是全关掉了。
location ~ .*\.(js|css)?$
{
expires 1d;
limit_conn addr 5;
limit_conn_status 505;
}
access_log off;#关掉下面日志路径后,不加这一行会向:/usr/local/nginx/logs/access.log写
#access_log /data/logs/nginx/access_justwinit.log wap_access;
#access_log /data/logs/nginx/access_justwinit.log access;
}
Finished...
——————————————————————————————————
为何放在/data下呢,因为/data是另一块大一点的vps磁盘,适合存放日志:
/dev/sda3 14G 6.3G 6.4G 50% /
/dev/sdb 94G 27G 63G 31% /data
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/7783/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2015-2-3 13:08
评论列表