日期:2014-05-17  浏览次数:20744 次

关于大型论坛系统环境搭建(20万日IP负载平衡实战)–Nginx+Apache2+PHP+MySQL

测试环境:理想论坛(55188).
理想论坛为国内人气最旺的股票论坛,注册会员已超过100万,并以每月60000人的速度稳定递增,每日页面访问量超过200万,并保持稳定增长的趋 势,60分钟在线平均约2万多人,最高记录3万3千多。 目前主题超过30万,帖子接近1千万,数据库大小5.8GB,附件总大小大约150GB
之前理想论坛有三台服务器,两台WEB服务器以及一台数据库服务器,访问已经渐渐出现瓶颈,在作者的建议下,站长决定增加一台服务器放数据库,另外三台做 WEB,并且对原有的服务器的操作系统进行升级。
硬件具体情况
MySQL服务器: DualXeon 5335/8GB内存/73G SAS硬盘(RAID0+1)/CentOS5.1-x86_64/MySQL5
三台WEB服务器如下:
N1. Dual Xeon 3.0 2GB 内存
N1. Dual Xeon 3.0 4GB 内存
N1. Dual Xeon 3.0(双核) 4G内存
另外有三块300G的SCSI硬盘准备做RAID5,用来存放附件,四台机器通过内网连接

考虑过的解决方案如下:
1. ZEUS + PHP5 + eAccelerator
2. squid + Apache2 + PHP + eAccelerator
3. nginx + PHP(fastcgi) + eAccelerator
4. nginx + Apache2 + PHP + eAccelerator

?

第一个方案,属于比较完美的,而且很稳定,但是最大的问题是ZEUS是收费软件,用盗版总会受良心责备的,所以暂时押后做候补方案
第二个方案,squid转发请求给Apache2,很多网站都采用这种方式,而且效率也非常高,作者也测试了一下,但是问题非常严重,因为squid是把文件缓存起来的,所以每一个访问过的文件,squid都要把它打开,理想论坛拥有150G的附件,而且访问量巨大,这种情况下只有打开squid,机器很快就会因为打开文件过多而拒绝响应任何请求了,看来也不适合,只适合缓存文件只有几百M以内的网站.
第三个方案,作者对第三个方案的测试结果是访问量大的时候,PHP经常会出现bad gateway,看来通过TCP连接Fastcgi执行PHP的方法不够稳定,作者也测试了通过Unix Socket连接执行PHP,同样还是不稳定.

对比之下,作者目前使用了第四种解决方案.

Apache2的安装。
(由于服务器采用FreeBSD7,所以大部分软件将会通过ports安装)
由于Apache2只需要处理PHP请求,所以其他模块基本上都不需要,所以不要选择安装其他模块,即使rewrite也不需要,因为rewrite将会在nginx上面实现,如果熟悉,还可以修改Makefile删掉不需要的部分,这样经过优化之后,apache将会以最稳定最高效的方式处理PHP请求

cd /usr/ports/www/apache20
make install clean

修改httpd.conf(这里仅列出要修改/增加的部分)
vi /usr/local/etc/apache2/httpd.conf
把KeepAlive On修改为KeepAlive Off,在下面添加
ServerLimit 2048
MaxClients增加到512
Listen 127.0.0.1:81 #由于httpd服务器不需要对外开放,仅仅处理nginx转发过来的PHP请求,所以仅仅需要监听本地的端口.
另外增加对PHP的支持
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
至于添加虚拟主机的部分将不再罗嗦,注意虚拟主机也监听本地81端口就可以了

PHP5的安装(GD库等模块请提前装好)
cd /usr/ports/lang/php5
修改一下Makefile,把需要的东西加上去吧
本来应该有这样一段的

CONFIGURE_ARGS= \
–with-layout=GNU \
–with-config-file-scan-dir=${PREFIX}/etc/php \
–disable-all \
–enable-libxml \
–with-libxml-dir=${LOCALBASE} \
–enable-reflection \
–program-prefix=""

我们要把它修改成

CONFIGURE_ARGS= \
–with-layout=GNU \
–with-config-file-scan-dir=${PREFIX}/etc/php \
–disable-all \
–enable-libxml \
–with-libxml-dir=${LOCALBASE} \
–enable-reflection \
–program-prefix="" \
–with-config-file-path=/etc –enable-mbstring –enable-ftp –with-gd –with-jpeg-dir=/usr/local –with-png-dir=/usr/local –enable-magic-quotes –with-mysql=/usr/local –with-pear –enable-sockets –with-ttf –with-freetype-dir=/usr/local –enable-gd-native-ttf –with-zlib –enable-sysvsem –enable-sysvshm –with-libxml-dir=/usr/local –with-pcre-regex –enable-xml

make install clean
cp work/php-5.2.5/php.ini-dist /etc/php.ini

安装eAccelerator
cd /usr/ports/www/eaccelerator
make install clean
把以下部分添加到php.ini尾端:

extension_dir="/usr/local/lib/php/20060613/"
extension="eaccelerator.so"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.shm_size="64"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="60"
eaccelerator.shm_prune_period="60"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys="shm_and_disk"
eaccelerator.sessions="shm_and_disk"
eaccelerator.content="shm_and_disk"

建立缓存目录以及修改权限

mkdir /tmp/eaccelerator
chmod 777 /tmp/eaccelerator
chown nobody:nobody /tmp/eaccelerator

nginx的安装以及配置

cd /usr/ports/www/nginx
make install

有几个module是我们需要的,要选上

HTTP module
http_addition module
http_rewrite module
http_realip module
http_stub_status module

其他的看自己需要了
修改配置文件
vi /usr/local/etc/nginx/nginx.conf

user nobody nobody;
worker_proc