绝对干货,沿用文中所说,当别人贴出优化配置的时候,并没有告诉你为什么要这么优化,也没有贴出具体的场景,而这2篇,除了告诉你优化了什么,还说明了为什么要这么做:
Part 1: Lessons learned tuning TCP and Nginx in EC2
Part 2: Lessons learned tuning TCP and Nginx in EC2
绝对干货,沿用文中所说,当别人贴出优化配置的时候,并没有告诉你为什么要这么优化,也没有贴出具体的场景,而这2篇,除了告诉你优化了什么,还说明了为什么要这么做:
默认情况下,无论是fastcgi_pass还是proxy_pass,每个请求都会建立后端服务器建立一个连接,然后关掉,这样带来的问题是
这个是fastcgi的例子,如果是http的则把端口改下就可以了
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 60;
}
加入fastcgi_keep_conn on;
location ~ .*\.php$
{
fastcgi_pass fastcgi_backend;
fastcgi_keep_conn on;
}
location ~ .*\.php$
{
# 清除"Connection"头部
proxy_set_header Connection "";
# 将http版本由1.0修改为1.1
proxy_http_version 1.1;
proxy_pass http://backend.server;
}
经过上面的优化,fastcgi和proxy的time_wait都可以由1000+下降到20+
php-fpm提供了状态输出,可以通过它来做些监控
vi php-fpm.conf
# status
pm.status_path = /php_status
# ping
ping.path = /php_ping
vi nginx/conf/fastcgi_params
# 添加
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
server
{
listen 80;
server_name localhost;
location ~ ^/(php_status|php_ping)$
{
access_log off;
allow 127.0.0.1;
deny all;
include fastcgi_params;
fastcgi_pass 127.0.0.1:10080;
}
}
这样就可以了,测试
curl http://localhost/php_status
curl http://localhost/php_ping
适合单次分析
如果你想统计下以下数据,命令行工具GoAccess是非常适合的
GoAccess用的是apache的格式定义,内置了4种格式,如果你用的是Nginx默认的日志格式,那么这里可以选”NCSA Combined Log Format”,也可以自定义,默认定义文件在:
~/.goaccessrc
你也可以在其他地方定义,然后通过-p指定日志格式定义文件
假设有一条日志格式是:
0.025 - 192.168.15.41 - - [08/Jan/2014:18:14:35 +0800] "GET /Game.php?agentName=kk&serverID=3 HTTP/1.1" 200 5803 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" -
分别代表处理时间、这个-是人为定义上去的、请求来源IP、这个-字段,是获取远程用户,这里没有,所以是-、这里的-是NCSA标准格式里的、请求时间、请求的URL、http响应码、发送的数据大小、引用来源,这里是空,所以是-、客户端版本等信息、最后一个列是让代理请求客户端IP的,这里是空,所以也是-
那么日志定义文件应该是这样:
color_scheme 0
date_format %d/%b/%Y
log_format %T - %h %^[%d:%^] "%r" %s %b "%R" "%u"
log_file /data/logs/web._php_only.log-20131212
可以把分析结果输出到终端,也可以输出为html,json等格式
命令:
goaccess -f /data/logs/web._php_only.log-20131212 > ur.html
这里有一个需要注意,由于一些接口的特点,每次请求的URL里有个加密串,造成每次请求的URL都是唯一的,goaccess无法统计它,这时可以加-q参数,忽略掉URL问号后面的参数。
命令
goaccess -q -f /data/logs/web._php_only.log-20131212
Nginx根目录是/opt/www
假如
/opt/www/a/x
/opt/www/a/d/x
/opt/www/b/x
如果配置可以禁止访问所有的x目录?
找到了
location ~ ^(.*)\/\x\/{ deny all;}