欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Nginx常见错误与解决方法 有大用

篇一:Nginx常见错误与解决方法

上海纽斯达科技

Nginx常见错误与解决方法

上海纽斯达科技有限公司

2014-10-25

文档状态

目的:

在Nginx服务器出现故障时,能快速定位并解决相关错误。

保密:

本文档仅供内部使用,请勿外传

概述:

Nginx常见错误与问题之解决方法技术指南。

安装环境:

系统环境:redhat enterprise 6.5 64bit

1、Nginx 常见启动错误

有的时候初次安装nginx的时候会报这样的错误

sbin/nginx -c conf/nginx.conf

报错内容:sbin/nginx: error while loading shared libraries: libpcre.so.1:

cannot open shared object file: No such file or directory

启动时如果报异常error while loading shared libraries: libpcre.so.1: cannot open

shared object file: No such file or directory 这说明我们的环境还不是和启动需要

小小的配置一下

解决方法(直接运行):

32位系统 [root@sever lib]# ln -s /usr/local/lib/libpcre.so.1 /lib

64位系统 [root@sever lib]# ln -s /usr/local/lib/libpcre.so.1 /lib64

然后执行ps -ef | grep nginx 查看nginx进程确认是否真的已经启动了,在进程列表里会

有最起码两个, worker(nginx工作进程)和master(nginx主进程)

root 4349 1 0 02:24 ? 00:00:00 nginx: master process sbin/nginx -c

conf/nginx.conf

nginx 4350 4349 0 02:24 ? 00:00:00 nginx: worker process

root 4356 28335 0 02:30 pts/1 00:00:00 grep nginx

NGINX 就 OK了

2、400 bad request错误的原因和解决办法

配置nginx.conf相关设置如下.

client_header_buffer_size 16k;

large_client_header_buffers 4 64k;

根据具体情况调整,一般适当调整值就可以。

3、Nginx 502 Bad Gateway错误

在php.ini和php-fpm.conf中分别有这样两个配置项:max_execution_time和

request_terminate_timeout。

这两项都是用来配置一个PHP脚本的最大执行时间的。当超过这个时间时,PHP-FPM不只会终止脚本的执行,

还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。

以PHP-FPM的request_terminate_timeout=30秒时为例,报502 Bad Gateway错误的具体信息如下:

1)Nginx错误访问日志:

2013/09/19 01:09:00 [error] 27600#0: *78887 recv() failed (104: Connection reset by peer) while reading response header from upstream,

client: 192.168.1.101, server: test.com, request: "POST /index.php

HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:",

host: "test.com", referrer: "http://test.com/index.php"

2)PHP-FPM报错日志:

WARNING: child 25708 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start

所以只需将这两项的值调大一些就可以让PHP脚本不会因为执行时间长而被终止了。

request_terminate_timeout可以覆盖max_execution_time,

所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。

此外要注意的是Nginx的upstream模块中的max_fail和fail_timeout两项。有时Nginx与上游服务器(如Tomcat、FastCGI)的通信只是偶然断掉了,

但max_fail如果设置的比较小的话,那么在接下来的fail_timeout时间内,Nginx都会认为上游服务器挂掉了,都会返回502错误。

所以可以将max_fail调大一些,将fail_timeout调小一些。

4、Nginx出现的413 Request Entity Too Large错误

这个错误一般在上传文件的时候会出现,

编辑Nginx主配置文件Nginx.conf,找到http{}段,添加

client_max_body_size 10m; //设置多大根据自己的需求作调整.

如果运行php的话这个大小client_max_body_size要和php.ini中的如下值的最大值一致或

者稍大,这样就不会因为提交数据大小不一致出现的错误。

post_max_size = 10M

upload_max_filesize = 2M

5、解决504 Gateway Time-out(nginx)

遇到这个问题是在升级discuz论坛的时候遇到的一般看来, 这种情况可能是由于nginx默认的

fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务

对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out,现在的网站, 尤其某

些论坛有大量的回复和很多内容的, 一个页面甚至有几百K。默认的fastcgi进程响应的缓冲区

是8K, 我们可以设置大点在nginx.conf里, 加入: fastcgi_buffers 8 128k这表示设置

fastcgi缓冲区为8×128

当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点,例如设置成90秒:

send_timeout 90;只是调整了这两个参数, 结果就是没有再显示那个超时, 效果不错 Nginx中关于与上游服务器通信超时时间的配置factcgi_connect/read/send_timeout。

以Nginx超时时间为90秒,PHP-FPM超时时间为300秒为例,报504 Gateway Timeout错误时的Nginx错误访问日志如下:

2013/09/19 00:55:51 [error] 27600#0: *78877 upstream timed out (110: Connection timed out) while reading response header from upstream,

client: 192.168.1.101, server: test.com, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:",

host: "test.com", referrer: "http://test.com/index.php"

调高这三项的值(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)之后,504错误也解决了。

