nginx和php响应时间过长502排查

说明:
web页面响应时间长,要怎么排查?
9
因为是lnmp系统,可以通过设置nginx日志,记录nginx处理请求的时间、开启php慢执行来排查

解决:
一、修改nginx.conf日志格式,记录nginx响应时间
# vim /usr/local/nginx/conf/nginx.conf //添加$request_time $upstream_response_time参数

log_format  access  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$request_time $upstream_response_time ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;

$request_time: request processing time in seconds with a milliseconds resolution;time elapsed between the first bytes were read from the client and the log write after the last bytes were sent to the client$request_time。nginx处理请求的时间,指的就是从接受用户请求数据到发送完回复数据的时间。

$upstream_response_time: keeps servers response times in seconds with a milliseconds resolution. Several responses are also separated by commas and colons. $upstream_response_timephp-cgi的响应时间,说的有点模糊,它指的是从Nginx向后端建立连接开始,到接受完数据然后关闭连接为止的时间。因为会有重试,它可能有多个时间段。一般来说,$upstream_response_time 会比$request_time时间短。(其实也可以加上upstream_status的状态返回值)

截取部份日志,可以看到客户端获取test.php。nginx共花费了5.308s(这个时间包括了php后端处理的时间),php后端处理也花费了5.308s。这说明响应慢很有可能是因为php程序的原因。接下就就是排查php
$request_time时间比$upstream_response_time长,这有可能是因为web页面通过post上传较大的数据,nginx一直在接收数据。

8.8.8.8 – – [17/Jan/2014:16:20:51 +0800] “GET /index.php HTTP/1.1” 5.308 5.308 200 6364 “http://coolnull.com/test.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)” –

二、查看php-fpm慢查询日志。php-fpm提供了慢执行日志,可以将执行比较慢的脚本的调用过程dump到日志中。
配置比较简单,PHP 5.3.3 之前设置如下:

The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
‘0s’ means ‘off’
<value name=”request_slowlog_timeout”>1s</value>

The log file for slow requests
<value name=”slowlog”>logs/slow.logs</value>

PHP 5.3.3 之后设置以下如下:

; The log file for slow requests
; Default Value: not set
; Note: slowlog is mandatory if request_slowlog_timeout is set
;slowlog = log/$pool.log.slow
slowlog = /data/logs/php/php-fpm.log.slow

; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the ‘slowlog’ file. A value of ‘0s’ means ‘off’.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
;request_slowlog_timeout = 0
request_slowlog_timeout = 3s

还可以将执行时间太长的进程直接终止,设置下执行超时时间即可。

PHP 5.3.3 之前版本:
The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when ‘max_execution_time’ ini option does not stop script execution for some reason
‘0s’ means ‘off’
<value name=”request_terminate_timeout”>10s</value>

PHP 5.3.3 之后设置以下如下:

;The timeout for serving a single request after which the worker process will ; be killed.This option should be used when the ‘max_execution_time’ ini option ; does not stop script execution for some reason. A value of ‘0’ means ‘off’.;Available units: s(econds)(default), m(inutes), h(ours),or d(ays);DefaultValue:0 request_terminate_timeout =10s

加上慢执行日志后,基本可以从慢执行日志中看出问题所在,比如:

Feb 07 19:00:30.378095 pid 7012 (pool default)
script_filename = /www/test.php
[0x000000000115ea08] flock() /www/logs.php:26
[0x0000000001159810] lock_stats() /www/test.php:12

Feb 07 19:00:31.033073 pid 7038 (pool default)
script_filename = /www/test.php
[0x00000000012686e8] flock() /www/logs.php:26
[0x00000000012634f0] lock_stats() /www/test.php:12

很明显是程序中产生了死锁,导致各个 PHP-CGI 进程互相等待资源而锁死。据此,再进行进一步的程序分析,就更具方向性了。有时候php-fpm慢执行日志只会给出执行长的php程序,具体还得程序那边配合排查。

发表在 开源代码 | 标签为 , | 留下评论

IIS7.5伪静态URLRewrite首页301跳转www

很多时候我们需要把不带www的域名301重定向到主域名下,windows server 2008 iis7.5安装urlwrite重写模块后,可以在虚拟主机根目录下的web.config文件复制进一下内容即可:

