﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vi`blog · 唯音 &#187; 负载</title>
	<atom:link href="http://www.viyin.net/tag/%e8%b4%9f%e8%bd%bd/feed" rel="self" type="application/rss+xml" />
	<link>http://www.viyin.net</link>
	<description>岂能尽如人意，但求无愧于心</description>
	<lastBuildDate>Mon, 14 Nov 2011 15:43:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>关于大型论坛系统环境搭建(20万日IP负载平衡实战)–Nginx+Apache2+PHP+MySQL</title>
		<link>http://www.viyin.net/2010/01/nginx-apache-php-mysql.html</link>
		<comments>http://www.viyin.net/2010/01/nginx-apache-php-mysql.html#comments</comments>
		<pubDate>Sun, 17 Jan 2010 10:30:07 +0000</pubDate>
		<dc:creator>vi</dc:creator>
				<category><![CDATA[√web]]></category>
		<category><![CDATA[ningx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[负载]]></category>

		<guid isPermaLink="false">http://www.viyin.net/?p=602</guid>
		<description><![CDATA[作者:猪头 版权没有，欢迎转载，转载请勿注明出处 （本文只针对Discuz论坛系统讨论，由于软件包更新速度比较快，你看本贴的时候可能已经是使用新版本的软件包了，安装方法可能不一致，详细请查看软件包的README文件） 测试环境:理想论坛(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 + [...]]]></description>
			<content:encoded><![CDATA[<p>作者:猪头<br />
版权没有，欢迎转载，转载请勿注明出处<br />
（本文只针对Discuz论坛系统讨论，由于软件包更新速度比较快，你看本贴的时候可能已经是使用新版本的软件包了，安装方法可能不一致，详细请查看软件包的README文件）</p>
<p>测试环境:理想论坛(55188).<br />
理想论坛为国内人气最旺的股票论坛，注册会员已超过100万，并以每月60000人的速度稳定递增，每日页面访问量超过200万，并保持稳定增长的趋势,60分钟在线平均约2万多人，最高记录3万3千多。 目前主题超过30万，帖子接近1千万，数据库大小5.8GB，附件总大小大约150GB<br />
之前理想论坛有三台服务器，两台WEB服务器以及一台数据库服务器，访问已经渐渐出现瓶颈，在猪头的建议下，站长决定增加一台服务器放数据库，另外三台做WEB，并且对原有的服务器的操作系统进行升级。<br />
硬件具体情况<br />
MySQL服务器： DualXeon 5335/8GB内存/73G SAS硬盘（RAID0+1）/CentOS5.1-x86_64/MySQL5<br />
三台WEB服务器如下：<br />
N1. Dual Xeon 3.0 2GB 内存<br />
N1. Dual Xeon 3.0 4GB 内存<br />
N1. Dual Xeon 3.0(双核) 4G内存<br />
另外有三块300G的SCSI硬盘准备做RAID5，用来存放附件,四台机器通过内网连接</p>
<p>猪头考虑过的解决方案如下:<br />
1. ZEUS + <a href="http://www.viyin.net/tag/php" class="st_tag internal_tag" rel="tag" title="标签 php 下的日志">PHP</a>5 + eAccelerator<br />
2. squid + Apache2 + PHP + eAccelerator<br />
3. nginx + PHP(fastcgi) + eAccelerator<br />
4. nginx + Apache2 + PHP + eAccelerator</p>
<p><span id="more-602"></span></p>
<p>第一个方案，属于比较完美的，而且很稳定，但是最大的问题是ZEUS是收费软件，用盗版总会受良心责备的,所以暂时押后做候补方案<br />
第二个方案，squid转发请求给Apache2，很多网站都采用这种方式，而且效率也非常高，猪头也测试了一下，但是问题非常严重，因为squid是把文件缓存起来的，所以每一个访问过的文件，squid都要把它打开，理想论坛拥有150G的附件，而且访问量巨大，这种情况下只有打开squid，机器很快就会因为打开文件过多而拒绝响应任何请求了,看来也不适合,只适合缓存文件只有几百M以内的网站.<br />
第三个方案，猪头对第三个方案的测试结果是访问量大的时候，PHP经常会出现bad gateway，看来通过TCP连接Fastcgi执行PHP的方法不够稳定，猪头也测试了通过Unix Socket连接执行PHP，同样还是不稳定.</p>
<p>对比之下，猪头目前使用了第四种解决方案.</p>
<p>Apache2的安装。<br />
(由于服务器采用FreeBSD7，所以大部分软件将会通过ports安装)<br />
由于Apache2只需要处理PHP请求，所以其他模块基本上都不需要，所以不要选择安装其他模块，即使rewrite也不需要，因为rewrite将会在nginx上面实现，如果熟悉，还可以修改Makefile删掉不需要的部分，这样经过优化之后，apache将会以最稳定最高效的方式处理PHP请求</p>
<p>cd /usr/ports/www/apache20<br />
make install clean</p>
<p>修改httpd.conf(这里仅列出要修改/增加的部分)<br />
vi /usr/local/etc/apache2/httpd.conf<br />
把KeepAlive On修改为KeepAlive Off，在下面添加<br />
ServerLimit 2048<br />
MaxClients增加到512<br />
Listen 127.0.0.1:81 #由于httpd服务器不需要对外开放，仅仅处理nginx转发过来的PHP请求，所以仅仅需要监听本地的端口.<br />
另外增加对PHP的支持<br />
AddType application/x-httpd-php .php<br />
AddType application/x-httpd-php-source .phps<br />
至于添加虚拟主机的部分将不再罗嗦，注意虚拟主机也监听本地81端口就可以了</p>
<p>PHP5的安装(GD库等模块请提前装好)<br />
cd /usr/ports/lang/php5<br />
修改一下Makefile，把需要的东西加上去吧<br />
本来应该有这样一段的</p>
<p>CONFIGURE_ARGS= \<br />
–with-layout=GNU \<br />
–with-config-file-scan-dir=${PREFIX}/etc/php \<br />
–disable-all \<br />
–enable-libxml \<br />
–with-libxml-dir=${LOCALBASE} \<br />
–enable-reflection \<br />
–program-prefix=””</p>
<p>我们要把它修改成</p>
<p>CONFIGURE_ARGS= \<br />
–with-layout=GNU \<br />
–with-config-file-scan-dir=${PREFIX}/etc/php \<br />
–disable-all \<br />
–enable-libxml \<br />
–with-libxml-dir=${LOCALBASE} \<br />
–enable-reflection \<br />
–program-prefix=”” \<br />
–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</p>
<p>make install clean<br />
cp work/php-5.2.5/php.ini-dist /etc/php.ini</p>
<p>安装eAccelerator<br />
cd /usr/ports/www/eaccelerator<br />
make install clean<br />
把以下部分添加到php.ini尾端:</p>
<p>extension_dir=”/usr/local/lib/php/20060613/”<br />
extension=”eaccelerator.so”<br />
eaccelerator.cache_dir=”/tmp/eaccelerator”<br />
eaccelerator.shm_size=”64″<br />
eaccelerator.enable=”1″<br />
eaccelerator.optimizer=”1″<br />
eaccelerator.check_mtime=”1″<br />
eaccelerator.debug=”0″<br />
eaccelerator.filter=””<br />
eaccelerator.shm_max=”0″<br />
eaccelerator.shm_ttl=”60″<br />
eaccelerator.shm_prune_period=”60″<br />
eaccelerator.shm_only=”0″<br />
eaccelerator.compress=”1″<br />
eaccelerator.compress_level=”9″<br />
eaccelerator.keys=”shm_and_disk”<br />
eaccelerator.sessions=”shm_and_disk”<br />
eaccelerator.content=”shm_and_disk”</p>
<p>建立缓存目录以及修改权限</p>
<p>mkdir /tmp/eaccelerator<br />
chmod 777 /tmp/eaccelerator<br />
chown nobody:nobody /tmp/eaccelerator</p>
<p>nginx的安装以及配置</p>
<p>cd /usr/ports/www/nginx<br />
make install</p>
<p>有几个module是我们需要的，要选上</p>
<p>HTTP module<br />
http_addition module<br />
http_rewrite module<br />
http_realip module<br />
http_stub_status module</p>
<p>其他的看自己需要了<br />
修改配置文件<br />
vi /usr/local/etc/nginx/nginx.conf</p>
<p>user nobody nobody;<br />
worker_processes 4;<br />
#error_log logs/error.log;<br />
#error_log logs/error.log notice;<br />
#error_log logs/error.log info;<br />
#pid /var/log/nginx.pid;<br />
events {<br />
worker_connections 10240;<br />
}<br />
http {<br />
include mime.types;<br />
default_type application/octet-stream;<br />
limit_zone one $binary_remote_addr 10m;<br />
#log_format main ‘$remote_addr – $remote_user [$time_local] $request ‘<br />
# ‘”$status” $body_bytes_sent “$http_referer” ‘<br />
# ‘”$http_user_agent” “$http_x_forwarded_for”‘;<br />
sendfile off;<br />
tcp_nopush off;<br />
#keepalive_timeout 0;<br />
keepalive_timeout 10;<br />
gzip off;</p>
<p>server {<br />
listen 80;<br />
server_name www.55188.net www.55188.com www1.55188.com www2.55188.com 55188.com 55188.net www.55188.cn 55188.cn bbs.55188.net bbs.55188.com bbs.55188.cn;<br />
index index.html index.htm index.php;<br />
root /home/www;<br />
access_log /dev/null combined;<br />
limit_conn one 5;#限制一个IP并发连接数为五个<br />
error_page 404 /404.html;<br />
error_page 403 /403.html;<br />
location /status {<br />
stub_status on;<br />
access_log off;<br />
auth_basic “NginxStatus”;<br />
auth_basic_user_file conf/htpasswd;<br />
}</p>
<p>#在根目录使用Discuz6.0 rewrite规则,如果你的论坛在二级目录下面,则要相应修改location<br />
location / {<br />
rewrite ^/archiver/((fid|tid)-[\w\-]+\.html)$ /archiver/index.php?$1 last;<br />
rewrite ^/forum-([0-9]+)-([0-9]+)\.html$ /forumdisplay.php?fid=$1&amp;page=$2 last;<br />
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&amp;extra=page\%3D$3&amp;page=$2 last;<br />
rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last;<br />
rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last;<br />
break;<br />
error_page 404 /404.html;<br />
error_page 403 /403.html;<br />
}</p>
<p>#对附件做防盗链,没有正确的referer将会返回403页面<br />
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {<br />
valid_referers none blocked server_names *.55188.net *.55188.com;<br />
if ($invalid_referer) {<br />
rewrite ^/ http://www.55188.com/403.html;<br />
}<br />
}</p>
<p>#转发PHP请求到本地的81端口,让Apache处理.<br />
location ~ \.php$ {<br />
proxy_pass http://127.0.0.1:81;<br />
proxy_redirect off;<br />
proxy_set_header Host $host;<br />
proxy_set_header X-Real-IP $remote_addr;<br />
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
proxy_hide_header Content-Type;<br />
}<br />
}</p>
<p>}</p>
<p>测试一下你的配置文件是否都正确</p>
<p>/usr/local/sbin/apachectl configtest<br />
/usr/local/sbin/nginx -t</p>
<p>都没问题的话就启动服务器吧</p>
<p>/usr/local/sbin/apachectl start<br />
/usr/local/sbin/nginx -c /usr/local/etc/nginx/nginx.conf</p>
<p>浏览一下主页，应该正常了</p>
<p>后继讨论，<br />
1.数据库.<br />
数据库的编译安装不再重复讨论，仅仅讨论环境，由于理想论坛的数据库比较大，而且发展比较快，所以要作比较前一点的预算，硬盘需要使用15K RPM的SAS硬盘做RAID0+1，操作系统需要使用64位版本，因为服务器需要8GB内存，要注意的时，使用了64位系统之后部分比较老的软件可能你无法找到64位的版本，这台机器就专门做MySQL服务器吧，如果数据库超过10G，应该考虑MySQL_Cluster</p>
<p>2.附件.<br />
因为有三台服务器做WEB，所以附件要使用nfs的方式通过内网进行共享，至于如何设置nfs这里不再讨论，如果有不明白的请将学费交给Google</p>
<p>3.WEB.<br />
由于三台机器硬件配置不一致,所以有必要考虑一下负载平衡的问题,nginx本身附带有负载平衡的功能,但是如果启用负载平衡的功能的话,每台机器都将会把客户端请求的数据缓存到本机,这样增加了硬盘的IO,对于理想论坛的访问量来说,这是个不小的开销,最后我们是使用DNS查询的方式来分配流量, 通过不同的A记录,配置好点的机器，多分一条A记录，配置差的就少一条A记录，这样从整体上看，流量分配应该比较平衡.</p>
<p>4.关于nginx并发连接<br />
猪头给nginx限制了每个IP的并发连接，因为对于大论坛来说，总是比较出名的，不说人家攻击你什么的.采集都特别多,如果不限制,很容易出问题,经常会导致PHP罢工.</p>
<p>以上只是猪头愚见，如果有其他进展，猪头会更新本贴，如有疑问或者不同见解，欢迎提出讨论</p>
<p>当然还有很多很疯狂的方法，例如说把WEB文件(附件除外)全部放内存里面，MYSQL如果小于5G，也可以全部放内存里面，不过这些方法都是太极端的了，优化效果须然好，但是风险很大。</p>
<p>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</p>
<p>优化之后的效果<br />
由于还有两台机器升级没完成，只帖一下其中一台WEB的状况了。目前<br />
Active connections: 1143<br />
server accepts handled requests<br />
1211445 1211445 6221785<br />
Reading: 67 Writing: 136 Waiting: 940</p>
<p>Apache最优化要关闭不用的模块，因为httpd请求全部让nginx处理了，Apache仅仅需要处理PHP就可以了，目前我开启的模块<br />
LoadModule access_module libexec/apache2/mod_access.so<br />
LoadModule setenvif_module libexec/apache2/mod_setenvif.so<br />
LoadModule mime_module libexec/apache2/mod_mime.so<br />
LoadModule autoindex_module libexec/apache2/mod_autoindex.so<br />
LoadModule negotiation_module libexec/apache2/mod_negotiation.so<br />
LoadModule alias_module libexec/apache2/mod_alias.so<br />
LoadModule rewrite_module libexec/apache2/mod_rewrite.so<br />
LoadModule php5_module libexec/apache2/libphp5.so</p>
<p>autoindex negotiation以及rewrite这些应该都关闭的，但是要做相应的修改.目前跑起来绝对比Fastcgi要好</p>
<p>转载自 http://www.discuz.net/thread-882980-1-2.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.viyin.net/2010/01/nginx-apache-php-mysql.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