而且这三项配置可以配置在http、server级别,也可以配置在location级别。担心影响其他应用的话,就配置在自己应用的location中吧。

要注意的是factcgi_connect/read/send_timeout是对FastCGI生效的,而

proxy_connect/read/send_timeout是对proxy_pass生效的。

配置举例:

location ~ \.php$ {

root /home/cdai/test.com;

include fastcgi_params;

篇二:nginx日志研究

日志切割

1概论

服务器程序运行时会产生各种日志,如错误日志,登陆日志等。 这些日志作用很大,errlog可以分析服务器运行状况,出现的bug等。Accesslog可以做数据挖掘,用户行为分析。

这些数据随着时间的增长会变得很大,根据需要可以做相应的切割。 2原理

服务器的代表:APACHE、 NGINX。就拿它们为例。

在httpd.conf 和nginx.conf中可以配置使它们在运行的时候自动产生日志。

当服务器运行一段时间后,日志会变得很大,不容易查找和分析。我们可以每天备份一份,或者按大小备份。

日志切割的原理其实是将:当前的日志更名保存,然后服务器重载配置文件,重新生成日志文件。

3实例

拿NGINX为例。

3.1首先

将日志名按照格式更改,可以按照时间,也可以按照大小。这里有两

种方式对日志进行更改

第一种:linux指令

Mv access_log access_log_2013/05/20

第二种方式:用logrotate进行更改。logrotate是对日志轮询的工具,轮询则意味着备份,可以按照名称,亦可以按照大小等等。其生效是依靠配置文件来的。在/etc/l(来自:WWw.cssyq.Com 书业网:nginx启动日志)ogrotate.conf ,这是主配置文件,记录了大概的配置,更细的配置则在/etc/logrotate.d/目录下,需要新建一个相应的配置文件,这里我们建立名为nginx的文件。在logrotate.conf里有 include /logrotate.d/nginx 将自己写的配置文件包括进去。 Logrotate 还可以将日志进行压缩,记录转存的计数。更详细的配置在http://5iqiong.blog.51cto.com/2999926/790908

对文件进行更名的配置是:dateext; logrotate 会根据这个命令将文件按照时间进行更名。然后再发送 消息让nginx重载配置文件,重新生成日志。

重要的一点:logrotate是一个程序,不是一项服务,他可以将文件更名,但不能每天都这样做,因为它不是服务,会持续性的运行着。如果每天切割日志,则需要定时任务的配合。后面后讲到cron的应用。

3.2然后

发信号给nginx主进程。这里是:kill –USR1 `cat /usr/local/nginx/logs/nginx.pid`

Kill 并不是杀死进程,是发信号的意思,根据后面的参数不同产生不同的效果。 USR1是用户自定义的信号,一般没什么特定的作用,当用户发送USR1信号给apache或者nginx主进程的时候,主进程此时的响应会是先停止处理用户请求,将数据写入硬盘,然后重载配置文件,继续写入日志。注意,此时的继续写入日志是如果原来的access_log存在,则继续写入,如果不存在,则生成名为access_log的文件。如果日志切割的话,则意味着在此之前就得对日志进行更名。 到此,日志切割的步骤基本上完成了。如果需要每天切割一次,则需要些定时任务。

3.3定时任务

Linux系统的定时任务分为两块,一个是系统任务,一个是用户任务。

系统任务:系统每天,每星期,每个月都会定时执行的任务。需要配置文件才能生效。配置文件在 /etc/crontab ,修改之,就能生效。 01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

系统会根据这四行,每小时,每天,每星期,每月执行里面的任务。 /etc/cron.daily等里面是 要执行的任务指令。比如

/usr/sbin/logrotate -f /etc/logrotate.d/nginx

或者

/bin/bash /usr/local/nginx/nginx.sh

Nginx.sh 是自己写的将文件更名的脚本指令:

Mv /usr/local/nginx/logs/access.log access_log_${date –d +”%Y”+”%M”}

用户任务则相对简单些,直接用命令:crontab –e

打开用户计划任务,在里面写入你要执行的任务就行了。 Logrotate –f /etc/logrotate.d/nginx

或者

Usr/local/nginx/nginx.sh

为了每天执行,则需要在前面写上时间,于是,整个的指令如下: 00 00 * * * /usr/local/nginx/nginx.sh

*表示每

- 代表从哪到哪 1-3 从一到3

/ 表示每隔

一共五位,依次表示 分钟/ 小时/ 天/ 月/ 星期

具体的介绍见http://blog.csdn.net/tianlesoftware/article/details/5315039

篇三:Nginx自动日志切割

nginx自动日志功能与日志自动切割脚本

关于nginx包含变量的自动日志:

使用自动日志需要注意以下:

1、nginx日志目录权限,以我的安装路径为例/usr/local/nginx,那我的日志目录就是在/usr/local/nginx/logs里;使用了包含变量

自动日志,那么这个目录nginx的用户需要有写入的权限,否则将不可能生成日志。默认情况下,nginx的运行用户为nobady。 我的

习惯是安装一个程序然后给他分配一个专用账户使用。

2、缓存将不会被使用,因为使用了变量的原因吧(这一点我还没有完全理解)

3、每条日志,要先打开文件,然后写入,最后关闭文件,如此循环。此时,需要开启nginx的open_log_file_cache功能,缓存经常

被使用的日志文件描述符缓存。open_log_file_cache 默认为off

open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;

max 最大的文件描述符数量,最大的缓存数量

inactive 在多少时间内不活动,就会被删除

min_uses 如果在inactive时间内,使用超过该参数定义的次数,就会被缓存 valid 多少时间检查一次。

http {

…………

log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/$server_name.access.log main;

open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;

…………省去了其他行

}

最后,日志文件名会以在

svr3.labexam.com.access.log

4、关于日志切割:

完成以上三项后,并不是工作的结束,只是又一个开始。日志会随着访问量的增大急速增长,所以需要做日志的切割!

以下是一个脚本:

#!/bin/bash

#made by cheng

#blog:myhat.blog.51cto.com

#!/bin/bash

#made by cheng

#blog:myhat.blog.51cto.com

#last_time=2011/08/16

#your logs store

log_path=/data

nginx_pid=/usr/local/nginx/logs/nginx.pid

nginx_log=/usr/local/nginx/logs

yesterday=`date -d "yesterday" +%Y%m%d`

host=`ls -l $nginx_log/*.access.log | awk -F " " '{print $9}' | awk -F ".access" '{print $1}' | awk -F "$nginx_log/" '{print $2}'`

for i in $host

do

if [ ! -d $log_path/$i/$yesterday ];then server_name中定义的名字开始。例:

mkdir -p $log_path/$i/$yesterday

else

if [ ! -f $log_path/$i/$yesterday/$yesterday.access.log ];then

mv $nginx_log/$i.access.log \

$log_path/$i/$yesterday/$yesterday.access.log

kill -USR1 `cat $nginx_pid`

else

mv -bf $nginx_log/$i.access.log \

$log_path/$i/$yesterday/$yesterday.access.log_1 kill -USR1 `cat $nginx_pid`

fi

fi

done

最后需要做的是,把这个脚本放到crontab里,让其00:00时运行!

运行该脚本后,会自动根据虚拟主机的主机名建立主目录,在该目录下层放新建前一天的日期目录,然后把昨天的日志放到这个目录里。实现每天一次日志切割。

*******该脚本运行的前提是,使用了自动日志的功能。

篇四:nginx日志

nginx日志

日志对于统计排错来说非常有利的。本文总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。

nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx__log_module是用来定义请求日志格式的。

1. access_log指令

语法: access_log path [format [buffer=size [flush=time]]];

access_log path format gzip[=level] [buffer=size] [flush=time];

access_log syslog:server=address[,parameter=value] [format];

access_log off;

默认值: access_log logs/access.log combined;

配置段: , server, location, if in location, limit_except

gzip压缩等级。

buffer设置内存缓存区大小。

flush保存在缓存区中的最长时间。

不记录日志:access_log off;

使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;

2. log_format指令

语法: log_format name string ?;

默认值: log_format combined “?”;

配置段:

name表示格式名称,string表示等义的格式。log_format有一个默认的无需设置的combined日志格式,相当于apache的combined日志格式,如下所示:

IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址。PS: 获取用户真实IP 参见://.ttlsa.com/html/2235.html如下所示:

日志格式允许包含的变量注释如下:

[warning]发送给客户端的响应头拥有“sent__”前缀。 比如$sent__content_range。[/warning]

实例如下:

语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

open_log_file_cache off;

默认值: open_log_file_cache off;

配置段: , server, location

对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下: 参数注释如下:

max:

设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。

inactive:设置存活时间,默认是10s

min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次

valid:设置检查频率,默认60s

off:禁用缓存

实例如下:

4. log_not_found指令

语法: log_not_found on | off;

默认值: log_not_found on;

配置段: , server, location

是否在error_log中记录不存在的错误。默认是。

5. log_subrequest指令

语法: log_subrequest on | off;

默认值: log_subrequest off;

配置段: , server, location

是否在access_log中记录子请求的访问日志。默认不记录。

6. rewrite_log指令

由ngx__rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南

语法: rewrite_log on | off;

默认值: rewrite_log off;

配置段: , server, location, if

启用时将在error log中记录notice级别的重写日志。

7. error_log指令

语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];

默认值: error_log logs/error.log error; 配置段: main, , server, location 配置错误日志。


来自 http://www.cssyq.com/rizhi/413325.html

https://wenku.baidu.com/view/4947d8d685254b35eefdc8d376eeaeaad1f31601.html

普通分类: