架構 Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenC

說明:
       我在設計系統架構時,進行了大膽的嘗試,只用6臺Web服務器,達到了可承受4000萬PV(頁面訪問量)的性能:
  拋棄了 Apache,因爲它能承受的併發連接相對較低;
  拋棄了 Squid,因爲它在內存利用、訪問速度、併發連接、清除緩存等方面不如 Varnish;
  拋棄了 PHP4,因爲 PHP5 處理面向對象代碼的速度要比 PHP4 快,另外,PHP4 已經不再繼續開發;
  拋棄了 F5 BIG-IP 負載均衡交換機,F5 雖然是個好東西,但由於價格不菲,多個部門多個產品都運行在其之上,流量大、負載高,從而導致性能大打折扣;
  利用 Varnish cache 減少了90%的數據庫查詢,解決了MySQL數據庫瓶頸;
  利用 Varnish cache 的內存緩存命中加快了網頁的訪問速度;
  利用 Nginx + PHP5(FastCGI) 的勝過Apache 10倍的高併發性能,以最少的服務器數量解決了PHP動態程序訪問問題;
  利用 Memcached 處理實時數據讀寫;
  利用 HAProxy 做接口服務器健康檢查;
  經過壓力測試,每臺Web服務器能夠處理3萬併發連接數,承受4千萬PV完全沒問題。
  保證4千萬PV的併發連接數:(40000000PV / 86400秒 * 10個派生連接數 * 5秒內響應 * 5倍峯值) / 6臺Web服務器 = 19290連接數
實驗證明:   
    舉個簡單的例子,服務器192.168.0.2上運行Nginx+PHP,192.168.0.3上運行Apache+PHP,你在192.168.0.4上安裝壓力測試工具webbench,以30萬併發連接分別請求Nginx和Apache服務器上的一個PHP文件60秒鐘。在這期間,你用你的瀏覽器訪問Apache服務器上的PHP文件,會發現要麼是“該頁無法顯示”、要麼是等待好幾秒鐘才能打開,而Nginx服務器的PHP文件,依然沒有絲毫影響,訪問速度仍然飛快。
引用
webbench -c 300000 -t 60
http://192.168.0.2/index.p
...
webbench -c 300000 -t 60
http://192.168.0.3/index.p
...
以下爲 Nginx 0.5.33 + PHP 5.2.5 (FastCGI) 服務器在3萬併發連接下,開啓的10個Nginx進程和250個php-cgi進程時的系統負載情況:
安裝步驟:
  (系統要求:Linux 2.6+ 內核,本文中的Linux操作系統爲AS4.3)
  一、獲取相關開源程序:
  1、下載程序源碼包到當前目錄:
  本文中提到的所有開源軟件爲截止到2007年9月21日的最新穩定版。我將它們打了兩個壓縮包。
  第一個壓縮包:nginx_php_mysql_1.0_1of2.zip:
  下載地址:
http://ishare.iask.sina.co
...
  第二個壓縮包:nginx_php_mysql_1.0_2of2.zip:
  下載地址:
http://ishare.iask.sina.co
...
  2、解壓縮:
