說明:
我在設計系統架構時,進行了大膽的嘗試,只用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
架構 Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenC
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.