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

本文解析Nginx的error.log常见错误及其解决方案,包括配置错误、重定向死循环等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

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

本文出自 “生活就是等待戈多” 博客,请务必保留此出处http://chenx1242.blog.51cto.com/10430133/1769724

<think>好的,我现在需要回答用户关于Nginxaccess.log文件内容及示例的问题。首先,我要确保自己正确理解用户的需求。用户想知道access.log文件中记录了哪些信息,并且希望看到具体的示例。根据用户提供的引用内容,我需要整合相关信息,确保回答准确,同时遵循系统级指令,比如使用中文、正确格式的数学表达式(虽然这里可能不需要),生成相关问题,以及正确引用来源。 首先,我应该回顾用户提供的引用。引用[1]提到access.log帮助定位问题,记录用户访问的状态、浏览器、IP、接口地址等。引用[2]详细说明了如何自定义日志格式,包括添加自定义请求头,例如http_x_seqno,并且日志格式使用json格式。引用[3]展示了使用awk分析access.log的例子,比如统计IP访问量。引用[4]提到了error.log的不同日志级别,但用户主要关注access.log。 接下来,我需要组织回答的结构。用户需要知道access.log的内容和示例。首先解释默认的日志格式,然后给出示例,可能包括默认格式和自定义格式(如JSON)。需要说明每个字段的含义,比如客户端IP、时间、请求方法、状态码、用户代理等。同时,要引用用户提供的资料,比如引用[2]中的自定义日志配置示例。 然后,我需要检查是否有遗漏的信息。用户提供的引用中有关于自定义请求头的内容,比如添加http_x_seqno,这可能需要在自定义日志部分提到。另外,引用[3]中的统计IP访问量的命令也可以作为示例的一部分,展示如何分析日志数据。 需要注意的是,用户的问题可能不仅仅是默认日志内容,还可能包括如何自定义日志格式,所以应该涵盖这两个方面。同时,生成的相关问题需要与access.log相关,比如如何分析日志、如何自定义格式、常见错误排查等,参考用户之前的问题结构。 在回答过程中,要确保使用正确的引用标注,例如在提到自定义JSON格式时引用[^2],在提到IP统计时引用[^3]。同时,保持语言简洁明了,结构清晰,分点说明默认日志格式和自定义示例。 最后,生成的相关问题需要与主题紧密相关,比如日志分析工具、自定义字段、错误排查等,这样可以引导用户进一步探索相关知识。</think>Nginx的$\\text{access.log}$文件记录了客户端请求的详细信息,其内容和格式可通过$\\text{log\_format}$配置项自定义。以下是典型内容和示例: --- ### 一、默认日志格式及字段解析 默认格式(组合式)包含以下核心字段: 1. **客户端IP**:`$remote_addr` 2. **访问时间**:`$time_local` 3. **请求行**:`$request`(含方法、路径、协议) 4. **状态码**:`$status` 5. **响应大小**:`$body_bytes_sent` 6. **来源页**:`$http_referer` 7. **用户代理**:`$http_user_agent` 示例日志条目: ``` 192.168.1.100 - - [10/Jul/2023:14:23:45 +0800] "GET /api/data HTTP/1.1" 200 1234 "https://example.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" ``` --- ### 二、自定义日志格式示例 通过修改$\\text{log\_format}$可扩展字段,例如JSON格式(支持添加自定义请求头): ```nginx log_format main escape=json '{' '"@timestamp":"$time_iso8601",' '"client_ip":"$remote_addr",' '"request_method":"$request_method",' '"status":"$status",' '"http_x_seqno":"$http_x_seqno"' '}'; ``` 生成日志示例[^2]: ```json { "@timestamp":"2023-07-10T14:23:45+08:00", "client_ip":"192.168.1.100", "request_method":"GET", "status":200, "http_x_seqno":"ABC-123" } ``` --- ### 三、日志分析示例 1. **统计独立IP访问量**: ```bash awk '{print $1}' access.log | sort | uniq -c | sort -nr ``` 输出示例: ``` 100 192.168.1.100 85 192.168.1.101 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值