unzip nginx_php_mysql_1.0_1of2.zip
unzip nginx_php_mysql_1.0_2of2.zip
-------------------------------------------------------------------------
一、) 安裝Nginx
1.) 安裝
Nginx ("engine x") 是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 爲俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點運行超過兩年半了。Igor 將源代碼以類BSD許可證的形式發佈。儘管還是測試版,但是,Nginx 已經因爲它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名了。歡迎訪問 Nginx 的中文維基,http://wiki.codemongers.co...
2.)安裝Nginx所需的pcre庫:
引用
[root@localhost]#tar zxvf pcre-7.2.tar.gz
[root@localhost]#cd pcre-7.2/
[root@localhost]#./configure
[root@localhost]#make && make install
[root@localhost]#cd ../
3.)Nginx的編譯參數如下:
引用
[root@localhost]#./configure --user=www --group=www --prefix=/usr/local/nginx --with-openssl=/usr/include/openssl --with-pcre=/usr/local/lib --with-http_stub_status_module --without-http_memcached_module --without-http_fastcgi_module --without-http_rewrite_module --without-http_map_module --without-http_geo_module --without-http_autoindex_module   
在這裏,需要說明一下,由於Nginx的配置文件中我想用到正則,所以需要 pcre 模塊的支持。上面安裝步驟裏我已經安裝了 pcre 及 pcre-devel 的rpm包,但是 Ngxin 並不能正確找到 .h/.so/.a/.la 文件,因此我稍微變通了一下:
引用
[root@localhost]#mkdir /usr/include/pcre/.libs/
[root@localhost]#cp /usr/local/lib/libpcre.a /usr/include/pcre/.libs/libpcre.a
[root@localhost]#cp /usr/local/lib/libpcre.a /usr/include/pcre/.libs/libpcre.la
[root@localhost]#cp /usr/local/lib/libpcre.a /usr/include/pcre/libpcre.a
[root@localhost]#cp /usr/local/lib/libpcre.a /usr/include/pcre/libpcre.la
然後,修改 objs/Makefile 大概在908行的位置上,註釋掉以下內容:
引用
./configure --disable-shared
接下來,就可以正常執行 make 及 make install 了。
4.) 修改配置文件 /usr/local/server/nginx/conf/nginx.conf
以下是我的 nginx.conf 內容,僅供參考:
#運行用戶
user  nobody nobody;
#啓動進程
worker_processes  2;
#全局錯誤日誌及PID文件
error_log  logs/error.log notice;
pid        logs/nginx.pid;
#工作模式及連接數上限
events {
        use epoll;
        worker_connections      1024;
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
        #設定mime類型
        include       conf/mime.types;
        default_type  application/octet-stream;
        #設定日誌格式
        log_format main         '$remote_addr - $remote_user [$time_local] '
                                                '"$request" $status $bytes_sent '
                                                '"$http_referer" "$http_user_agent" '
                                                '"$gzip_ratio"';
        log_format download '$remote_addr - $remote_user [$time_local] '
                                                '"$request" $status $bytes_sent '
                                                '"$http_referer" "$http_user_agent" '
                                                '"$http_range" "$sent_http_content_range"';
        #設定請求緩衝
        client_header_buffer_size    1k;
        large_client_header_buffers  4 4k;
        #開啓gzip模塊
        gzip on;
        gzip_min_length  1100;
        gzip_buffers     4 8k;
        gzip_types       text/plain;
        output_buffers   1 32k;
        postpone_output  1460;
        #設定access log
        access_log  logs/access.log  main;
        client_header_timeout  3m;
        client_body_timeout    3m;
        send_timeout           3m;
        sendfile                on;
        tcp_nopush              on;
        tcp_nodelay             on;
        keepalive_timeout  65;
        #設定負載均衡的服務器列表
        upstream mysvr {
                #weigth參數表示權值,權值越高被分配到的機率越大
                #本機上的Squid開啓3128端口
                server 192.168.8.1:3128 weight=5;
                server 192.168.8.2:80   weight=1;
                server 192.168.8.3:80   weight=6;
        }
        #設定虛擬主機
        server {
                listen          80;
                server_name     192.168.0.1
www.test.com
;
                charset gb2312;
                #設定本虛擬主機的訪問日誌
                #access_log  logs/access.log  main;
                #如果訪問 /img/*, /js/*, /css/* 資源,則直接取本地文件,不通過squid
                #如果這些文件較多,不推薦這種方式,因爲通過squid的緩存效果更好
                location ~ ^/(img|js|css)/  {
                        root    /home/web;
                        expires 24h;
                }
                #對 "/" 啓用負載均衡
                location / {
                        proxy_pass      
http://mysvr
;
                        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;
                        client_max_body_size    10m;
                        client_body_buffer_size 128k;
                        proxy_connect_timeout   90;
                        proxy_send_timeout      90;
                        proxy_read_timeout      90;
                        proxy_buffer_size       4k;
                        proxy_buffers           4 32k;
                        proxy_busy_buffers_size 64k;
                        proxy_temp_file_write_size 64k;
                }
                #設定查看Nginx狀態的地址
                location /NginxStatus {
                        stub_status             on;
                        access_log              on;
                        auth_basic              "NginxStatus";
                        auth_basic_user_file  conf/htpasswd;
                }
        }
}
運行以下命令檢測配置文件是否無誤:
  如果沒有報錯,那麼就可以開始運行Nginx了,執行以下命令即可:
  備註:conf/htpasswd 文件的內容用 apache 提供的 htpasswd 工具來產生即可,內容大致如下:
