理想論壇
  • 拼 音:
  • 注 音:
  • 繁體字:
提交資料
  • 基本解釋

     域名

    http://www.55188.com/index.php

    簡介

    理想論壇為國內(nèi)人氣最旺的股票論壇,注冊會員已超過100萬,并以每月60000人的速度穩(wěn)定遞增,每日頁面訪問量超過200萬,并保持穩(wěn)定增長的趨勢,60分鐘在線平均約2萬多人,最高記錄3萬3千多。 目前主題超過30萬,帖子接近1千萬,數(shù)據(jù)庫大小5.8GB,附件總大小大約150GB

    業(yè)內(nèi)認可度: 網(wǎng)站在專業(yè)性方面是做得最好的,這一點非常值得贊賞。下一階段發(fā)展的潛力不可預(yù)估

    (本項評級:6)

    網(wǎng)站規(guī)模: 網(wǎng)站在規(guī)模方面是應(yīng)該稱道的,目前來說這一部分做得和專業(yè)程度相得益彰(本項評級:7)

    訪問量: 和網(wǎng)站規(guī)模比也還算可以了。由于站點的專業(yè)性,要有突破可能得靠吸引更多的忠實用戶了。(本項評級:7)

    線上宣傳:很顯然,網(wǎng)站宣傳方面您還有更多的潛力可挖,或許多做點交換鏈接吧,其他網(wǎng)站會愿意的。(本項評級:5)

    綜合實力: 恭喜您,您的網(wǎng)站和其他網(wǎng)站已經(jīng)有質(zhì)的區(qū)別了,以后的發(fā)展不可限量。

    發(fā)展小評: 一點小結(jié)論,您的網(wǎng)站各項指標我們覺得還是比較均衡。 發(fā)展很良好,請繼續(xù)保持吧。

    我們建議:您多注意一些線上宣傳,多和一些可信的站點做下鏈接吧,或者盡可能讓人引用您的內(nèi)容

    一下為網(wǎng)站架構(gòu):

    之前理想論壇有三臺服務(wù)器,兩臺WEB服務(wù)器以及一臺數(shù)據(jù)庫服務(wù)器,訪問已經(jīng)漸漸出現(xiàn)瓶頸,在豬頭的建議下,站長決定增加一臺服務(wù)器放數(shù)據(jù)庫,另外三臺做WEB,并且對原有的服務(wù)器的操作系統(tǒng)進行升級。

  • 詳細解釋


     硬件具體情況

    MySQL服務(wù)器: DualXeon 5335/8GB內(nèi)存/73G SAS硬盤(RAID0+1)/CentOS5.1-x86_64/MySQL5

    三臺WEB服務(wù)器如下:

    N1. Dual Xeon 3.0 2GB 內(nèi)存

    N1. Dual Xeon 3.0 4GB 內(nèi)存

    N1. Dual Xeon 3.0(雙核) 4G內(nèi)存

    另外有三塊300G的SCSI硬盤準備做RAID5,用來存放附件,四臺機器通過內(nèi)網(wǎng)連接

    豬頭考慮過的解決方案如下:

    1. ZEUS + PHP5 + eAccelerator

    2. squid + Apache2 + PHP + eAccelerator

    3. nginx + PHP(fastcgi) + eAccelerator

    4. nginx + Apache2 + PHP + eAccelerator

    第一個方案,屬于比較完美的,而且很穩(wěn)定,但是最大的問題是ZEUS是收費軟件,用盜版總會受良心責備的,所以暫時押后做候補方案

    第二個方案,squid轉(zhuǎn)發(fā)請求給Apache2,很多網(wǎng)站都采用這種方式,而且效率也非常高,豬頭也測試了一下,但是問題非常嚴重,因為squid是把文件緩存起來的,所以每一個訪問過的文件,squid都要把它打開,理想論壇擁有150G的附件,而且訪問量巨大,這種情況下只有打開squid,機器很快就會因為打開文件過多而拒絕響應(yīng)任何請求了,看來也不適合,只適合緩存文件只有幾百M以內(nèi)的網(wǎng)站.

    第三個方案,豬頭對第三個方案的測試結(jié)果是訪問量大的時候,PHP經(jīng)常會出現(xiàn)bad gateway,看來通過TCP連接Fastcgi執(zhí)行PHP的方法不夠穩(wěn)定,豬頭也測試了通過Unix Socket連接執(zhí)行PHP,同樣還是不穩(wěn)定.

    對比之下,豬頭目前使用了第四種解決方案.

    Apache2的安裝。

    (由于服務(wù)器采用FreeBSD7,所以大部分軟件將會通過ports安裝)

    由于Apache2只需要處理PHP請求,所以其他模塊基本上都不需要,所以不要選擇安裝其他模塊,即使rewrite也不需要,因為rewrite將會在nginx上面實現(xiàn),如果熟悉,還可以修改Makefile刪掉不需要的部分,這樣經(jīng)過優(yōu)化之后,apache將會以最穩(wěn)定最高效的方式處理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服務(wù)器不需要對外開放,僅僅處理nginx轉(zhuǎn)發(fā)過來的PHP請求,所以僅僅需要監(jiān)聽本地的端口.

    另外增加對PHP的支持

    AddType application/x-httpd-php .php

    AddType application/x-httpd-php-source .phps

    至于添加虛擬主機的部分將不再羅嗦,注意虛擬主機也監(jiān)聽本地81端口就可以了

    PHP5的安裝(GD庫等模塊請?zhí)崆把b好)

    cd /usr/ports/lang/php5

    修改一下Makefile,把需要的東西加上去吧

    本來應(yīng)該有這樣一段的

    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"

    建立緩存目錄以及修改權(quán)限

    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;

    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;

    index index.html index.htm index.php;

    root /home/www;

    access_log /dev/null combined;

    limit_conn one 5;#限制一個IP并發(fā)連接數(shù)為五個

    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規(guī)則,如果你的論壇在二級目錄下面,則要相應(yīng)修改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 ^/ http://www.55188.com/403.html;

    }

    }

    #轉(zhuǎn)發(fā)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

    都沒問題的話就啟動服務(wù)器吧

    /usr/local/sbin/apachectl start

    /usr/local/sbin/nginx -c /usr/local/etc/nginx/nginx.conf

    瀏覽一下主頁,應(yīng)該正常了

    后繼討論

    1.數(shù)據(jù)庫.

    數(shù)據(jù)庫的編譯安裝不再重復(fù)討論,僅僅討論環(huán)境,由于理想論壇的數(shù)據(jù)庫比較大,而且發(fā)展比較快,所以要作比較前一點的預(yù)算,硬盤需要使用15K RPM的SAS硬盤做RAID0+1,操作系統(tǒng)需要使用64位版本,因為服務(wù)器需要8GB內(nèi)存,要注意的時,使用了64位系統(tǒng)之后部分比較老的軟件可能你無法找到64位的版本,這臺機器就專門做MySQL服務(wù)器吧,如果數(shù)據(jù)庫超過10G,應(yīng)該考慮MySQL_Cluster

    2.附件.

    因為有三臺服務(wù)器做WEB,所以附件要使用nfs的方式通過內(nèi)網(wǎng)進行共享,至于如何設(shè)置nfs這里不再討論,如果有不明白的請將學(xué)費交給Google

    3.WEB.

    由于三臺機器硬件配置不一致,所以有必要考慮一下負載平衡的問題,nginx本身附帶有負載平衡的功能,但是如果啟用負載平衡的功能的話,每臺機器都將會把客戶端請求的數(shù)據(jù)緩存到本機,這樣增加了硬盤的IO,對于理想論壇的訪問量來說,這是個不小的開銷,最后我們是使用DNS查詢的方式來分配流量, 通過不同的A記錄,配置好點的機器,多分一條A記錄,配置差的就少一條A記錄,這樣從整體上看,流量分配應(yīng)該比較平衡.

    4.關(guān)于nginx并發(fā)連接

    豬頭給nginx限制了每個IP的并發(fā)連接,因為對于大論壇來說,總是比較出名的,不說人家攻擊你什么的.采集都特別多,如果不限制,很容易出問題,經(jīng)常會導(dǎo)致PHP罷工.

    以上只是豬頭愚見,如果有其他進展,豬頭會更新本貼,如有疑問或者不同見解,歡迎提出討論

    當然還有很多很瘋狂的方法,例如說把WEB文件(附件除外)全部放內(nèi)存里面,MYSQL如果小于5G,也可以全部放內(nèi)存里面,不過這些方法都是太極端的了,優(yōu)化效果須然好,但是風險很大。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    優(yōu)化之后的效果

    由于還有兩臺機器升級沒完成,只帖一下其中一臺WEB的狀況了。目前

    Active connections: 1143

    server accepts handled requests

    1211445 1211445 6221785

    Reading: 67 Writing: 136 Waiting: 940

    Apache最優(yōu)化要關(guān)閉不用的模塊,因為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這些應(yīng)該都關(guān)閉的,但是要做相應(yīng)的修改.目前跑起來絕對比Fastcgi要好