<rule name=”www 301″ stopProcessing=”true”>
<match url=”^(.*)$” ignoreCase=”false” />
<conditions logicalGrouping=”MatchAll” trackAllCaptures=”false”>
<add input=”{HTTP_HOST}” pattern=”^teachdb\.com$” ignoreCase=”false” />
</conditions>
<action type=”Redirect” url=”http://www.teachdb.com/{R:1}” redirectType=”Permanent” />
</rule>

红色部分改成你对应的域名,还有teachdb.com这样不带www的域名记得解析到对应的ip上,还有虚拟主机记得绑定对应的域名,不然没效果。

发表在 服务器 | 标签为 , | 留下评论

PHP microtime() 函数

microtime() 函数返回当前 Unix 时间戳和微秒数。

这里要指出的是在windows下调用microtime() 函数输出msec部分是没办法实时的,一个循环输出后msec部分结果是一样的。

for($i=0; $i<3; $i++){
echo microtime(true).'<br>’;
}

0.14062500 1411350448
0.14062500 1411350448
0.14062500 1411350448

而linux下就可以捕捉到msec的变化

0.38366600 1411350555
0.38368000 1411350555
0.38368200 1411350555

如果调用时不带可选参数,本函数以 “msec sec” 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。

发表在 开源代码 | 标签为 | 留下评论

win2008 R2 iis7.5 php5.3.29安装Zend Guard Loader

环境 windows server 2008 R2 iis7.5 php5.3.29安装Zend Guard Loader

先下载扩展:

http://downloads.zend.com/guard/5.5.0/ZendGuardLoader-php-5.3-Windows.zip

解压后ZendLoader.dll(Windows)上传到服务器。

3。加载ZendGuardLoader,配置PHP.INI
例子:
zend_extension=”C:\php\ext\ZendLoader.dll”
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=

重启IIS,执行phpinfo();

显示

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
with Zend Guard Loader v3.3, Copyright (c) 1998-2010, by Zend Technologies //标识成功

这里有个坑需要特别注意,我安装php5.3.39的时候开始安装的是安全线程的php-5.3.29-Win32-VC9-x86.zip,搞了半天始终加载不成功,但是同样可以在win08 R2下运行fastcgi。

最后php-5.3.29-nts-Win32-VC9-x86.zip换成非安全的就可以加载成功了。

 

发表在 服务器 | 标签为 , , | 留下评论

Windows快速删除包含大批量文件和子目录的方法

Windows系统中文件夹中文件数量比较多时,Windows系统的删除功能会在删除之前不停的计算文件大小及结构导致非常慢,在这里找了2个DOS命令,相对可以比较快速删除含有大量文件的文件夹。

命令如下:

rmdir [drive:]path [/S] [/Q]

del [drive:]path [/S] [/Q]

/S 除目录本身外,还将删除指定目录下的所有子目录和文件

/Q 安静模式,删除时不需要确认

如删除 C:\test\目录下所有文件:
rmdir c:\test\ /S /Q
del c:\test\ /S /Q

推荐使用rmdir,比del效率更高。

发表在 软件 | 标签为 , | 留下评论

windows2008R2 IIS7.5部分asp下500错误

环境windows server 2008 r2 iis7.5 asp运行access mdb数据库

出现部分页面神奇的500错误,已经打开父路径,win32程序,目录给予程序池用户写入

大部分也是没有问题的数据也能更新插入,问题有些页面就死活出现500

而且这种内部500错误是无法,按网上指定的500-100.asp等方式显示出具体错误的。

尝试给mdb数据库添加everyone所有控制的权限是可以解决的

证明了是权限问题导致的,最终测试了半天,解决方法很简单:

找到网站-身份认证-编辑匿名身份认证-特定用户改成应用程序池标识即可。

发表在 服务器 | 标签为 , | 留下评论

IIS7.5安装PHP5.3.29后运行PHP很慢

最近一台环境为window server 2008 iis7.5的服务器,安装php5.3.29 nt安全线程模式为fastcgi,执行html的时候响应时间1秒内,可是执行php页面死活都要1秒以上,单独运行echo phpinfo的时候速度超快,经过排查,原来是数据导致的,上网一搜索,解决方案很简单:

把数据库的localhost改为127.0.0.1

或者

打开“%systemroot%\System32\drivers\etc\hosts”这个文件,注释掉“127.0.0.1       localhost”即可。