5.) 查看 Nginx 運行狀態
輸入地址
http://192.168.0.1/NginxSt
...,輸入驗證帳號密碼,即可看到類似如下內容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324
這裏我是用虛擬機做的測試,所以鏈接數比較少.
  第一行表示目前活躍的連接數
  第三行的第三個數字表示Nginx運行到當前時間接受到的總請求數,如果快達到了上限,就需要加大上限值了。
top -b -nl
查看NGINX的進程號:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
6.)配置支持FCGI文件
引用
vi /usr/local/webserver/nginx/conf/fcgi.conf
輸入以下內容:
引用
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param  REDIRECT_STATUS    200;
7.)啓動Nginx
引用
文ulimit -SHn 51200
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
-------------------------------------------------------------------------
8.)配置開機自動啓動Nginx + PHP
vi /etc/rc.local
在末尾增加以下內容:
引用
/usr/local/php/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 250 -u www -f /usr/local/php/bin/php-cgi
ulimit -SHn 51200
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
-------------------------------------------------------------------------
二.) 安裝MYSQL
安裝mysql-5.0.45.tar.gz, 下面是總體的編譯文件
1. -static  13%
   --with-client-ldflags=-all-static
   --with-mysqld-ldflags=-all-static
靜態鏈接提高13%性能
2. -pgcc  1%
   CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc \
     CXXFLAGS="-O3 -mpentiumpro -mstack-align-double \
     -felide-constructors -fno-exceptions -fno-rtti"
如果是Inter處理器,使用pgcc提高1%性能
3. Unix Socket  7.5%
   --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
