问题背景:有多个虚拟机的时候,发现在httpd.conf里注释了该文件:D:\wamp\bin\apache\apache2.2.22\conf\extra\httpd-vhosts.conf ,出现一堆的[warn] _default_ VirtualHost overlap on port 80, the first has precedence ,于是,对于apache启动时的警告,把http.conf里的:去掉#NameVirtualHost *:80前面的#号,然后重启apache即可。把那个包含的没有用的文件干掉即可。(其实际就是:httpd-vhosts.conf 里因为有这样一行 NameVirtualHost *:80,而httpd.conf里没有或给注释了导致的,而后面的虚拟机默认沿用这个....。)
在apache2的httpd.conf里新增加了1个VirtualHost,域名是www.ligh.com,此时,服务器总共2个VirtualHost ,apachectl restart的时候却出现了下面的警告提示:
[warn] _default_ VirtualHost overlap on port 80, the first has precedence
大概意思就是说后面新增加的这个VirtualHost 由于端口被占用,不能生效,沿用第一个虚拟主机的配置。
检查了一下,发现原来在httpd.conf里,我没有把#NameVirtualHost *:80前的注释去掉,导致这个没有生效。
解决方案:
去掉#NameVirtualHost *:80前面的#号,然后重启apache即可。
来自:http://blog.163.com/lgh_2002/blog/static/44017526201141711451919/
在apache2的httpd.conf里新增加了1个VirtualHost,域名是www.ligh.com,此时,服务器总共2个VirtualHost ,apachectl restart的时候却出现了下面的警告提示:
[warn] _default_ VirtualHost overlap on port 80, the first has precedence
大概意思就是说后面新增加的这个VirtualHost 由于端口被占用,不能生效,沿用第一个虚拟主机的配置。
检查了一下,发现原来在httpd.conf里,我没有把#NameVirtualHost *:80前的注释去掉,导致这个没有生效。
解决方案:
去掉#NameVirtualHost *:80前面的#号,然后重启apache即可。
来自:http://blog.163.com/lgh_2002/blog/static/44017526201141711451919/
背景:用树莓派修改进程数后,想重启后出现问题及解决。
apache2: bad user name ${APACHE_RUN_USER} 解决
开工后,发现有个虚拟机的apache没起来,调用apache2 -k start 后,提示如下内容:
apache2: bad user name ${APACHE_RUN_USER}
apache 启动时,是由读取 /etc/apache2/apache2.conf 读取了运行 User
而运行的user环境变量定义在/etc/apache2/envvars
而不是使用默认的登录账户启动,因此apache提供了
apache2ctl 工具来使用,调用
apache2ctl -k start
即可
______________________________________________________________________________________
pkill -9 apache
/usr/sbin/apache2 -k start
apache2: bad user name ${APACHE_RUN_USER}
/usr/sbin/apachectl -k start
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
启动成功!
vi +178 /etc/apache2/apache2.conf
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
root@raspberrypi:/var/lock# /usr/sbin/apache2ctl -k start
Syntax error on line 178 of /etc/apache2/apache2.conf:
Error:\tApache has not been designed to serve pages while\n\trunning as root. There are known race conditions that\n\twill allow any local user to read any file on the system.\n\tIf you still desire to serve pages as root then\n\tadd -DBIG_SECURITY_HOLE to the CFLAGS env variable\n\tand then rebuild the server.\n\tIt is strongly suggested that you instead modify the User\n\tdirective in your httpd.conf file to list a non-root\n\tuser.\n
Action '-k start' failed.
ls -lart /var/lock/apache2
total 0
drwxr-xr-x 2 root root 40 Aug 18 07:26 .
drwxrwxrwt 3 root root 60 Aug 18 07:26 ..
useradd -m www //它将创建用户的主目录即使不存在,不创建用户主目录
vi /etc/apache2/envvars
export APACHE_RUN_USER=www
export APACHE_RUN_GROUP=www
成功了:
root@raspberrypi:/var/lock# /usr/sbin/apache2ctl -k start
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
root@raspberrypi:/var/lock# ls -lart
drwxr-xr-x 2 www root 40 Aug 18 07:33 apache2
阅读全文
apache2: bad user name ${APACHE_RUN_USER} 解决
开工后,发现有个虚拟机的apache没起来,调用apache2 -k start 后,提示如下内容:
apache2: bad user name ${APACHE_RUN_USER}
apache 启动时,是由读取 /etc/apache2/apache2.conf 读取了运行 User
而运行的user环境变量定义在/etc/apache2/envvars
而不是使用默认的登录账户启动,因此apache提供了
apache2ctl 工具来使用,调用
apache2ctl -k start
即可
______________________________________________________________________________________
pkill -9 apache
/usr/sbin/apache2 -k start
apache2: bad user name ${APACHE_RUN_USER}
/usr/sbin/apachectl -k start
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
启动成功!
vi +178 /etc/apache2/apache2.conf
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
root@raspberrypi:/var/lock# /usr/sbin/apache2ctl -k start
Syntax error on line 178 of /etc/apache2/apache2.conf:
Error:\tApache has not been designed to serve pages while\n\trunning as root. There are known race conditions that\n\twill allow any local user to read any file on the system.\n\tIf you still desire to serve pages as root then\n\tadd -DBIG_SECURITY_HOLE to the CFLAGS env variable\n\tand then rebuild the server.\n\tIt is strongly suggested that you instead modify the User\n\tdirective in your httpd.conf file to list a non-root\n\tuser.\n
Action '-k start' failed.
ls -lart /var/lock/apache2
total 0
drwxr-xr-x 2 root root 40 Aug 18 07:26 .
drwxrwxrwt 3 root root 60 Aug 18 07:26 ..
useradd -m www //它将创建用户的主目录即使不存在,不创建用户主目录
vi /etc/apache2/envvars
export APACHE_RUN_USER=www
export APACHE_RUN_GROUP=www
成功了:
root@raspberrypi:/var/lock# /usr/sbin/apache2ctl -k start
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
root@raspberrypi:/var/lock# ls -lart
drwxr-xr-x 2 www root 40 Aug 18 07:33 apache2
阅读全文
一)进程ID:
pid_t 是那一种数据类型:
是Linux下的进程号类型,也就是Process ID _ Type 的缩写。 其实是宏定义的unsigned int类型,
warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘pthread_t’:
使用%lu打印pthread_t不会出现警告。
二)线程ID:
编译时如果使用%x打印pthread_t会出现警告信息:
thread-pool.c:77: warning: format ‘%x’ expects type ‘unsigned int’, but argument 3 has type ‘pthread_t’
如果使用%lu打印pthread_t不会出现警告。
如:
问题一,对宏定义的返回数据类型作出一个定义,如下面是对进程数作定义:
问题二:对pid_t进程号用printf打印出现警告:
pid_t p;
pthread_t t;
printf("\nthread id is %lu,procees id is %lu,waiting for into while...\n",t,p);
format ‘%lu’ expects type ‘long unsigned int’, but argument 3 has type ‘pid_t’
这PID pthread_t打印用啥格式?
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
: warning: format ‘%ld’ expects type ‘long int’, but argument 3 has type ‘pid_t’
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
如果打印pid_t这种类型,你知道它是整数,但是不知道具体类型,而且在不同平台也可能不同
一般做法是强转下:"%lld", (long long)xxx
或者"%llu", (unsigned long long)xxx
因为C的整数最大就是long long
实践Ok代码如下:
pid_t 是那一种数据类型:
是Linux下的进程号类型,也就是Process ID _ Type 的缩写。 其实是宏定义的unsigned int类型,
warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘pthread_t’:
使用%lu打印pthread_t不会出现警告。
二)线程ID:
编译时如果使用%x打印pthread_t会出现警告信息:
thread-pool.c:77: warning: format ‘%x’ expects type ‘unsigned int’, but argument 3 has type ‘pthread_t’
如果使用%lu打印pthread_t不会出现警告。
如:
问题一,对宏定义的返回数据类型作出一个定义,如下面是对进程数作定义:
问题二:对pid_t进程号用printf打印出现警告:
pid_t p;
pthread_t t;
printf("\nthread id is %lu,procees id is %lu,waiting for into while...\n",t,p);
format ‘%lu’ expects type ‘long unsigned int’, but argument 3 has type ‘pid_t’
这PID pthread_t打印用啥格式?
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
: warning: format ‘%ld’ expects type ‘long int’, but argument 3 has type ‘pid_t’
: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘pthread_t’
如果打印pid_t这种类型,你知道它是整数,但是不知道具体类型,而且在不同平台也可能不同
一般做法是强转下:"%lld", (long long)xxx
或者"%llu", (unsigned long long)xxx
因为C的整数最大就是long long
实践Ok代码如下:
背景:如果nginx代理这个80到swoole(用swoole做webserver,其实就是做个转发和html解析。),这个代理是个什么概念,那这个socket的fd是不是就没法长连接了呢??被反向80端口代理的swoole还能长连接?用:nginx_tcp_proxy_module才行 ,否则肯定不行啊,即使http的keep-alive,https://github.com/yaoweibin/nginx_tcp_proxy_module 也就是说nginx的http代理长连接不行,得走tcp这一层才行,用haproxy。
使用Nginx实现TCP反向代理:https://www.hi-linux.com/posts/65232.html
Nginx 配置TCP代理:https://www.cnyunwei.cc/archives/1315
nginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司的的负载均衡都是nginx所以决定研究一下nginx的这个功能实现,下面简单介绍一下实现方法:
阅读全文
使用Nginx实现TCP反向代理:https://www.hi-linux.com/posts/65232.html
Nginx 配置TCP代理:https://www.cnyunwei.cc/archives/1315
nginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司的的负载均衡都是nginx所以决定研究一下nginx的这个功能实现,下面简单介绍一下实现方法:
阅读全文
背景:502 Bad Gateway nginx问题,再次排查~~~keepalive_timeout 1800; 是不是太大了,浏览器访问没有关闭会一直连接状态,这块是否有必要不keepalive呢?http1.1中默认的keep-alive为connection(使用持久化连接),在http1.0中则默认为close,在大并发量的情况下可能需要将客户端的连接close掉,以保障服务器的正常运转。(因为每一台服务器它所能建立的最大连接数是有上限的,lnux下ulimit n xxx),nginx不像apache,直接有指令keep-alive off/on;它使用的是keepalive_timeout [time],默认的时长为75,可以在http、server、location使用此指令。keepalive_timeout 0; 来自:http://www.cnblogs.com/meteoric_cry/archive/2011/06/07/2074150.html
问题:established 很多的问题,发现我的web机器上面的ESTABLISHED链接数暴多,机器环境是nginx+mysql+fastcgi的
我打开一个页面发现有10来个ESTABLISHED状态链接,页面加载完了状态还在,大慨要过1分钟才
完成这个状态,我把打开的页面关闭掉后ESTABLISHED的链接还要过20秒才释放,
nginx的 keepalive_timeout 30
内核的一些参数都改的比较小
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 800
实践得出如下参数:
新的发现,及解释:
一)但uptime变大了,以前3,现在变8:
uptime
16:02:20 up 46 days, 21 min, 1 user, load average: 11.99, 8.60, 6.66
二)timewait变大:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 428
FIN_WAIT1 6
ESTABLISHED 16
FIN_WAIT2 8
SYN_RECV 2
因没有复用socket里的ulimit句柄,导致系统负载变大,再就是出现了性能上的降低表现在TIME_WAIT数量变多~
linux下默认是不产生core文件的,要用ulimit -c unlimited放开,这儿的socket句柄不释放也是通过: ulimint -a 里的 open files (-n) 65535 实现的,
所以使用下面的命令: ulimit -n 65535 并不能有效的解决这个问题。直接这么修改open files 不能得到保持。下面给出的方法最简单和最直接: 修改/etc/security/limits.conf 添加如下一行: * - nofile 65535 修改/etc/pam.d/login添加如下一行 session required /lib/security/pam_limits.so 最重要的,修改完这些后,要重新登录下才行,不然该session的句柄数不会生效。
ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
摘自:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html
自己博客参看,Linux查看文件句柄占用多的进程 ,查看Linux某进程的句柄数,并通过ulimit -n 单个进程打开的最大文件句柄数量限制解决accept4() failed (24: Too many open files):http://jackxiang.com/post/6570/
————————————————————————————————————————————————————————————————————————————
请问下各位让ESTABLISHED 能快速完成释放还有哪些地方要注意的,不然的话造成大量的ESTABLISHED链接
HTTP/1.1 是允许 keepalive 的,这样可以降低服务器的负载
你要是仅仅想减少 ESTABLISHED,大可以在 nginx 上禁止 keepalive
这样虽然可以实现你的需求,但却与你所希望的结果大相径庭
对 我需要的是减低机器的负载,keepalive肯定也是要开的,可能是内核某些参数设置过大了,导致ESTABLISHED状态保持时间太长,
动不动就是好几百上千的ESTABLISHED 机器负责有点高
不是多不多的问题,是我把页面关了这个状态要过30秒才回收,这时间太久了,正常的话应该是页面刷新完了这个状态就完成了
或者说页面关闭了这个状态就完成了,而不是要过很成时间才完成这个状态
是通过 netstat 看的吗?
如果是,顺便也看一下 Recv-Q 和 Send-Q 那两列,看是 0 还是什么
显示Recv-Q 和 Send-Q 那两列,都是0
netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 jackxiang.com:8012 *:* LISTEN
tcp 0 0 jackxiang.com:9004 *:* LISTEN
tcp 0 0 jackxiang.com:9005 *:* LISTEN
tcp 0 0 jackxiang.com:8013 *:* LISTEN
tcp 0 0 *:5901 *:* LISTEN
tcp 0 0 jackxiang.com:8015 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 jackxiang.com:x11 *:* LISTEN
tcp 0 0 jackxiang.com:cddbp-alt *:* LISTEN
tcp 0 0 jackxiang.com:8017 *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 jackxiang.com:socks *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:34139 *:* LISTEN
tcp 0 0 jackxiang.com:irdmi *:* LISTEN
tcp 0 0 jackxiang.com:mcreport *:* LISTEN
tcp 0 0 jackxiang.com:8006 *:* LISTEN
tcp 0 0 jackxiang.com:cslistener *:* LISTEN
tcp 0 0 jackxiang.com:8009 *:* LISTEN
tcp 0 0 jackxiang.com:etlservicemgr *:* LISTEN
tcp 0 0 jackxiang.com:8010 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:60763 *:* LISTEN
我做了一个实验,如果是 keepalive 的情况,默认浏览器不关闭,连接就不断开
即使你不再有任何页面的访问操作,连接也一直保持,直到浏览器关闭为止
因此,初步判断,你的 ESTABLISHED 过多的原因是大多数人不关闭浏览器造成的,你自己也可以试验一下
如果想缩短这个,可以修改 webserver 的配置
因为现在的浏览器都是支持keepalive并遵守服务器配置,我试验了也是这样的
要把整个浏览器关了才会没有ESTABLISHED ,楼上的请问下在nginx上怎么主动断开,可以试验下看性能和速度方面会不会有影响
以上讨论来自:
http://bbs.chinaunix.net/thread-1945952-2-1.html
————————————————————————————————————————————————————————————————
导致服务器load过高
send_timeout
syntax: send_timeout the time
default: send_timeout 60
context: http, server, location
Directive assigns response timeout to client. Timeout is established not on entire transfer of answer, but only between two operations of reading, if after this time client will take nothing, then nginx is shutting down the connection.
应该是tcp连接没有释放造成的,我最近也碰到这个问题
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
具体如下:
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
Tcp图解:
获取Windows下的Established的bat自动脚本备案,指定进程的网络连接状态为established的连接数:
文库:http://wenku.baidu.com/link?url=NJKFU95Elz0RjW6MV99qhoVdcSz7OLxvOoPhdnoOMGb_mKMUVysGxc8GhqSXG7pwuyY5fuNQEW2iyQGzT1DzraPI6kv3l4RzVvszkn3SUl3
问题:established 很多的问题,发现我的web机器上面的ESTABLISHED链接数暴多,机器环境是nginx+mysql+fastcgi的
我打开一个页面发现有10来个ESTABLISHED状态链接,页面加载完了状态还在,大慨要过1分钟才
完成这个状态,我把打开的页面关闭掉后ESTABLISHED的链接还要过20秒才释放,
nginx的 keepalive_timeout 30
内核的一些参数都改的比较小
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 800
实践得出如下参数:
新的发现,及解释:
一)但uptime变大了,以前3,现在变8:
uptime
16:02:20 up 46 days, 21 min, 1 user, load average: 11.99, 8.60, 6.66
二)timewait变大:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 428
FIN_WAIT1 6
ESTABLISHED 16
FIN_WAIT2 8
SYN_RECV 2
因没有复用socket里的ulimit句柄,导致系统负载变大,再就是出现了性能上的降低表现在TIME_WAIT数量变多~
linux下默认是不产生core文件的,要用ulimit -c unlimited放开,这儿的socket句柄不释放也是通过: ulimint -a 里的 open files (-n) 65535 实现的,
所以使用下面的命令: ulimit -n 65535 并不能有效的解决这个问题。直接这么修改open files 不能得到保持。下面给出的方法最简单和最直接: 修改/etc/security/limits.conf 添加如下一行: * - nofile 65535 修改/etc/pam.d/login添加如下一行 session required /lib/security/pam_limits.so 最重要的,修改完这些后,要重新登录下才行,不然该session的句柄数不会生效。
ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
摘自:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html
自己博客参看,Linux查看文件句柄占用多的进程 ,查看Linux某进程的句柄数,并通过ulimit -n 单个进程打开的最大文件句柄数量限制解决accept4() failed (24: Too many open files):http://jackxiang.com/post/6570/
————————————————————————————————————————————————————————————————————————————
请问下各位让ESTABLISHED 能快速完成释放还有哪些地方要注意的,不然的话造成大量的ESTABLISHED链接
HTTP/1.1 是允许 keepalive 的,这样可以降低服务器的负载
你要是仅仅想减少 ESTABLISHED,大可以在 nginx 上禁止 keepalive
这样虽然可以实现你的需求,但却与你所希望的结果大相径庭
对 我需要的是减低机器的负载,keepalive肯定也是要开的,可能是内核某些参数设置过大了,导致ESTABLISHED状态保持时间太长,
动不动就是好几百上千的ESTABLISHED 机器负责有点高
不是多不多的问题,是我把页面关了这个状态要过30秒才回收,这时间太久了,正常的话应该是页面刷新完了这个状态就完成了
或者说页面关闭了这个状态就完成了,而不是要过很成时间才完成这个状态
是通过 netstat 看的吗?
如果是,顺便也看一下 Recv-Q 和 Send-Q 那两列,看是 0 还是什么
显示Recv-Q 和 Send-Q 那两列,都是0
netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 jackxiang.com:8012 *:* LISTEN
tcp 0 0 jackxiang.com:9004 *:* LISTEN
tcp 0 0 jackxiang.com:9005 *:* LISTEN
tcp 0 0 jackxiang.com:8013 *:* LISTEN
tcp 0 0 *:5901 *:* LISTEN
tcp 0 0 jackxiang.com:8015 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 jackxiang.com:x11 *:* LISTEN
tcp 0 0 jackxiang.com:cddbp-alt *:* LISTEN
tcp 0 0 jackxiang.com:8017 *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 jackxiang.com:socks *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:34139 *:* LISTEN
tcp 0 0 jackxiang.com:irdmi *:* LISTEN
tcp 0 0 jackxiang.com:mcreport *:* LISTEN
tcp 0 0 jackxiang.com:8006 *:* LISTEN
tcp 0 0 jackxiang.com:cslistener *:* LISTEN
tcp 0 0 jackxiang.com:8009 *:* LISTEN
tcp 0 0 jackxiang.com:etlservicemgr *:* LISTEN
tcp 0 0 jackxiang.com:8010 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:60763 *:* LISTEN
我做了一个实验,如果是 keepalive 的情况,默认浏览器不关闭,连接就不断开
即使你不再有任何页面的访问操作,连接也一直保持,直到浏览器关闭为止
因此,初步判断,你的 ESTABLISHED 过多的原因是大多数人不关闭浏览器造成的,你自己也可以试验一下
如果想缩短这个,可以修改 webserver 的配置
因为现在的浏览器都是支持keepalive并遵守服务器配置,我试验了也是这样的
要把整个浏览器关了才会没有ESTABLISHED ,楼上的请问下在nginx上怎么主动断开,可以试验下看性能和速度方面会不会有影响
以上讨论来自:
http://bbs.chinaunix.net/thread-1945952-2-1.html
————————————————————————————————————————————————————————————————
导致服务器load过高
send_timeout
syntax: send_timeout the time
default: send_timeout 60
context: http, server, location
Directive assigns response timeout to client. Timeout is established not on entire transfer of answer, but only between two operations of reading, if after this time client will take nothing, then nginx is shutting down the connection.
应该是tcp连接没有释放造成的,我最近也碰到这个问题
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
具体如下:
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
Tcp图解:
获取Windows下的Established的bat自动脚本备案,指定进程的网络连接状态为established的连接数:
文库:http://wenku.baidu.com/link?url=NJKFU95Elz0RjW6MV99qhoVdcSz7OLxvOoPhdnoOMGb_mKMUVysGxc8GhqSXG7pwuyY5fuNQEW2iyQGzT1DzraPI6kv3l4RzVvszkn3SUl3
背景:nginx.conf里指定了nginx的error_log:error_log /data/logs/nginx/nginx_error.log; 该文件不在nginx的logs下面,于是我把这个logs文件夹都给删除了: rm -Rf /usr/local/nginx/logs,发现在启动时会会报一个alert错,nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)的研究探讨。
阅读全文
阅读全文
下面来罗列一下判断远端已经断开的方法:
法一:
当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
法二:
struct tcp_info info;
int len=sizeof(info);
getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
if((info.tcpi_state==TCP_ESTABLISHED)) 则说明未断开 else 断开
法三:
若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。
法四:
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误
法五:
自己实现一个心跳检测,一定时间内未收到自定义的心跳包则标记为已断开。
摘自:http://blog.csdn.net/god2469/article/details/8801356
使用 epoll或poll ,如何确定 与客户端的链接断开 ?
http://bbs.csdn.net/topics/240073448
epoll事件检测:
http://www.360doc.com/content/09/0812/09/1894_4858884.shtml
epoll的各个事件触发条件测试:
http://www.cppblog.com/yangsf5/archive/2009/03/12/76353.html
利用epoll和多进程解决高并发问题 :
http://blog.csdn.net/ypbsyy/article/details/38046267
法一:
当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
法二:
struct tcp_info info;
int len=sizeof(info);
getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
if((info.tcpi_state==TCP_ESTABLISHED)) 则说明未断开 else 断开
法三:
若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。
法四:
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误
法五:
自己实现一个心跳检测,一定时间内未收到自定义的心跳包则标记为已断开。
摘自:http://blog.csdn.net/god2469/article/details/8801356
使用 epoll或poll ,如何确定 与客户端的链接断开 ?
http://bbs.csdn.net/topics/240073448
epoll事件检测:
http://www.360doc.com/content/09/0812/09/1894_4858884.shtml
epoll的各个事件触发条件测试:
http://www.cppblog.com/yangsf5/archive/2009/03/12/76353.html
利用epoll和多进程解决高并发问题 :
http://blog.csdn.net/ypbsyy/article/details/38046267
背景:如有时访问页面时因某原因,如审核没有通过,跳转到首页了,怎么办呢?初步想法是给跳转到首页后面加一个get参数说明原因也好排查问题,还中文的,其实从产品上讲应该加一个过渡页面,提示用户最好,咱就叫真一把。
点击之后在浏览器显示为:url/delete.php?id=%B9%FA%BC%CA%D0%C2%CE%C5
如何在浏览器原封不动的显示:url/delete.php?id=国际新闻
像IE就会被编码了,像Firefox就是中文显示的,呵呵,如下:
---------- 调试PHP ----------
url/delete.php?id=国际新闻
输出完成 (耗时 1 秒) - 正常终止
原因如下:
各个浏览器处理中文不一样,有的自动转换,有的不明显。你不要去改它,这样会获取它的时候造成数据不对
浏览器特性会把URL参数编码,就算可以显示中文参数传输,建议还是URL编码一下为好,以免造在不必要兼容性问题。如果URL参数传输,希望参数中不要有中文,就比如你要删除一条数据,用ID为好,谢谢!
参考:http://zhidao.baidu.com/link?url=kU3DTtVdQAspWfD9OMK891EotjPiGAkBQZV9rOxCDX9DTAGn_hkNIiA1-cX5usXwWkN_-7U7M-GrYcU1VxZVfK
点击之后在浏览器显示为:url/delete.php?id=%B9%FA%BC%CA%D0%C2%CE%C5
如何在浏览器原封不动的显示:url/delete.php?id=国际新闻
像IE就会被编码了,像Firefox就是中文显示的,呵呵,如下:
---------- 调试PHP ----------
url/delete.php?id=国际新闻
输出完成 (耗时 1 秒) - 正常终止
原因如下:
各个浏览器处理中文不一样,有的自动转换,有的不明显。你不要去改它,这样会获取它的时候造成数据不对
浏览器特性会把URL参数编码,就算可以显示中文参数传输,建议还是URL编码一下为好,以免造在不必要兼容性问题。如果URL参数传输,希望参数中不要有中文,就比如你要删除一条数据,用ID为好,谢谢!
参考:http://zhidao.baidu.com/link?url=kU3DTtVdQAspWfD9OMK891EotjPiGAkBQZV9rOxCDX9DTAGn_hkNIiA1-cX5usXwWkN_-7U7M-GrYcU1VxZVfK
nginx中deny和allow详解
deny和allow都是在access阶段
allow和deny都可以在http,server,location,limit_except中使用
如果被deny则会返回“403 Forbidden”报错信息
以下几个场景能够说明清楚这2个命令的具体是怎么用的
来自:https://blog.csdn.net/sinat_24354307/article/details/126448475
背景:单位只有一个80端口能过到测试机,如果想在测试机上再开一个非nginx的自己写的server,怎么能通过测试机做server并能通过80端口转发到这个自己写的server上呢?那就得用nginx的端口转发功能了。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
可加在server段里,也可加在 location段里,放大内网10.65.*.*/16位掩码(10.6.0.0---10.6.255.254),同理10.4.0.0/16:
proxy相关参数:
被代理加上代理IP才能访问,allow:
找到conf/nginx.conf文件,编辑:
server下的结点:
listen:监听80端口
server_name:转发到哪个地址
proxy_pass:代理到哪个地址
nginx常用命令(要进入到nginx的目录):
开启:start nginx
重启:nginx -s reload
From :http://www.cnblogs.com/wuyou/p/3455381.html
deny和allow都是在access阶段
allow和deny都可以在http,server,location,limit_except中使用
如果被deny则会返回“403 Forbidden”报错信息
以下几个场景能够说明清楚这2个命令的具体是怎么用的
来自:https://blog.csdn.net/sinat_24354307/article/details/126448475
背景:单位只有一个80端口能过到测试机,如果想在测试机上再开一个非nginx的自己写的server,怎么能通过测试机做server并能通过80端口转发到这个自己写的server上呢?那就得用nginx的端口转发功能了。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
可加在server段里,也可加在 location段里,放大内网10.65.*.*/16位掩码(10.6.0.0---10.6.255.254),同理10.4.0.0/16:
proxy相关参数:
被代理加上代理IP才能访问,allow:
找到conf/nginx.conf文件,编辑:
server下的结点:
listen:监听80端口
server_name:转发到哪个地址
proxy_pass:代理到哪个地址
nginx常用命令(要进入到nginx的目录):
开启:start nginx
重启:nginx -s reload
From :http://www.cnblogs.com/wuyou/p/3455381.html
背景:有时程序偶出现参数少了或没有提交到下一个链接Url里后出现问题,如何查呢,最好的办法是在nginx上的加post参数,以定位到问题才有可能对某个UIR的代码出现的问题进行排查。
og_format access '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" "$http_user_agent" $http_x_forwarded_for';
access_log logs/test.access.log access;
注意放的位置在http里:nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/nginx/conf/vhost/xxx.conf:59
nginx.conf
http里定义:wwwlog
log_format wwwlog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for "$request_time"';
在include每个域名里后面加上wwwlog:
access_log /data/logs/access_mytv.log wwwlog;
于是在同样的access后这样写:
日志如下:
202.108.16.77 - - [14/Jan/2015:10:45:45 +0800] "POST /partin/releaseinfo HTTP/1.1" 302 5 id=47&choice_type=new&eid=338&videoid=5d6dabda-9b97-11e4-9584-21fa84a4ab6e&file_ext=mp4&lang=zh&upload_server=202.108.17.15&title=7%E5%B2%81%E5%B0%8F%E5%AD%A9%E9%85%92%E7%93%B6%E4%B8%8A%E5%81%9A%E4%BF%AF%E5%8D%A7%E6%92%91%E8%B9%BF%E7%BA%A2%E7%BD%91%E7%BB%9C&desc=7%E5%B2%81%E5%B0%8F%E5%AD%A9%E9%85%92%E7%93%B6%E4%B8%8A%E5%81%9A%E4%BF%AF%E5%8D%A7%E6%92%91%E8%B9%BF%E7%BA%A2%E7%BD%91%E7%BB%9C&tags=%E6%B5%8B%E8%AF%95%E4%B8%80%E4%B8%8B%E3%80%82&checkflag=on "http://jackxiang.com/partin/showupload/activityid/47" "Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0" -
POST URI及参数:POST /partin/releaseinfo HTTP/1.1" 302 5 .....
来自的refer Uri:http://jackxiang.com/partin/showupload/activityid/47
这个access_log的log_format应该可以定义多个不同的名供不同日志的需求。
再就是,
get请求的参数就是存放在http header中的,所以修改header的大小限制 当然可以解决请求串过长的问题啦。
阅读全文
og_format access '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" "$http_user_agent" $http_x_forwarded_for';
access_log logs/test.access.log access;
注意放的位置在http里:nginx: [warn] the "log_format" directive may be used only on "http" level in /usr/local/nginx/conf/vhost/xxx.conf:59
nginx.conf
http里定义:wwwlog
log_format wwwlog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for "$request_time"';
在include每个域名里后面加上wwwlog:
access_log /data/logs/access_mytv.log wwwlog;
于是在同样的access后这样写:
日志如下:
202.108.16.77 - - [14/Jan/2015:10:45:45 +0800] "POST /partin/releaseinfo HTTP/1.1" 302 5 id=47&choice_type=new&eid=338&videoid=5d6dabda-9b97-11e4-9584-21fa84a4ab6e&file_ext=mp4&lang=zh&upload_server=202.108.17.15&title=7%E5%B2%81%E5%B0%8F%E5%AD%A9%E9%85%92%E7%93%B6%E4%B8%8A%E5%81%9A%E4%BF%AF%E5%8D%A7%E6%92%91%E8%B9%BF%E7%BA%A2%E7%BD%91%E7%BB%9C&desc=7%E5%B2%81%E5%B0%8F%E5%AD%A9%E9%85%92%E7%93%B6%E4%B8%8A%E5%81%9A%E4%BF%AF%E5%8D%A7%E6%92%91%E8%B9%BF%E7%BA%A2%E7%BD%91%E7%BB%9C&tags=%E6%B5%8B%E8%AF%95%E4%B8%80%E4%B8%8B%E3%80%82&checkflag=on "http://jackxiang.com/partin/showupload/activityid/47" "Mozilla/5.0 (Windows NT 6.1; rv:34.0) Gecko/20100101 Firefox/34.0" -
POST URI及参数:POST /partin/releaseinfo HTTP/1.1" 302 5 .....
来自的refer Uri:http://jackxiang.com/partin/showupload/activityid/47
这个access_log的log_format应该可以定义多个不同的名供不同日志的需求。
再就是,
get请求的参数就是存放在http header中的,所以修改header的大小限制 当然可以解决请求串过长的问题啦。
阅读全文
背景:
国内新网的云v5的vps在ping出现请求超时,对方技术说是网络流量超了,装了很多看网路是否真的超了5M,查看:
http://jackxiang.com/post/7671/ 于是否装一个看看并发数的,看流量到底在哪儿出现超了5M/s的,于是安一个status很有必要。
修改nginx配置文件,添加监控状态配置,在nginx.conf的server块中添加如下代码:
这段代码是加在默认的server里的,
假设默认server的配置为
listen 127.0.0.1:80;
server_name 127.0.0.1;
那么访问nginx的状态,就可以通过 curl 127.0.0.1/nginx_status访问了
阅读全文
国内新网的云v5的vps在ping出现请求超时,对方技术说是网络流量超了,装了很多看网路是否真的超了5M,查看:
http://jackxiang.com/post/7671/ 于是否装一个看看并发数的,看流量到底在哪儿出现超了5M/s的,于是安一个status很有必要。
修改nginx配置文件,添加监控状态配置,在nginx.conf的server块中添加如下代码:
这段代码是加在默认的server里的,
假设默认server的配置为
listen 127.0.0.1:80;
server_name 127.0.0.1;
那么访问nginx的状态,就可以通过 curl 127.0.0.1/nginx_status访问了
阅读全文
背景:
一)在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网
,这才是关键。
二)很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问。
阅读全文
一)在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网
,这才是关键。
二)很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问。
阅读全文
背景:curl "http://jackxiang.com/post/7634/" curl: (52) Empty reply from server,我估计是Nginx的缓存cgi动态为静态的模块可能出了点问题。
今天调试nginx 模块,使用 curl 发http 请求,结果得到这么个错“Empty reply from server”,死活不得其解。
后来,使用gdb调试另外一个东西,还没到断点处就停了,执行下一步,就挂掉了。这时看curl的返回,正是“Empty reply from server”。
ps 发现原来nginx子进程已经没了,换成了新的(如果有子进程挂掉,nginx会启动一个新的)。
就这两个模块:
http://www.grid.net.ru/nginx/upload.en.html
http://labs.frickle.com/nginx_ngx_cache_purge/
顺带升级了一下nginx为1.7.7好像就有上面这个问题,加一个nginx_upload_module模块(编译不过去,后来去了。),重新编译一次nginx,问题依旧:
最终问题从nginx的error里查到:
2014/11/22 14:38:14 [crit] 8855#0: *260 writev() "/usr/local/nginx/fastcgi_temp/9/08/0000000089" failed (28: No space left on device) while reading upstream, client: 27.150.222.72, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "www.jackxiang.com", referrer: "http://www.jackxiang.com/"
是nginx中fastcgi的一个缓存文件,磁盘满了,我靠,查了好一会喔。
___________________________________________________________
Nginx-1.3.X,Nginx-1.4.X安装nginx_upload_module-2.2.0.tar.gz会有点问题,报
/opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function ‘ngx_http_read_upload_client_request_body’: /opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’ 没有名为 ‘to_write’ 的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2687: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_do_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2769: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2785: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2877: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
选择Nginx-1.2.X的就没问题。
来自:http://gcoder.blogbus.com/logs/44505794.html
今天调试nginx 模块,使用 curl 发http 请求,结果得到这么个错“Empty reply from server”,死活不得其解。
后来,使用gdb调试另外一个东西,还没到断点处就停了,执行下一步,就挂掉了。这时看curl的返回,正是“Empty reply from server”。
ps 发现原来nginx子进程已经没了,换成了新的(如果有子进程挂掉,nginx会启动一个新的)。
就这两个模块:
http://www.grid.net.ru/nginx/upload.en.html
http://labs.frickle.com/nginx_ngx_cache_purge/
顺带升级了一下nginx为1.7.7好像就有上面这个问题,加一个nginx_upload_module模块(编译不过去,后来去了。),重新编译一次nginx,问题依旧:
最终问题从nginx的error里查到:
2014/11/22 14:38:14 [crit] 8855#0: *260 writev() "/usr/local/nginx/fastcgi_temp/9/08/0000000089" failed (28: No space left on device) while reading upstream, client: 27.150.222.72, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "www.jackxiang.com", referrer: "http://www.jackxiang.com/"
是nginx中fastcgi的一个缓存文件,磁盘满了,我靠,查了好一会喔。
___________________________________________________________
Nginx-1.3.X,Nginx-1.4.X安装nginx_upload_module-2.2.0.tar.gz会有点问题,报
/opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c: In function ‘ngx_http_read_upload_client_request_body’: /opt/nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’ 没有名为 ‘to_write’ 的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2628: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2687: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c: 在函数‘ngx_http_do_read_upload_client_request_body’中:
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2769: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2785: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
../nginx_upload_module-2.2.0/ngx_http_upload_module.c:2877: 错误:‘ngx_http_request_body_t’没有名为‘to_write’的成员
选择Nginx-1.2.X的就没问题。
来自:http://gcoder.blogbus.com/logs/44505794.html
背景:
Nginx模块fastcgi_cache后会在启动时候出现cache manager process和cache loader process 进程,查了下得知这玩意是用来作header使用的,PHP输出后由经它后给替换了header,有点像NAT出去时经过外网的路由时给把IP头给替换一个道理,这样有它的好处,也就是cache控制由前端nginx而不是由php本身,起到分层的作用:
程序代码是Discuz!论坛, 随便开启测试了几下,发现/dev/shm/nginx_cache/下没有任何目录建立,也没有文件创建。调试的http header响应头里的X-Cache-CFC 结果一直是MISS。从服务器进程上来看,Nginx cache manager process 跟Nginx cache loader process 进程也正常运行:
1 root 3100 1 0 14:52 ? 00:00:00 nginx: master process /usr/sbin/nginx
2 www-data 3101 3100 0 14:52 ? 00:00:00 nginx: worker process
3 www-data 3102 3100 0 14:52 ? 00:00:00 nginx: cache manager process
4 www-data 3103 3100 0 14:52 ? 00:00:00 nginx: cache loader process
不知道为何会这样,为何没有cache成功,我以为我配置参数有问题,只好阅读WIKI。发现fastcgi_ignore_headers 参数下解释有这么一段
fastcgi_ignore_headers
Syntax: fastcgi_ignore_headers field …
Default:
Context: http
server
location
Reference: fastcgi_ignore_headers
This directive forbids processing of the named headers from the FastCGI-server reply. It is possible to specify headers like “X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”.
也就是说这个参数的值,将会被忽略掉,同样被忽略掉的响应头比如”X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”,而nginx配置中并没有fastcgi_ignore_headers参数的设定,那么问题会不会出现在FASTCGI响应结果里包含了类似”X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”这几个响应头呢?用strace抓包,看了下nginx与fpm进程通讯的数据
1 ####为了确保准确抓到处理该http请求的进程,我把nginx 、fpm都只开启了一个进程处理。
2 //strace -ff -tt -s 1000 -o xxx.log -p PHPFPM-PID
3 14:52:07.837334 write(3, "\1\6\0\1\0\343\5\0X-Powered-By: PHP/5.3.10-1ubuntu3.5\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\nPragma: no-cache\r\nContent-type: text/html\r\n\r\nHello cfc4n1362034327\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0", 256) = 256
4
5 //strace -ff -tt -s 1000 -o xxx.log -p Nginx-PID
6 15:05:13.265663 recvfrom(12, "\1\6\0\1\0\343\5\0X-Powered-By: PHP/5.3.10-1ubuntu3.5\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\nPragma: no-cache\r\nContent-type: text/html\r\n\r\nHello cfc4n1362035113\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0", 4023, 0, NULL, NULL) = 256
从抓取的数据包里可以看到,fpm确实返回了包含“Expires”、“Cache-Control”头的http 响应头信息。那么疑问来了:
nginx的fastcgi_cache没缓存这条http响应,是因为响应头里包含“Expires”、“Cache-Control”的原因吗?
程序里并没有输出“Expires”、“Cache-Control” http header的代码,这是谁输出的呢?
既然是fpm响应的时候,就已经有了,那么是php的core模块,还是其他拓展模块输出的?
“Expires:”时间为何是“Thu, 19 Nov 1981 08:52:00 GMT”?
疑问比较多,一个一个查起,先从Nginx的fastcgi_cache没缓存这条http响应查起。我根据测试环境nginx版本1.1.9(ubuntu 12.04默认的),到nginx官方下了对应版本的源码,搜索了fastcgi参数使用的地方,在http\ngx_http_upstream.c找到了。虽然不能很流程的读懂nginx的代码,但粗略的了解,根据了解的情况加以猜测,再动手测试实验,也得出了结论,确定了nginx的fastcgi_cache的规则。
来自:http://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/
Nginx模块fastcgi_cache后会在启动时候出现cache manager process和cache loader process 进程,查了下得知这玩意是用来作header使用的,PHP输出后由经它后给替换了header,有点像NAT出去时经过外网的路由时给把IP头给替换一个道理,这样有它的好处,也就是cache控制由前端nginx而不是由php本身,起到分层的作用:
程序代码是Discuz!论坛, 随便开启测试了几下,发现/dev/shm/nginx_cache/下没有任何目录建立,也没有文件创建。调试的http header响应头里的X-Cache-CFC 结果一直是MISS。从服务器进程上来看,Nginx cache manager process 跟Nginx cache loader process 进程也正常运行:
1 root 3100 1 0 14:52 ? 00:00:00 nginx: master process /usr/sbin/nginx
2 www-data 3101 3100 0 14:52 ? 00:00:00 nginx: worker process
3 www-data 3102 3100 0 14:52 ? 00:00:00 nginx: cache manager process
4 www-data 3103 3100 0 14:52 ? 00:00:00 nginx: cache loader process
不知道为何会这样,为何没有cache成功,我以为我配置参数有问题,只好阅读WIKI。发现fastcgi_ignore_headers 参数下解释有这么一段
fastcgi_ignore_headers
Syntax: fastcgi_ignore_headers field …
Default:
Context: http
server
location
Reference: fastcgi_ignore_headers
This directive forbids processing of the named headers from the FastCGI-server reply. It is possible to specify headers like “X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”.
也就是说这个参数的值,将会被忽略掉,同样被忽略掉的响应头比如”X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”,而nginx配置中并没有fastcgi_ignore_headers参数的设定,那么问题会不会出现在FASTCGI响应结果里包含了类似”X-Accel-Redirect”, “X-Accel-Expires”, “Expires” or “Cache-Control”这几个响应头呢?用strace抓包,看了下nginx与fpm进程通讯的数据
1 ####为了确保准确抓到处理该http请求的进程,我把nginx 、fpm都只开启了一个进程处理。
2 //strace -ff -tt -s 1000 -o xxx.log -p PHPFPM-PID
3 14:52:07.837334 write(3, "\1\6\0\1\0\343\5\0X-Powered-By: PHP/5.3.10-1ubuntu3.5\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\nPragma: no-cache\r\nContent-type: text/html\r\n\r\nHello cfc4n1362034327\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0", 256) = 256
4
5 //strace -ff -tt -s 1000 -o xxx.log -p Nginx-PID
6 15:05:13.265663 recvfrom(12, "\1\6\0\1\0\343\5\0X-Powered-By: PHP/5.3.10-1ubuntu3.5\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\nPragma: no-cache\r\nContent-type: text/html\r\n\r\nHello cfc4n1362035113\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0", 4023, 0, NULL, NULL) = 256
从抓取的数据包里可以看到,fpm确实返回了包含“Expires”、“Cache-Control”头的http 响应头信息。那么疑问来了:
nginx的fastcgi_cache没缓存这条http响应,是因为响应头里包含“Expires”、“Cache-Control”的原因吗?
程序里并没有输出“Expires”、“Cache-Control” http header的代码,这是谁输出的呢?
既然是fpm响应的时候,就已经有了,那么是php的core模块,还是其他拓展模块输出的?
“Expires:”时间为何是“Thu, 19 Nov 1981 08:52:00 GMT”?
疑问比较多,一个一个查起,先从Nginx的fastcgi_cache没缓存这条http响应查起。我根据测试环境nginx版本1.1.9(ubuntu 12.04默认的),到nginx官方下了对应版本的源码,搜索了fastcgi参数使用的地方,在http\ngx_http_upstream.c找到了。虽然不能很流程的读懂nginx的代码,但粗略的了解,根据了解的情况加以猜测,再动手测试实验,也得出了结论,确定了nginx的fastcgi_cache的规则。
来自:http://www.cnxct.com/several-reminder-in-nginx-fastcgi_cache-and-php-session_cache_limiter/
背景:外网仿真机是通过nginx代理到真实的某台虚拟机上,而仿真机上是http,此时有一个https服务需要进行配置并代理,于是,得通过nginx去作反向https代理,这篇文章就是干这事儿的,如下:
作者:敖士伟
说明:
1.nginx 1.2.0 centos 6.2
2.这里所指的反向代理https是指nginx为ssl服务器,nginx与后端服务器的通信还是http,当然可能也可以实现nginx与后端服务器实现https通信,不过本文没有测试
步骤:
nginx要实现ssl,在编译时要添加--with-http_ssl_module,如:
./configure --with-http_ssl_module
#cd /usr/local/nginx/conf
#mkdir ssl
#cd ssl
生成一个私有key
# openssl genrsa -des3 -out aoshiwei.com.key 1024
提示输入密码
生成CSR(Certificate Signing Request)文件:
# openssl req -new -key aoshiwei.com.key -out aoshiwei.com.csr
填写证书内容,组织机构、域名等,Common Name填写域名
# cp aoshiwei.com.key aoshiwei.com.key.bak
# openssl rsa -in aoshiwei.com.key.bak -out aoshiwei.com.key
# openssl x509 -req -days 365 -in aoshiwei.com.csr -signkey aoshiwei.com.key -out aoshiwei.com.crt
在nginx.conf中添加:
server {
### server port and name ###
listen 443 ssl;
server_name member.aoshiwei.com;
ssl on;
### SSL log files ###
access_log logs/ssl-access.log;
error_log logs/ssl-error.log;
### SSL cert files ###
ssl_certificate ssl/aoshiwei.com.crt;
ssl_certificate_key ssl/aoshiwei.com.key;
### Add SSL specific settings here ###
keepalive_timeout 60;
### Limiting Ciphers ########################
# Uncomment as per your setup
#ssl_ciphers HIGH:!ADH;
#ssl_perfer_server_ciphers on;
#ssl_protocols SSLv3;
##############################################
### We want full access to SSL via backend ###
location / {
proxy_pass http://member.aoshiwei.com;
### force timeouts if one of backend is died ##
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
### Set headers ####
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
### Most PHP, Python, Rails, Java App can use this header ###
proxy_set_header X-Forwarded-Proto https;
### By default we don't want to redirect it ####
proxy_redirect off;
}
}
来自:http://blog.csdn.net/ikmb/article/details/7618172
作者:敖士伟
说明:
1.nginx 1.2.0 centos 6.2
2.这里所指的反向代理https是指nginx为ssl服务器,nginx与后端服务器的通信还是http,当然可能也可以实现nginx与后端服务器实现https通信,不过本文没有测试
步骤:
nginx要实现ssl,在编译时要添加--with-http_ssl_module,如:
./configure --with-http_ssl_module
#cd /usr/local/nginx/conf
#mkdir ssl
#cd ssl
生成一个私有key
# openssl genrsa -des3 -out aoshiwei.com.key 1024
提示输入密码
生成CSR(Certificate Signing Request)文件:
# openssl req -new -key aoshiwei.com.key -out aoshiwei.com.csr
填写证书内容,组织机构、域名等,Common Name填写域名
# cp aoshiwei.com.key aoshiwei.com.key.bak
# openssl rsa -in aoshiwei.com.key.bak -out aoshiwei.com.key
# openssl x509 -req -days 365 -in aoshiwei.com.csr -signkey aoshiwei.com.key -out aoshiwei.com.crt
在nginx.conf中添加:
server {
### server port and name ###
listen 443 ssl;
server_name member.aoshiwei.com;
ssl on;
### SSL log files ###
access_log logs/ssl-access.log;
error_log logs/ssl-error.log;
### SSL cert files ###
ssl_certificate ssl/aoshiwei.com.crt;
ssl_certificate_key ssl/aoshiwei.com.key;
### Add SSL specific settings here ###
keepalive_timeout 60;
### Limiting Ciphers ########################
# Uncomment as per your setup
#ssl_ciphers HIGH:!ADH;
#ssl_perfer_server_ciphers on;
#ssl_protocols SSLv3;
##############################################
### We want full access to SSL via backend ###
location / {
proxy_pass http://member.aoshiwei.com;
### force timeouts if one of backend is died ##
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
### Set headers ####
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
### Most PHP, Python, Rails, Java App can use this header ###
proxy_set_header X-Forwarded-Proto https;
### By default we don't want to redirect it ####
proxy_redirect off;
}
}
来自:http://blog.csdn.net/ikmb/article/details/7618172