不需要重启任何程序,刷新页面看看吧

发表在 服务器 | 标签为 , , | 留下评论

IIS7.5和IIS6网站权限配置与区别

windows server 2008 iis 7.5 下的应用程序池标识的预定义账户有下面几个可选项:

  • ApplicationPoolIdentity 默认情况下,选择“应用程序池标识”帐户。启动应用程序池时动态创建“应用程序池标识”帐户,因此,此帐户对于您的应用程序来说是最安全的。
  • LocalService “本地服务”帐户是用户组的成员之一,它拥有与“网络服务”帐户相同的用户权限,但仅限于在本地计算机上使用。当应用程序池中的工作进程不需要访问它所运行在的 Web 服务器以外的内容时,可以使用此帐户。
  • LocalSystem “本地系统”帐户拥有所有用户权限,它是 Web 服务器上的管理员组的成员之一。应尽可能避免使用“本地系统”帐户,因为它会给 Web 服务器带来更严重的安全风险。
  • NetworkService “网络服务” 帐户是 Users 组的成员之一,并拥有运行应用程序所需的用户权限。通过使用计算机帐户的凭据,它可以在整个基于 Active Directory 的网络上进行交互。

IS6网站权限,通常配置IUSR_计算机名和NETWORK SERVICE两个用户权限即可:

其中IUSR_计算机名是网站匿名访问帐户,NETWORK SERVICE是网站应用程序池安全帐户:

然而,同样的权限配置,测试发现IIS7.5网站动态页面打开会出错。比较发现IIS7.5应用程序池安全帐户除了本地系统、网络服务和本地服务外,比IIS6多了一个ApplicationPoolIdentity,并且它是默认安全帐户:

如果应用程序池选择的是 ApplicationPoolIdentity , 这个账户的权限很低, 只属于 IIS_IUSRS 用户组, 甚至不属于 Users 用户组, 而应用程序又需要访问本地文件系统 (比如日志输出) , 就需要为 ApplicationPoolIdentity 账户设置 NTFS 权限, 这个账户在安全对话框是找不到的, 只能手工输入 IIS APPPOOL\{app pool name} 进行设置。

clip_image001

clip_image002

通过查看 IIS_IUSRS 用户组的属性可以看到全部的“应用程序池标识”账户, 如下图:

clip_image003

看下任务管理器中的变化:

这样相当于是有了多个NETWORK SERVICE用户,能大大降低网站被旁注的风险。当然了,也可以将IIS7.5应用程序池安全帐户设置为网络服务,这样和IIS6.0一样配置即可,但不推荐这么做。此外,若想简单配置,只赋于网站Authenticated Users组权限也是可以的(代替匿名帐户+安全帐户,但比Everyone安全)。

发表在 服务器 | 标签为 , | 留下评论

Windows2008r2的IIS7.5伪静态URL_rewrite模块

需要至少iis7,测试环境为:windows server 2008 R2 64bit中文版+IIS 7.5

先到IIS官方下载模块
下载地址:http://www.iis.net/download/URLRewrite
根据需要,点击右侧的下载链接(我的系统是64位的,就下载x64的)

Download URL Rewrite Module 2.0

官网有时候可能修改下载不了,我这里提供 rewrite_x64_zh-CN.msi

安装好模块后,打开进入 “Internet 信息服务(IIS)管理器”,就可以看见模块中多了一个 Url 重写模块

QQ截图20140918142707

接下来我想你都会了,导入或自定义:

QQ截图20140918142943 也可以自己定义导入,实在不懂就点帮助吧

QQ截图20140918143059

发表在 服务器 | 标签为 , | 留下评论

iis7.5配置php执行出现500错误FastCGI进程意外退出

windows server 2008配置iis7.5+fastcgi+php时出现了 500错误FastCGI进程意外退出同时php-cgi.exe进程崩溃。一般都是因为php.ini文件没有指定一些参数导致。

很有可能就是一下几个配置路径问题导致的:

extension_dir =”C:\PHP\ext”
upload_tmp_dir=”C:\WINDOWS\Temp”
session.save_path=”C:\WINDOWS\Temp”
error_log=”C:\WINDOWS\temp\php-errors.log”

修改后记得重启IIS。

 

发表在 服务器 | 标签为 | 留下评论