使用unix套接字鏈接提高7.5%性能,所以在windows下mysql性能肯定不如unix下面
4. --enable-assembler
允許使用匯編模式(優化性能)
引用
[root@localhost]#tar zxvf mysql-5.0.45.tar.gz
[root@localhost]#./configure --prefix=/usr/local/mysql/ --without-debug --with-unix-socket-path=/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --with-extra-charsets=gbk,gb2312,utf8 --with-pthread --enable-thread-safe-client
[root@localhost]#make -j 50 && make install
[root@localhost]#groupadd mysql           
[root@localhost]#useradd -g mysql mysql      
[root@localhost]#bin/mysql_install_db --user=mysql     
[root@localhost]#chown -R root  .         
[root@localhost]#chown -R mysql data      
[root@localhost]#chgrp -R mysql .      
[root@localhost]#bin/mysqld_safe --user=mysql &      
[root@localhost]#cd bin         
[root@localhost]#/usr/local/mysql/share/mysql/mysql.server stop   
[root@localhost]#cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
[root@localhost]#chmod 755 /etc/init.d/mysql
[root@localhost]#chkconfig --level 345 mysql on
-------------------------------------------------------------------------------------------------------------------------
三、)安裝PHP 5.2.5(FastCGI模式)
1、編譯安裝PHP 5.2.5所需的支持庫:
引用
[root@localhost]#tar zxvf libiconv-1.11.tar.gz
[root@localhost]#cd libiconv-1.11/
[root@localhost]#./configure --prefix=/usr/local/webserver/lib/libiconv
[root@localhost]#make && make install
[root@localhost]#cd ../
[root@localhost]#tar zxvf freetype-2.3.5.tar.gz
[root@localhost]#cd freetype-2.3.5/
[root@localhost]#./configure --prefix=/usr/local/webserver/lib/freetype
[root@localhost]#make && make install
[root@localhost]#cd ../
[root@localhost]#tar zxvf libpng-1.2.20.tar.gz
[root@localhost]#cd libpng-1.2.20/
[root@localhost]#./configure
[root@localhost]#make && make install
[root@localhost]#cd ../
[root@localhost]#tar zxvf jpegsrc.v6b.tar.gz
[root@localhost]#cd jpeg-6b/
[root@localhost]#./configure --enable-static --enable-shared
[root@localhost]#make && make install
[root@localhost]#cd ../
t[root@localhost]#ar zxvf gd-2.0.35.tar.gz
[root@localhost]#cd gd-2.0.35/
[root@localhost]#./configure --prefix=/usr/local/webserver/lib/gd --with-freetype=/usr/local/webserver/lib/freetype --with-jpeg --with-png
[root@localhost]#make
[root@localhost]#make install
[root@localhost]#cd ../
[root@localhost]#tar zxvf libxml2-sources-2.6.30.tar.gz
[root@localhost]#cd libxml2-2.6.30/
[root@localhost]#./configure --prefix=/usr/local/webserver/lib/libxml
[root@localhost]#make && make install
[root@localhost]#cd ../
-------------------------------------------------------------------------------------------------------------
2、編譯安裝PHP(FastCGI模式)
引用
[root@localhost]#tar zxvf php-5.2.4.tar.gz
[root@localhost]#cd php-5.2.4/
[root@localhost]#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-ftp --with-config-file-path=/usr/local/php --enable-zip --with-zlib --with-curl --without-iconv --with-iconv=/usr/local/lib --with-libxml-dir=/usr --enable-xml --with-xmlrpc --enable-mbregex-backtrack --with-gettext --with-gd=/usr/lib --enable-gd-native-ttf --with-ttf --enable-gd-jis-conv --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-freetype-dir=/usr/local/php/lib/freetype --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-force-cgi-redirect --enable-dom --enable-safe-mode --enable-discard-path --disable-debug --disable-rpath  --enable-bcmath --enable-shmop --enable-sysvsem --with-ldap --enable-sockets --enable-soap --enable-inline-optimization --enable-mbstring=all --with-ming=/usr --with-pdo-sqlite --enable-pdo --with-pdo-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config
[root@localhost]#cp php.ini-dist /usr/local/php/etc/php.ini
[root@localhost]#cd ../
-----------------------------------------------------------------------------------------------------------------
3.修改php.ini文件
  手工修改:查找/usr/local/php/etc/php.ini中的extension_dir = "./"
  修改爲extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
  並在此行後增加以下幾行,然後保存:
  extension = "memcache.so"
  extension = "gd.so"
4.自動修改:若嫌手工修改麻煩,可執行以下shell命令,自動完成對php.ini文件的修改:
引用
[root@localhost]sed -i 's#extension_dir = "./"#extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"\nextension = "memcache.so"\nextension = "gd.so"\n#' /usr/local/php/etc/php.ini
--------------------------------------------------------------------------------
5.附:編譯PHP之後,爲PHP添加擴展的方法。(本步驟可選)
引用
[root@localhost]#cd php-5.2.4/pcntl
[root@localhost]#/usr/local/php/bin/phpize
[root@localhost]#./configure --with-php-config=/usr/local/php/bin/php-config
[root@localhost]#make && make install
[root@localhost]#cd ../../../
[root@localhost]#cd php-5.2.5/ext/gd/     
[root@localhost]#/usr/local/php/bin/phpize      
[root@localhost]#./configure --with-jpeg-dir --with-png-dir --with-zlib-dir --with-ttf --with-freetype-dir --with-php-config=/usr/local/php/bin/php-config         
[root@localhost]#make -j 50      
[root@localhost]#make install
利用 Memcached 處理實時數據讀寫;MySQL是影響性能的最大瓶頸,可以用一臺MySQL主庫(只寫)+多臺MySQL輔庫(只讀)的主輔庫集羣來解決。另外,訪問計數等實時性很強的東西用Memcache做緩存。
     
引用
[root@localhost]#tar zxvf memcache-2.2.1.tgz     
[root@localhost]#cd memcache-2.2.1/      
[root@localhost]#/usr/local/php/bin/phpize     
[root@localhost]#./configure --with-php-config=/usr/local/php/bin/php-config
[root@localhost]#make -j 50      
[root@localhost]#make install
  
