nginx的error.log日志常见的几个错误解决方法

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

nginx.conf里会有两个日志,分为access.log 和 error.log。其中这两个日志可以细化,一般来说在nginx目录下会有一个logs会保存,然后也可以在对应的server目录里可以分别的设定access.log和error.log来了解对应server的情况。


access.log主要是记录"谁来登陆了,从哪里登陆的,登陆后发生了什么",具体格式可以在nginx.conf里设定。


error.log主要记录的是检查nginx.conf里发现的错误,模式不支持自定义。与access.log后面经常用main结尾不同,error.log后面的结尾可能是warm也可能是crit,这里的warm或者crit代表错误的等级,crit表示最少,而debug表示记录的最详细,屁大点事都记下来。


error_log off并不能关闭日志记录功能,它将日志文件写入一个文件名为off的文件中,如果你想关闭错误日志记录功能,应使用以下配置:error_log /dev/null crit;(把存储位置设置到Linux的黑洞中去 )。


当打开error.log的时候,可能会看到各种样的内容,比如:

1
“2016 /05/03  10:20:51 [emerg] 20952 #0: unexpected "}" in /usr/local/nginx/conf/nginx.conf:87”

这句话就说明在nginx.conf的87行里有一个 } 是错误的,检查一下}是不是多余了,或者;少了,这个错误的级别是emergency

1
2016 /05/03  10:23:01 [emerg] 21023 #0: "root" directive is duplicate in /usr/local/nginx/conf/nginx.conf:86

这句话就是说明在nginx.conf的第86行里root设定重复了,级别同样是emergency。以上两个都是书写的问题,很好纠正;

1
2016 /05/03  10:23:31 [notice] 21045 #0: signal process started

这个意思是nginx已经在运行的状态下,被执行启动,这个不算致命错误;

1
nginx: [alert] could not  open  error log  file open () "/usr/local/nginx/logs/error.log"  failed (13:Permissiondenied)


这个是说当前用户没有权限写入error.log的日志,解决方法要来权限就行了;

1
nginx: [error]  open ()  "/usr/local/nginx/logs/nginx.pid"  failed (2: No such  file  or directory)

nginx提示无法找到nginx.pid这个文件了,使用#/usr/local/nginx/sbin/nginx -c  /usr/local/nginx/conf/nginx.conf,重新启动一下,就自动生成pid文件了。


下面说几个有特殊代表性的错误:

1)worker process 某某某 exited on signal 11 (core dumped)   
这种错误基本就是刷error.log的屏,严重的甚至直接让nginx崩掉。具体表现在用户端就是“视频打不开,网页打不开等等等”。


这种错误一般是表示用户程序nginx进行读操作时访问的地址无效,具体一点就是搜索引擎的蜘蛛在爬取到加密部分时,得不到正确的路径,又没有被定位到错误页导致的。


如何修改,在nginx.conf里的防盗链部分检查一下“secure_download_fail_location;” ,即“请求错误时,定向到错误页”的模块,确认location是否定向到一个正确地址为错误页面。


2)nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)    

nginx先监听了ipv4的80端口之后又监听了ipv6的80端口,于是就重复占用了。

把nginx.conf里的:

1
2
listen 80;
listen [::]:80 default_server;

改成

1
2
listen 80;
listen [::]:80 ipv6only=on default_server;

http://stackoverflow.com/questions/14972792/nginx-nginx-emerg-bind-to-80-failed-98-address-already-in-use


3)  rewrite or internal redirection cycle while internally redirecting to "/ie.html", client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", host: "203.46.90.146"

这个错误一般就是rewrite重定向进入了死循环,用户端的情况就是登陆localhost/ie.html的时候,出现500错误。要解决这个问题需要vim一下nginx.conf这个配置文件,查找到ie.html。发现这一行是这么写的:

1
2
3
4
5
6
7
location / {
     if  ($http_usr_agent ~ MSIE) {         #如果用户使用的浏览器匹配ie的话
         rewrite ^.*$  /ie .html;         #ie用户会rewrite到/usr/local/nginx/html/ie.html里
         }
     root  /usr/local/nginx/html ;           #非ie用户就是访问/usr/local/nginx/html的index.html界面
     index index.html
}

返回到/usr/local/nginx/html,发现的确存在ie.html,且格式正确。


问题在 if语句那一段,ie用户被发现使用的浏览器是ie就会去登陆/ie.html界面,但是,要登陆/ie.html的时候还是会先判断浏览器型号,发现是ie,然后又被派去登陆/ie.html,然后再登陆/ie.html的时候,又要判断浏览器型号,就这样周而复始死循环,所以最后就500,Internal Server Error。


遇到这种情况怎么办?增加一个break,跳出循环重定向。

1
2
3
4
5
6
7
8
location / {
     if  ($http_usr_agent ~ MSIE) {         #如果用户使用的浏览器匹配ie的话
         rewrite ^.*$  /ie .html;         #ie用户会rewrite到/usr/local/nginx/html/ie.html里
          break
             }
     root  /usr/local/nginx/html ;           #非ie用户就是访问/usr/local/nginx/html的index.html界面
     index index.html
}


4)open() "某网址" failed (24:Too Many open files),client:某某某,server:某某某...

这种错误很明显,就是一个socket进程打开的文件超额,这种情况,需要适当放开可打开的文件数量。

ulimit -n 20000,这个值默认是1024,现在放大到20000。


5)499错误

Nginx的error.log有可能会出现499错误,这种错误有两种可能,一个是客户端主动断开链接;第二个就是两个post距离过近,nginx认为这种快速提交post是不安全的,服务器就主动拒绝链接。

解决这种错误就是在nginx.conf的全局配置里,添加一句话:

proxy_ingore_client_abort on;

意思是让服务器不要主动关闭对客户端的链接。这么搞,安全性肯定是会有所下降,但是总比找不到服务器要好。



 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1769724

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
数据可视化 关系型数据库 MySQL
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
266 90
|
5月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1731 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
4月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
131 9
|
5月前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
328 7
|
2月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
194 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
1月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
119 13
|
1月前
|
缓存 Java 编译器
|
2月前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
88 5
图解MySQL【日志】——Redo Log
|
1月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
141 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
163 7
MySQL事务日志-Undo Log工作原理分析
下一篇
oss创建bucket