Apache and PHP FastCGI

虽然Nginx加上php有相当优秀的表现,但是有时候,基于业务需要,不得不用ApachephpApache下有两种运行方式,一种是编译成Apache的模块,一种是以cgi方式运行,cgi则可细分为fastcgi,以模块方式运行,无论Apache还是php出现安全漏洞,需要升级软件版本,都需要同时重新编译二者,这是一个很没有统筹科学的态度,以普通cgi方式运行,配置简单,但比之于fastcgi效率不高,每个脚本执行都需要reload script和php.ini,基本上,这个意思就是说,脚本缓存是无效的,所以,我们需要fastcgi。

需要说明的是,在当前php5.3.6版本中,php-fpm已经包含在源代码中,只需要在编译的时候加入相应参数: –enable-fpm,安装完成后,拷贝/src/php-5.3.6/sapi/fpm/init.d.php-fpm 到/usr/local/bin/,然后chmod +x 就可以了

Usage: /usr/local/bin/init.d.php-fpm {start|stop|force-quit|restart|reload}

当然,你知道配置文件默认放在/usr/local/etc/php-fpm.conf,修修改改就可以start了!

php的配置很简单,但Apache的mod_fastcgi是需要单独下载编译的:
1,下载mod_fastcgi:http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
解压缩了来安装到Apache里面去,例如,我们把Apache安装在了/usr/local/httpd:

tar zxf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
make install top_dir=/usr/local/httpd

2,在配置文件中启用mod_fastcgi,例如我们可以包含一个配置文件在extra目录中,起个名字叫httpd-fastcgi.conf,这个例子呢,我是把php-fpm的socket放在/tmp目录下的:

LoadModule fastcgi_module modules/mod_fastcgi.so
ScriptAlias /php-bin /usr/local/bin
AddHandler application/x-httpd-php5 php
Action application/x-httpd-php5 /php-bin/php-cgi
FastCgiExternalServer /usr/local/bin/php-cgi -socket /tmp/php.sock

当然,基于安全考虑,可以将配置文件单独放在不同的虚拟主机中。

技术人员如何”正确”的浪费时间?

iPhone产品用户要浪费时间,你就应该这样做:买个有锁的 iPhone ,每天刷几百次威锋网等待越狱或解锁,看到新 App 就安装,程序提示更新立刻升级;有新的固件(哪怕是 β 版)就压制不住升级的欲望;每次 WWDC 提前几个礼拜就关注,坚持看完所有 Keynote 和文章,然后到 Twitter 或是微博发表评论,再在微博上收听苹果产品有关的 ID…

Linux 操作系统用户如果要浪费时间,你就应该这样做:编译一个”更快”的内核;通过源代码编译 Firefox / Chromium ;反复调整字体;不停的美化桌面;闲着没事就跑一下APT更新一下程序;和 Windows 用户打嘴仗;

Windows 操作系统用户如果要浪费时间,你就应该这样做:安装杀毒软件并且按照提示更新;定期扫描病毒和木马;安装个360,不停根据提示更新软件,优化系统,每天查看开机速度击败了全国多少的电脑;重新安装操作系统;跟 Linux 用户和 Mac 用户打嘴仗;

开发人员如果要浪费时间,你就应该这样做:不停的寻找一个更趁手的编辑器,反复尝试不同的配色;尝试最新的语言;买个更好的显卡”挖矿”–bitcoin;和其它语言用户打嘴仗;

Mac 用户如何浪费时间?在Mac上跑一个Windows 虚拟机,再跑一个 Linux 虚拟机;上网购物用Windows,写代码用Linux;Mac OS X?不用。

恭喜你,这些都是”正确”浪费时间的办法。

修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets

新增的一组Apache服务器上线以来,我用netstat -an命令发现服务器中有大量状态为TIME-WAIT的TCP连接,于是用/sbin/sysctl -a查看了一下Linux的各项内核参数,并翻阅有关资料,决定修改其中的两项参数,以达到减少TCP连接中TIME-WAIT sockets的目的。

vi /etc/sysctl.conf
编辑/etc/sysctl.conf文件,增加三行:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

说明:
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

再执行以下命令,让修改结果立即生效:
/sbin/sysctl -p

用以下语句看了一下服务器的TCP状态:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

返回结果如下:
TIME_WAIT 300
CLOSE_WAIT 10
FIN_WAIT1 8
FIN_WAIT2 14
ESTABLISHED 835
SYN_RECV 4

效果:处于TIME_WAIT状态的sockets从原来的1000多减少到300左右。处于SYN_RECV等待处理状态的sockets为4,原来的为50~300。