安裝支持MYSQL PDO驅動
引用
[root@localhost]#tar xzvf PDO-1\[1\].0.3.tgz                        
[root@localhost]#cd PDO-1.0.3/                                    
[root@localhost]#/usr/local/php/bin/phpize                          
[root@localhost]#./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql/   
[root@localhost]#make -j 50        
[root@localhost]#make install
-------------------------------------------------------------------------------------------------------------
6.安裝lighttpd中附帶的spawn-fcgi,用來啓動php-cgi
 注:壓縮包中的spawn-fcgi程序爲已經編譯成二進制的版本。
[root@localhost]#cp spawn-fcgi /usr/local//php/bin
[root@localhost]#chmod +x /usr/local/php/bin/spawn-fcgi
7、啓動php-cgi進程,監聽127.0.0.1的10080端口,進程數爲250(如果服務器內存小於3GB,可以只開啓25個進程),用戶爲www:
/usr/local/php/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 250 -u www -f /usr/local/php/bin/php-cgi
8.設定開機啓動
引用
[root@localhost]#echo "/usr/local/mysql/share/mysql/mysql.server start" >> /etc/rc.local
[root@localhost]#echo "/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf" >> /etc/rc.local
[root@localhost]#echo "/usr/local/php/bin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 250 -u www -f /usr/local/php/bin/php-cgi" >> /etc/rc.local
-------------------------------------------------------------------------
四、優化Linux內核參數
vi /etc/sysctl.conf
  在末尾增加以下內容:
引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000    65000
  使配置立即生效:
/sbin/sysctl -p
-----------------------------------------------------------------------------------------------------------------------
附:最近經常搞lighttpd+fastcgi+php或者nginx+fastcgi+php,時常被php的“No input file specified.”給鬱悶了,把我遇到的情況說一下
首先php.ini的配置中
cgi.fix_pathinfo=1
doc_root=
doc_root曾經被我設置過一個路徑,結果php老提示“No input file specified.”,只有一個虛擬機好使。改掉後就正常了。
nginx中的配置有些麻煩
fastcgi_pass 127.0.0.1:1234;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
每個虛機要根據自己不通的虛機設置不能的目錄,要保證這個路徑正確。
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;不能在fastcgi_pass 127.0.0.1:1234;的前面。
記得修改了php.ini要重啓fastcgi服務。
其實都是因爲粗心造成的,本來很簡單,寫出來也給自己提個醒
---------------------------------------------------------------------------------------------------------------------------
四.)安裝Varnish
     今天寫的這篇關於Varnish的文章,已經是一篇可以完全替代Squid做網站緩存加速器的詳細解決方案了。網上關於Varnish的資料很少,中文資料更是微乎其微,希望本文能夠吸引更多的人研究、使用Varnish。
  在我看來,使用Varnish代替Squid的理由有三點:
  1、Varnish採用了“Visual Page Cache”技術,在內存的利用上,Varnish比Squid具有優勢,它避免了Squid頻繁在內存、磁盤中交換文件,性能要比Squid高。
  2、Varnish的穩定性還不錯,順便說一句,Varnish的性能的發揮關鍵在於Varnish配置文檔的優化.
  3、通過Varnish管理端口,可以使用正則表達式快速、批量地清除部分緩存,這一點是Squid不能具備的
    4. 還有一點,應該算是Varnish的缺點了吧,就是Varnish的緩存基本上在內存中,如果Varnish進程停止再啓動,Varnish就會重新訪問後端Web服務器,再一次進行緩存.雖然Squid性能沒有Varnish高,但它停止、重啓的時候,可以直接先從磁盤讀取緩存數據。
    varnish是一款高性能的開源HTTP加速器,挪威最大的在線報紙 Verdens Gang (
http://www.vg.no
) 使用3臺Varnish代替了原來的12臺squid,性能比以前更好。
    varnish的作者Poul-Henning Kamp是FreeBSD的內核開發者之一,他認爲現在的計算機比起1975年已經複雜許多。在1975年時,儲存媒介只有兩種:內存與硬盤。但現在計算機系統的內存除了主存外,還包括了cpu內的L1、L2,甚至有L3快取。硬盤上也有自己的快取裝置,因此squid cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但操作系統可以得知這些情況,所以這部份的工作應該交給操作系統處理,這就是 Varnish cache設計架構.
