理想論壇

理想論壇為國內的股票論壇,註冊會員已超過100萬,並以每月60000人的速度穩定遞增,每日頁面訪問量超過200萬,並保持穩定增長的趨勢,60分鐘線上平均約2萬多人,最高記錄3萬3千多。 目前主題超過30萬,帖子接近1千萬,資料庫大小5.8GB,附屬檔案總大小大約150GB

基本介紹

  • 中文名:理想論壇
  • 註冊會員:100萬
  • 會員增速:每月60000人
  • 資料庫:5.8GB
簡介,硬體具體情況,後繼討論,

簡介

業內認可度: 網站在專業性方面是做得最好的,這一點非常值得讚賞。下一階段發展的潛力不可預估
(本項評級:6)
網站規模: 網站在規模方面是應該稱道的,目前來說這一部分做得和專業程度相得益彰(本項評級:7)
訪問量: 和網站規模比也還算可以了。由於站點的專業性,要有突破可能得靠吸引更多的忠實用戶了。(本項評級:7)
線上宣傳:很顯然,網站宣傳方面您還有更多的潛力可挖,或許多做點交換連結吧,其他網站會願意的。(本項評級:5)
綜合實力: 恭喜您,您的網站和其他網站已經有質的區別了,以後的發展不可限量。
發展小評: 一點小結論,您的網站各項指標我們覺得還是比較均衡。 發展很良好,請繼續保持吧。
我們建議:您多注意一些線上宣傳,多和一些可信的站點做下連結吧,或者儘可能讓人引用您的內容
一下為網站架構:
之前理想論壇有三台伺服器,兩台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請求
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_processes 4;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid /var/log/nginx.pid;
events {
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
limit_zone one $binary_remote_addr 10m;
#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
sendfile off;
tcp_nopush off;
#keepalive_timeout 0;
keepalive_timeout 10;
gzip off;
server {
listen 80;
index index.html index.htm index.php;
access_log /dev/null combined;
limit_conn one 5;#限制一個IP並發連線數為五個
error_page 404 /404.html;
error_page 403 /403.html;
location /status {
stub_status on;
access_log off;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#在根目錄使用Discuz6.0 rewrite規則,如果你的論壇在二級目錄下面,則要相應修改location
location / {
rewrite ^/archiver/((fid|tid)-[\w\-]+\.html)$ /archiver/index.php?$1 last;
rewrite ^/forum-([0-9]+)-([0-9]+)\.html$ /forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&extra=page\%3D$3&page=$2 last;
rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last;
break;
error_page 404 /404.html;
error_page 403 /403.html;
}
#對附屬檔案做防盜鏈,沒有正確的referer將會返回403頁面
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {
valid_referers none blocked server_names *.55188.net *.55188.com;
if ($invalid_referer) {
rewrite ^/
}
}
#轉發PHP請求到本地的81連線埠,讓Apache處理.
location ~ \.php$ {
proxy_pass http://127.0.0.1:81;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header Content-Type;
}
}
}
測試一下你的配置檔案是否都正確
/usr/local/sbin/apachectl configtest
/usr/local/sbin/nginx -t
都沒問題的話就啟動伺服器吧
/usr/local/sbin/apachectl start
/usr/local/sbin/nginx -c /usr/local/etc/nginx/nginx.conf
瀏覽一下主頁,應該正常了

後繼討論

1.資料庫.
資料庫的編譯安裝不再重複討論,僅僅討論環境,由於理想論壇的資料庫比較大,而且發展比較快,所以要作比較前一點的預算,硬碟需要使用15K RPM的SAS硬碟RAID0+1,作業系統需要使用64位版本,因為伺服器需要8GB記憶體,要注意的時,使用了64位系統之後部分比較老的軟體可能你無法找到64位的版本,這台機器就專門做MySQL伺服器吧,如果資料庫超過10G,應該考慮MySQL_Cluster
2.附屬檔案.
因為有三台伺服器做WEB,所以附屬檔案要使用nfs的方式通過區域網路進行共享,至於如何設定nfs這裡不再討論,如果有不明白的請將學費交給Google
3.WEB.
由於三台機器硬體配置不一致,所以有必要考慮一下負載平衡的問題,nginx本身附帶有負載平衡的功能,但是如果啟用負載平衡的功能的話,每台機器都將會把客戶端請求的數據快取到本機,這樣增加了硬碟的IO,對於理想論壇的訪問量來說,這是個不小的開銷,最後我們是使用DNS查詢的方式來分配流量, 通過不同的A記錄,配置好點的機器,多分一條A記錄,配置差的就少一條A記錄,這樣從整體上看,流量分配應該比較平衡.
4.關於nginx並發連線
豬頭給nginx限制了每個IP的並發連線,因為對於大論壇來說,總是比較出名的,不說人家攻擊你什麼的.採集都特別多,如果不限制,很容易出問題,經常會導致PHP罷工.
以上只是豬頭愚見,如果有其他進展,豬頭會更新本貼,如有疑問或者不同見解,歡迎提出討論
當然還有很多很瘋狂的方法,例如說把WEB檔案(附屬檔案除外)全部放記憶體裡面,MYSQL如果小於5G,也可以全部放記憶體裡面,不過這些方法都是太極端的了,最佳化效果須然好,但是風險很大。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最佳化之後的效果
由於還有兩台機器升級沒完成,只帖一下其中一台WEB的狀況了。目前
Active connections: 1143
server accepts handled requests
1211445 1211445 6221785
Reading: 67 Writing: 136 Waiting: 940
Apache最最佳化要關閉不用的模組,因為httpd請求全部讓nginx處理了,Apache僅僅需要處理PHP就可以了,目前我開啟的模組
LoadModule access_module libexec/apache2/mod_access.so
LoadModule setenvif_module libexec/apache2/mod_setenvif.so
LoadModule mime_module libexec/apache2/mod_mime.so
LoadModule autoindex_module libexec/apache2/mod_autoindex.so
LoadModule negotiation_module libexec/apache2/mod_negotiation.so
LoadModule alias_module libexec/apache2/mod_alias.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule php5_module libexec/apache2/libphp5.so
autoindex negotiation以及rewrite這些應該都關閉的,但是要做相應的修改.目前跑起來絕對比Fastcgi要好

相關詞條

熱門詞條

聯絡我們