文章标签 » nginx

通过tcpdump粗略了解web server的qps

如果关掉了web server的日志,又想知道qps怎样,可以用下这个tcpdump脚本
qps.sh

#0x4745=GE 0x504F=PO 分别匹配GET请求和POST请求
tcpdump -n -i eth0 dst port 80 and \( tcp[20:2]=0x4745 or tcp[20:2]=0x504F \) 1> /dev/null 2> /dev/tty &
#如果系统自带timeout命令,可以替代这种山寨限时方法
sleep 1
killall tcpdump
#结果中的packets captured基本代表了实时的qps

tcpdump使用详解

影响PHP文件上传大小限制的参数

__WIKI__
=PHP=
==[http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize upload_max_filesize]==
最直接影响的参数,上传文件的最大尺寸,默认为2M
==[http://www.php.net/manual/en/ini.core.php#ini.post-max-size post_max_size]==
POST数据的最大尺寸,默认8M。由于文件上传是通过POST方式发送的,所以post_max_size必须比upload_max_filesize x 最大同时上传文件数大
==[http://www.php.net/manual/en/info.configuration.php#ini.max-input-time max_input_time]==
解析从http server接收数据的最大时间,默认-1,没有限制,如果设置了超时则在处理大文件时很可能会超时
==[http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time max_execution_time]==
脚本的最大运行时间,默认30秒,如果要接收大文件可以通过[http://www.php.net/manual/en/function.set-time-limit.php set_time_limit]设置一个较长的时间
==[http://www.php.net/manual/en/ini.core.php#ini.memory-limit memory_limit]==
运行内存限制,默认128M,如果开启了内存限制,则memory_limit的值也要比post_max_size大
=Apache=
==[http://httpd.apache.org/docs/current/mod/core.html#limitrequestbody LimitRequestBody]==
限制http请求body大小,假如设置了限制,则参考php的post_max_size
==[http://httpd.apache.org/docs/2.0/mod/core.html#timeout TimeOut]==
此参数限制了接收请求的最大时间,如果上传大文件,可以合理增加时间
=Nginx=
==[http://wiki.nginx.org/HttpCoreModule#client_max_body_size client_max_body_size]==
限制http请求body大小
==[http://wiki.nginx.org/HttpCoreModule#client_body_timeout client_body_timeout]==
上传超时时间
==[http://wiki.nginx.org/HttpFastcgiModule#fastcgi_read_timeout fastcgi_read_timeout]==
fastcgi输出超时时间
=PHP.fpm=
==[http://www.php.net/manual/en/install.fpm.configuration.php request_terminate_timeout]==
参照max_execution_time

=参考=
[http://www.radinks.com/upload/config.php]

[http://www.villescorner.com/2012/02/nginx-php-fpm-file-upload-battle.html]

nginx反向代理kloxo

偶的vps配置真是几经波折。。

最开始 : centos + nginx + fastcgi + php,一个人用,任何修改都是直接ssh到server,一水的root

后来,搬家了,两个人用,加一个菜鸟的明星同学,考虑到傻瓜性,保留了默认安装的控制面板:centos + kloxo。kloxo可以选lighttpd, apache。由于一开始不知道能切apache,就用了lighttpd + fastcgi + php,结果发现每个人开三个fastcgi,128内存基本上就快光了,还有一点不爽的就是wp-super-cache的重写,如果用apache根本不用操心。。

备注:恩,由于kloxo的安全性考虑,每个用户的fastcgi都是单开的,不能共用

现如今,同样的vps配置,5个人共用,不得不再换个思路。首先fastcgi肯定不靠普了,每个人开2个,基本上就靠swap活着了,所以一定要用apache,apache里php以模块运行,多用户可以共用,所以apache进程只需开到2-3个,使用8080端口,然后前端再放nginx做代理,顺便处理静态文件。

恩,思路很简单,但是问题是,kloxo生成的虚拟主机配置文件全是80端口,想hack一下,发现源代码全被zend加密了。后来官网svn找到源码,端口竟然都是80写死在代码里的,修改之后覆盖到server上,发现不能添加域名了,说明版本太新,最后没办法,只能恶心一下了~

每10秒钟检查一下配置文件,如果发现kloxo生成了80端口的配置文件,立刻替换成8080端口。脚本启动添加到/etc/rc.local里,开机运行。

#!/bin/sh
while [ "a"="a" ];do
        find /home/httpd/ -type f -name "kloxo.*" | xargs grep ":80\\\\" > /tmp/kloxo_port 
        if [ -n "`cat /tmp/kloxo_port`" ];then
                sh /root/kloxo_changeport.sh "80" "8080"
                sleep 2
                echo "restart httpd"
                echo "restart httpd `date`" >> /var/log/httpd_restart.log
                /etc/init.d/httpd restart
        fi
        sleep 10
done

用到的两个shell脚本下载 : fuck-kloxo

OK,解决完端口问题下面就是配置ngnix代理

#仅开了一个进程。。
worker_processes  1;

配置代理

server {
        limit_conn   myzone  10;
        listen       80;
        server_name  _;
#静态文件不走代理,直接nginx处理
        location ~* .*\.(jpg|jpeg|png|gif|css|js|swf|mp3|avi|flv|xml|zip|rar)$ {
                add_header BlueNoProxy 1;
                expires 30d;
                root /home/httpd/$host/httpdocs;
        } 
#html文件由可能是固态链接,所以404之后依然走代理
        location ~* .*\.(html|htm)$ {
                add_header BlueNoProxy 1;
                root /home/httpd/$host/httpdocs;
                error_page 404 = @proxy;
        }
#这里ip不能用127.0.0.1,kloxo的配置文件里会根据外网ip划分虚拟主机
        location @proxy {
                proxy_pass        http://209.124.50.68:8080;
                proxy_set_header Host $host;
                proxy_set_header  x-real-IP  $remote_addr;
 
        }
 
        location / {
                proxy_pass        http://209.124.50.68:8080;
                proxy_set_header Host $host;
                proxy_set_header  x-real-IP  $remote_addr;
        }
 
   }

以上,偶的最新vps配置就over了~

411 Length Required

如果您恰好使用了ff浏览器(偶用ff3.0),server端使用了nginx作代理,而某个ajax又恰好传了一个为null的数据,您就会看到这个错误

firefox下点run code运行下面代码,firebug 看控制台

<html>
<input type="button" value="send null ajax" onclick="send();" />
</html>
<script>
function send()
{
var rq = new XMLHttpRequest();
rq.open("POST", "http://bluehua.org/index.php", true);
rq.send( null );
}
</script>

两种解决方法:
client side : rq.send( data ) -> rq.send( data || ” );
server side : http://rocky.blog.kingtch.com/2008/11/28/fix_nginx_411_length_required/