------------------------------------------------------------------------------------------------------------------
1.編譯安裝varnish:
下載源碼包鏈接:  wget
http://nchc.dl.sourceforge
...
附1:Varnish官方網站:
http://www.varnish-cache.o
...
[root@localhost]#wget
http://blog.s135.com/soft/
...
[root@localhost]#tar zxvf varnish-1.1.2.tar.gz
[root@localhost]#cd varnish-1.1.2
[root@localhost]#./configure --prefix=/usr/local/varnish --enable-debugging-symbols --enable-developer-warnings --enable-dependency-tracking
[root@localhost]#make && make install
2.創建www用戶和組,以及Varnish緩存文件存放目錄(/var/vcache):
[root@localhost]#/usr/sbin/groupadd www
[root@localhost]#/usr/sbin/useradd -g www www
[root@localhost]#mkdir -p  /usr/local/varnish/var/varnish/
[root@localhost]#chmod +w  /usr/local/varnish/var/varnish/
[root@localhost]#chown -R www:www  /usr/local/varnish/var/varnish/
3.創建Varnish日誌目錄(/usr/local/varnish/logs):
[root@localhost]#mkdir -p /usr/local/varnish/logs
[root@localhost]#chmod +w /usr/local/varnish/logs
[root@localhost]#chown -R www:www /usr/local/varnish/logs
[root@localhost]#touch /usr/local/varnish/logs/varnish.log
4.創建Varnish配置文件:
[root@localhost]#vi /usr/local/varnish/vcl.conf
backend myblogserver {
       set backend.host = "192.168.0.1";
       set backend.port = "80";
}
acl purge {
       "localhost";
       "127.0.0.1";
       "192.168.0.0"/24;
       "192.168.1.0"/24;
}
sub vcl_recv {
       if (req.request == "PURGE") {
               if (!client.ip ~ purge) {
                       error 405 "Not allowed.";
               }
               lookup;
       }
       if (req.http.host ~ "^www.test.com") {
               set req.backend = myblogserver;
               if (req.request != "GET" && req.request != "HEAD") {
                       pipe;
               }
               else {
                       lookup;
               }
       }
       else {
               error 404 "Zhang Quan Sheng Cache Server";
               lookup;
       }
}
sub vcl_hit {
       if (req.request == "PURGE") {
               set obj.ttl = 0s;
               error 200 "Purged.";
       }
}
sub vcl_miss {
       if (req.request == "PURGE") {
               error 404 "Not in cache.";
       }
}
sub vcl_fetch {
       if (req.request == "GET" && req.url ~ "\.(txt|js)$") {
               set obj.ttl = 3600s;
       }
       else {
               set obj.ttl = 30d;
       }
}
  這裏,我對這段配置文件解釋一下:
  (1)、Varnish通過反向代理請求後端IP爲192.168.0.1,端口爲80的web服務器;
  (2)、Varnish允許localhost、127.0.0.1、192.168.0.***三個來源IP通過PURGE方法清除緩存;
  (3)、Varnish對域名爲
www.test.com
的請求進行處理,非
www.test.com
域名的請求則返回"Zhang Quan Sheng Cache Server";
  (4)、Varnish對HTTP協議中的GET、HEAD請求進行緩存,對POST請求透過,讓其直接訪問後端Web服務器。之所以這樣配置,是因爲POST請求一般是發送數據給服務器的,需要服務器接收、處理,所以不緩存;
  (5)、Varnish對以.txt和.js結尾的URL緩存時間設置1小時,對其他的URL緩存時間設置爲30天。
-------------------------------------------------------------------------------------------------------------------------
5、啓動Varnish
ulimit -SHn 51200l
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file, /usr/local/varnish/var/varnish/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
6.啓動varnishncsa用來將Varnish訪問日誌寫入日誌文件:
/usr/local/varnish/bin/varnishncsa -n /usr/local/varnish/var/varnish/ -w  /usr/local/varnish/var/varnish/varnish.log &
7.配置開機自動啓動Varnish
vi /etc/rc.local
ulimit -SHn 51200l
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file, /usr/local/varnish/var/varnish/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
/usr/local/varnish/bin/varnishncsa -n /usr/local/varnish/var/varnish/ -w  /usr/local/varnish/var/varnish/varnish.log &
8.優化Linux內核參數
vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000    65000
---------------------------------------------------------------------------------------------------------------------------
再看看如何管理Varnish:
1.查看Varnish服務器連接數與命中率:
/usr/local/varnish/bin/varnishstat
2.通過Varnish管理端口進行管理:
 用help看看可以使用哪些Varnish命令:
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help
Available commands:
ping [timestamp]
status
start
stop
stats
vcl.load
vcl.inline
vcl.use
vcl.discard
vcl.list
vcl.show
param.show [-l] []
param.set
help [command]
url.purge
dump.pool
3、通過Varnish管理端口,使用正則表達式批量清除緩存:
  (1)、例:清除類似
http://www.k18.com/a/quans
...的URL地址):
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/
  (2)、例:清除類似
http://blog.s135.com/tech
的URL地址:
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$
  (3)、例:清除所有緩存:
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
 4、一個清除Squid緩存的PHP函數(清除Varnish緩存同樣可以使用該函數,無需作任何修改,十分方便):
function purge($ip, $url)  
{  
    $errstr = '';  
    $errno = '';  
    $fp = fsockopen ($ip, 80, $errno, $errstr, 2);  
    if (!$fp)  
    {  
         return false;  
    }  
    else
    {  
        $out = "PURGE $url HTTP/1.1\r\n";  
        $out .= "Host:blog.s135.com\r\n";  
        $out .= "Connection: close\r\n\r\n";  
        fputs ($fp, $out);  
        $out = fgets($fp , 4096);  
        fclose ($fp);  
        return true;  
    }  
}  
purge("192.168.0.4", "/index.php");  
?>
附2:2007年12月10日,我寫了一個每天0點運行,按天切割Varnish日誌,生成一個壓縮文件,同時刪除上個月舊日誌的腳本
(/usr/local/varnish/var/varnish/cutlog.sh):
 /usr/local/varnish/var/varnish/cutlog.sh文件內容如下:
#!/bin/sh
# This file run at 00:00
date=$(date -d "yesterday" +"%Y-%m-%d")
pkill -9 varnishncsa
mv /usr/local/varnish/var/varnish/youvideo.log /usr/local/varnish/var/varnish/${date}.log
/usr/local/varnish/bin/varnishncsa -n /usr/local/varnish/var/varnish/ -w /usr/local/varnish/var/varnish/youvideo.log &
mkdir -p /usr/local/varnish/var/varnish/youvideo/
gzip -c /usr/local/varnish/var/varnish/${date}.log > /usr/local/varnish/var/varnish/${date}.log.gz
rm -f /usr/local/varnish/var/varnish/${date}.log
rm -f /usr/local/varnish/var/varnish/youvideo/$(date -d "-1 month" +"%Y-%m*").log.gz
  設置在每天00:00定時執行:
  
/usr/bin/crontab -e
  或者  
vi /var/spool/cron/root
  輸入以下內容:
引用
0 0 * * * /bin/sh /usr/local/varnish/var/varnish/cutlog.sh
--------------------------------------------------------------------------------------------------------------------------
附3.TCP連接數Varnish要比Squid少,因爲Varnish的TCP連接釋放要比Squid快。
但同時處理的請求數Varnish要比Squid高一些,一臺Varnish、另一臺Squid,分給它們的連接
數相同,Varnish實時處理的請求數比Squid多1倍,平均處理的請求數也比Squid多100餘個:
/usr/local/webserver/varnish/bin/varnishstat
-----------------------------------------------------------
   70979868       580.97       356.55 Client requests received
   70897998       580.97       356.14 Cache hits
/usr/local/squid/bin/squidclient -p 80 mgr:5min
-----------------------------------------------------------
client_http.requests = 248.425264/sec
client_http.hits = 245.135282/sec
如果正常的話,vcache這個目錄裏只有一個大小爲1G的文件:varnish_cache.data
---------------------------------------------------------------------------------------------------------------------------
五.)Memcachedb
Memcachedb:編譯以及安裝
說明: memcachedb跟memcache一樣,網絡socket數據處理依賴於libevent,所以,在安裝之前需要下載三個安裝包,即libevent、Berkeley Db以及memcachedb。
Libevent 下載頁面:
http://monkey.org/~provos/
... ,下載最新穩定版本就行。
Berkeley Db下載頁面:
http://www.oracle.com/tech
... 需要安裝4.6版本
memcachedb下載頁面:
http://code.google.com/p/m
...下載最新版本 0.1.0版本
按照順序安裝,Libevent和Berkeley Db按照常規安裝即可,這裏以Linux 環境爲標準。
[======Libevent=====]
[root@localhost]#tar -zxvf libevent-1.3e.tar.gz
[root@localhost]#cd libevent-1.3e
[root@localhost]#./configure
[root@localhost]#make && make install
[======Berkeley Db=====]
[root@localhost]#tar -zxvf db-4.6.19.tar.gz
#需要進入特定操作系統編譯環境,更常規軟件的編譯有些區別
[root@localhost]#cd db-4.6.19/build_unix/
#然後才能夠開始編譯
[root@localhost]#../dist/configure
[root@localhost]#make && make install
#如果沒有指定特殊安裝路徑,編譯完成,需要將Berkeley Db運行庫的路徑添加到系統配置裏面
[root@localhost]#echo "/usr/local/BerkeleyDB.4.6/lib/" >> /etc/ld.so.conf
#重載系統Ld運行庫
[root@localhost]#ldconfig
[======Memcachedb=====]
[root@localhost]#tar -zxvf memcachedb-0.1.0.tar.gz
[root@localhost]#cd memcachedb-0.1.0
#如果您要存儲的內容的鍵值的長度和單筆內容的長度有變化,您需要更改一個文件 memcachedb.h
[root@localhost]#vi memcachedb.h
////////////////////////////////////////////////////////////
#define END_LEN 32               ----> 這是是 Key+Value 的最大長度
#define END_LEN_STR "31"     ----> 這是是 key 的最大長度
/////////////////////////////////////////////////////////
#默認key鍵值只預留了31個字節的長度,單筆數據最長是32個字節數。
#例如您如果需要用這個玩藝來存儲文本內容數據,假設您的鍵值是一個32個字節的md5,單筆數據允許最長10K,那您可以設定
////////////////////////////////////////////////////////////
#define END_LEN 102400             ----> 這是是 Key+Value 的最大長度
#define END_LEN_STR "32"           ----> 這是是key的最大長度
/////////////////////////////////////////////////////////
#修改完之後,直接make就行
[root@localhost]#make
#編譯完之後,將生成可執行memcachedb拷貝到 /usr/sbin/
[root@localhost]#cp -f memcachedb  /usr/sbin/
#啓動 memcachedb
#第一種,讀寫合併模式,即不做輔拷貝,即讀又寫,不做冗餘備份
[root@localhost]#memcachedb -p21211 -d -r -u root -H  /data/mdb_11211  -N
#第二種,讀寫分離/備份模式
#主服務器 192.168.0.1 讀寫監聽 11211 ,同步通過31211的端口完成,不佔用繁忙的主服務端口
[root@localhost]#memcachedb -p21211 -d -r -u root -H  /data/mdb_11211_m -N -R 127.0.0.1:31211 -M
# 輔服務器 192.168.0.2  只讀監聽 21212,從192.168.0.1 的 31211端口同步數據,同時再開一個31212端口對外提供數據同步服務
[root@localhost]#memcachedb -p21212 -d -r -u root -H  /data/mdb_11211_from_16801_s -O 192.168.0.1:31211 -R 192.168.0.2:31212 -S
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章