Web高併發解決方案

《手把手讓你實現開源企業級web高併發解決方案》
(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://freeze.blog.51cto.com/1846439/677348

本來想起個比較風趣點的標題,可想來思去,還是走常規路線,做一系列的手把手吧。
這樣一來,便於我的老朋友們識別,也讓我對這篇文章的粒度把我有個定位。
 
本篇博文主要介紹利用開源的解決方案,來爲企業搭建web高併發服務器架構花了一個多小時,畫了張圖片,希望能先幫你理解整個架構,之後我在一一介紹.linux的大型架構其實是一點點小架構拼接起來的,筆者從各個應用開始配置,最後在完全整合起來,以實現效果。
 

 

web開源高併發解決方案


筆者所使用的環境爲RHEL5.4 內核版本2.6.18 實現過程在虛擬機中,所用到的安裝包爲DVD光盤自帶rpm包

裝過 Development Libraries  Development Tools 包組 

 筆者虛擬機有限,只演示單邊varnish配置





 

一、配置前端LVS負載均衡

筆者選用LVS的DR模型來實現集羣架構,如果對DR模型不太了了解的朋友建議先去看看相關資料。 

本模型實例圖爲:

   現在director上安裝ipvsadm,筆者yum配置指向有集羣源所以直接用yum安裝。

yum install ipvsadm

下面是Director配置:

       DIP配置在接口上 172.16.100.10

        VIP配置在接口別名上:172.16.100.1

    varnish服務器配置:RIP配置在接口上:172.16.100.11 ;VIP配置在lo別名上

如果你要用到下面的heartbeat的ldirectord來實現資源轉換,則下面的# Director配置 不用配置

 

  1. # Director配置
  2. ifconfig eth0 172.16.100.10/16 
  3. ifconfig eth0:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up 
  4. route add -host 172.16.100.1 dev eth0:0 
  5. echo 1 > /proc/sys/net/ipv4/ip_forward 
  1. # varnish服務器修改內核參數來禁止響應對VIP的ARP廣播請求 
  2. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  3. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  4. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  5. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
  1. # 配置VIP 
  2. ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up 
  3. # 凡是到172.16.100.1主機的一律使用lo:0響應 
  4. route add -host 172.16.100.1 dev lo:0  
  1. # 在Director上配置Ipvs,筆者虛擬機有限,只演示單臺配置
  2. ipvsadm -A -t 172.16.100.1:80 -s wlc 
  3. ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2 
  4. ipvsadm -Ln 

 

至此,前端lvs負載均衡基本實現,下面配置高可用集羣




 PS:如果用ldirectord把lvs定義爲資源的話,前面

二、heartbeat高可用集羣

本應用模型圖:

高可用則是當主服務器出現故障,備用服務器會在最短時間內代替其地位,並且保證服務不間斷。

 簡單說明:從服務器和主服務器要有相同配置,才能在故障遷移時讓無界感受不到,從而保證服務不間斷運行。在你的兩臺機器(一臺 作爲主節點,另一臺爲從節點)上運行heartbeat, 並配置好相關的選項,最重要的是lvs資源一定要配置進去。那麼開始時主節點提供lvs服務,一旦主節點崩潰,那麼從節點立即接管lvs服務。

SO:

director主服務器和從服務器都有兩塊網卡,一塊eth0是和後面varnish服務器通信,另一塊eth1是彼此之間監聽心跳信息和故障遷移是資源轉移。筆者用的eth0是172.16.100.0網段 vip爲172.16.100.1 監聽心跳爲eth1網卡,主從的IP分別爲10.10.10.1(node1) 和10.10.10.2(node2)

 修改上面模型圖兩臺主從服務器的信息

  1. vim /etc/hosts 
  2. 10.10.10.1    node1.heartbeat.com         node1 
  3. 10.10.10.2    node2.heartbeat.com        node2 
  4. #用於實現兩臺director節點間域名解析,此操作node1、node2相同 
  1. vim /etc/sysconfig/network 
  2. #設置主機名 
  3. hostname node1.heartbeat.com  
  4. #修改主機名使之立即生效,node2也同樣修改爲node2.heartbeat.com

 爲了安全起見,node1和node2的通信需要加密進行

  1. ssh-keygen -t rsa 
  2. #生成密鑰 
  3. ssh-copy-id -i .ssh/id_rsa.pub root@node2.heartbeat.com
  4. #將公鑰複製給node2 
  5. ssh node2 -- ifconfig
  6. #執行命令測試,此時應該顯示node2的ip信息 

 準備工作完成,下面開始安裝heartbeat和ldirectord

所需要的安裝包爲

heartbeat安裝包

本人直接用yum來實現,能自動解決依賴關係node1和node2都需要安裝

  1. yum localinstall -y --nogpgcheck ./* 
  2. #安裝此目錄中的所有rpm包 

 安裝後配置:

  1. cd /usr/share/doc/heartbeat-2.1.4 
  2. cp authkeys /etc/ha.d/ 
  3. cp haresources /etc/ha.d/ 
  4. cp ha.cf /etc/ha.d/ 
  5. #拷貝heartbeat所需配置文件到指定目錄下 
  1. vim /etc/ha.d/ha.cf 
  2. bcast eth1 
  3. #定義心跳信息從那一塊網卡傳輸 
  4. node node1.heartbeat.com
  5. node node2.heartbeat.com
  6. #添加這兩行,用於指明心跳信號傳輸範圍 
  7. vim /etc/ha.d/authkeys 
  8. auth 2 
  9. 2 sha1 [鍵入隨機數] 
  10. chmod 400 authkeys 
  11. #保存退出並修改權限400 
  12. vim /etc/ha.d/haresource 
  13. node1.heartbeat.com         172.16.100.1/24/eth0/172.16.0.255 ldirectord::ldirectord.cf httpd
  14. #末行添加主節點域名,vip資源,廣播地址,ldirectord資源,以及用戶提供顯示錯誤頁面的httpd資源

同步配置文件到node2

  1. /usr/lib/heartbeat/ha_propagate 
  2. #腳本用來同步ha.cf和authkeys文件到node2 
  3. scp haresources node2:/etc/ha.d/ 
  4. #複製haresource到nod2 

 

 配置ldirectord,同步配置文件

  1. cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/ldirectord.cf 
  2. #複製ldirector的配置文件 

 內容如下配置

  1. checktimeout=5 
  2. #當DR收不到realserver的迴應,設定幾秒後判定realserver當機或掛掉了,預設5秒。 
  3. checkinterval=3 
  4. #查詢間隔,每個幾秒偵測一次realserver 
  5. autoreload=yes 
  6. #配置文件發生改變是否自動重讀 
  7. quiescent=yes 
  8. #靜態鏈接,yes:表示偵測realserver宕機,將其權值至零(如果開啓了persistent參數不要用yes);no:表示偵測到宕機realserver,隨即將其對應條目從ipvsadm中刪除。 
  9. virtual=172.16.100.1:80 
  10.         real=172.16.100.11:80 gate 4 
  11.         fallback=127.0.0.1:80 gate #realserver全部失敗,vip指向本機80端口。 
  12.         service=http 
  13.         request="test.html" #用於健康檢測的url,realserver的相對路徑爲var/www/html目錄
  14.         receive="ok"    #用於健康檢測的url包含的關鍵字 
  15.         scheduler=wlc 
  16.         #persistent=600 
  17.         #持久鏈接:表示600s之內同意ip將訪問同一臺realserver 
  18.         protocol=tcp 
  19.         checktype=negotiate 
  20.         #檢查類型:negotiate,表示DR發送請求,realserver恢復特定字符串才表示服務正常;connect,表示DR能夠連線realserver即正常。 
  21.         checkport=80 

啓動兩個節點上的heartbeat

  1. service heartbeat start 
  2. ssh node2 -- 'service heartbeat start' 
  3. #啓動兩節點heartbeat服務  

 啓動後查看/var/log/messages 可以看到啓動過程,並可以手動執行/usr/lib/heartbeat/下的hb_standby 來釋放資源hb_takeover來爭奪資源

還可以通過ipvsadm -Ln 在主節點上查看lvs的資源狀態

 

至此,帶狀態檢測的前端集羣已經佈置完畢,下面就是varnish緩存服務器和後端nginx的web應用配置

 

 

 


 


三:varnish緩存服務器

有些朋友可能對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設計架構.

 

    現在大多數網站都拋棄了 Apache,而選擇nginx是因爲前者能承受的併發連接相對較低;
拋棄了 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完全沒問題。


 可以去varnish的官網下載最新的源碼包,筆者爲了便於演示,就用rpm包了,(別鄙視我)

varnish官網地址:http://www.varnish-cache.org/

我下的是最新的varnish-release-3.0-1.noarch.rpm

先rpm -ivh varnish-release-3.0-1.noarch.rpm

它的作用是給你yum生成varnish的倉庫,然後你在用yum安裝varnish

yum install varnish

 

安裝好後配置文件爲/etc/default.vcl 

本人只實現基本功能,沒有對varnish做優化,所以配置比較簡單

 

配置完成後保存退出,需手動啓動

varnishd -f /etc/varnish/default.vcl -s malloc,128m -T 127.0.0.1:2000

-f etc/varnish/default.vcl     -f 指定varnishd使用哪個配置文件。

-s malloc,1G                                                -s用來指定varnish使用的存儲類型和存儲容量。我使用的是 malloc 類型(malloc 是一個 C 函數,用於分配內存空間),  1G  定義多少內存被 malloced。

-T 127.0.0.1:2000                                        -T 指定varnish的管理端口。Varnish有一個基於文本的管理接口,啓動它的話可以在不停止 varnish 的情況下來管理 varnish。您可以指定管理軟件監聽哪個接口。

-a 0.0.0.0:8080                                             指定varnish所監聽所有IP發給80的http請求。如果不指定-a ,則爲默認監聽0.0.0.0:

ps:先配置nginx在配置varnish可以直接測試效果,本人爲了演示架構層次,所以就一層一層的配置了,建議如果按我的順序做的話,後端web服務器先用yum裝上apache方便測試。varnish到此就配置成功。到此我在幫各位順一下思路

 

 

目前,如果你完全按照本文章做實驗,我們用了5臺服務器。

一臺director 它的vip爲172.16.100.1  DIP爲172.16.100.10

與它實現高可用的從服務器vip爲172.16.100.1 DIP爲 172.16.100.12 

而這兩臺服務器都裝的有heartbeat和ipvsadm 並通過ldirectord把VIP定義爲資源,會自動流動,和自動添加ipvsadm分發條目

在ipvsadm中 定義的有一臺varnish服務器 地址爲172.16.100.11

varnish緩存服務器在做反向代理時後端是兩臺web服務器分別爲web1和web2

IP分別爲172.16.100.15和172.16.100.17 下圖幫你順下思路

 

 

 


 


 


四:nginx服務器+php+eAccelerator

(1)編譯安裝PHP 5.3.6所需的支持庫:

  1. tar zxvf libiconv-1.13.1.tar.gz 
  2. cd libiconv-1.13.1/ 
  3. ./configure --prefix=/usr/local 
  4. make 
  5. make install 
  6. cd ../ 
  1. tar zxvf libmcrypt-2.5.8.tar.gz  
  2. cd libmcrypt-2.5.8/ 
  3. ./configure 
  4. make 
  5. make install 
  6. /sbin/ldconfig 
  7. cd libltdl/ 
  8. ./configure --enable-ltdl-install 
  9. make 
  10. make install 
  11. cd ../../ 
  1. tar zxvf mhash-0.9.9.9.tar.gz 
  2. cd mhash-0.9.9.9/ 
  3. ./configure 
  4. make 
  5. make install 
  6. cd ../ 
  1. ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la 
  2. ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so 
  3. ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4 
  4. ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8 
  5. ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a 
  6. ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la 
  7. ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so 
  8. ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2 
  9. ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1 
  10. ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config 
  1. tar zxvf mcrypt-2.6.8.tar.gz 
  2. cd mcrypt-2.6.8/ 
  3. /sbin/ldconfig 
  4. ./configure 
  5. make 
  6. make install 
  7. cd ../ 

 

  1. cd php-5.3.6

    ./configure --prefix=/usr/local/php-fcgi --enable-fpm --with-config-file-path=/usr/local/php-fcgi/etc --enable-zend-multibyte  --with-libxml-dir=/usr/local/libxml2 --with-gd --with-jpeg-dir --with-png-dir --with-bz2 --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-curl --with-mhash --with-openssl --enable-bcmath --with-mcrypt=/usr/local/libmcrypt --enable-sysvsem --enable-inline-optimization --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-debug --disable-ipv6

    make

    make install

    cp php.ini-production /usr/local/php-fcgi/etc/php.ini

    mkdir /usr/local/php-fcgi/ext



 編譯安裝PHP5擴展模塊

 





修改php.ini文件  手工修改: 查找/usr/local/php/etc/php.ini中的extension_dir = "./" 修改爲 extension_dir = "/usr/local/php-fcgi/lib/php/extensions/no-debug-non-zts-20090626" 增加以下幾行 extension = "memcache.so"  再查找output_buffering = Off 修改爲 On 再查找 ;cgi.fix_pathinfo=0 去掉“;”號,防止Nginx文件類型錯誤解析漏洞。  (6)配置eAccelerator加速PHP: mkdir -p /usr/local/eaccelerator_cache  vi /usr/local/php-fcgi/etc/php.ini  跳到配置文件的最末尾,加上以下配置信息: [eaccelerator] zend_extension="/usr/local/php-fcgi/lib/php/extensions/no-debug-non-zts-20090626eaccelerator.so" eaccelerator.shm_size="64" eaccelerator.cache_dir="/usr/local/eaccelerator_cache" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="3600" eaccelerator.shm_prune_period="3600" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9"

 創建www用戶和組,以及虛擬主機使用的目錄:

 

/usr/sbin/groupadd www /usr/sbin/useradd -g www www mkdir -p /web chmod +w /web chown -R www:www /web

 創建php-fpm配置文件

 

cd/usr/local/php-fcgi/etc/ cp php-fpm.conf.default php-fpm.conf vim !$ #取消下面3行前的分號 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35

啓動php-cgi進程,監聽127.0.0.1的9000端口,

ulimit -SHn 65535 /usr/local/php/sbin/php-fpm start

 安裝Nginx 1.1.3

(1)安裝Nginx所需的pcre庫:

tar zxvf pcre-8.10.tar.gz cd pcre-8.10/ ./configure make && make install cd ../

(2)安裝Nginx

tar zxvf nginx-1.1.3.tar.gz cd nginx-1.1.3/ ./configure --user=www \--group=www \--prefix=/usr/local/nginx \--with-http_stub_status_module \--with-http_ssl_module make && make install cd ../

(3)創建Nginx日誌目錄

mkdir -p /web/logs chmod +w /web/logs chown -R www:www /web/logs

(4)創建Nginx配置文件

在/usr/local/nginx/conf/目錄中創建nginx.conf文件:

rm -f /usr/local/nginx/conf/nginx.conf vi /usr/local/nginx/conf/nginx.conf

輸入以下內容:

 

user  www www;

worker_processes 8;  ## 根據自己的CPU來決定到底應該是多少
error_log  /web/logs/nginx_error.log  crit;
pid        /usr/local/nginx/nginx.pid;

#Specifies the value for maximum file descriptors that can be opened by this process. 
worker_rlimit_nofile 65535;

events 
{
  use epoll;
  worker_connections 65535;

http 
{
  include       mime.types;
  default_type  application/octet-stream;
  #charset  gb2312;  
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;

  client_max_body_size 8m;      
  sendfile on;
  tcp_nopush     on;

  keepalive_timeout 60;
  tcp_nodelay on; 

  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k; 

  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on; 

  #limit_zone  crawler  $binary_remote_addr  10m; 

  server
  {
    listen       80;
    server_name  192.168.0.156;  ## 這裏簡單測試,所以直接使用IP
    index index.html index.htm index.php;
    root  /web;

    #limit_conn   crawler  20;                                 

    location ~ .*\.(php|php5)?$
    {      
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }    

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
      expires      30d;
    } 

    location ~ .*\.(js|css)?$
    {
      expires      1h;
    }

    location /status {
    stub_status on;   ## 開啓狀態統計,爲後面的優化做測試
    }    

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';

    access_log  /web/logs/access.log  access;
   }
}

 

②、在/usr/local/nginx/conf/目錄中創建.conf文件:

vi /usr/local/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;

 

(5)啓動Nginx 

ulimit -SHn 65535 /usr/local/nginx/sbin/nginx

(6)配置開機自動啓動Nginx + PHP

vim /etc/rc.local

在末尾增加以下內容:

 

ulimit -SHn 65535
/usr/local/php/sbin/php-fpm start
/usr/local/nginx/sbin/nginx

 

 啓動後用瀏覽器測試,能出PHP則配置成功

 到這裏,前端的應用基本就算完成了,接下來就是數據庫了

 


 


 


五、mysql數據庫+memcached

 

數據庫框架

首先需要弄清一些概念

Memcache是什麼?
Memcache是一個自由和開放源代碼、高性能、分配的內存對象緩存系統。用於加速動態web應用程序,減輕數據庫負載。 
它可以應對任意多個連接,使用非阻塞的網絡IO。由於它的工作機制是在內存中開闢一塊空間,然後建立一個HashTable,Memcached自管理這些HashTable。
Memcached是簡單而強大的。它簡單的設計促進迅速部署,易於發展所面臨的問題,解決了很多大型數據緩存。它的API可供最流行的語言。
Memcache的知名用戶有:LiveJournal、Wikipedia、Flickr、Bebo、Twitter、Typepad、Yellowbot、Youtube 等。
Memcache官方網站:http://memcached.org/

Memcached又是什麼?
Memcache是該系統的項目名稱,Memcached是該系統的主程序文件,以守護程序方式運行於一個或多個服務器中,隨時接受客戶端的連接操作,使用共享內存存取數據。

那PHP中的Memcache是什麼?
php中的所講的memcache是用於連接Memecached的客戶端組件。

 

簡單的說一句話:Memcached 是一個服務(運行在服務器上的程序,監聽某個端口),Memcache 是 一套訪問Memcached的api。

兩者缺一不可,不然無法正常運行。Memcache能在多臺服務器上發揮很好的作用,同臺服務器上用APC或Xcache效率是很可觀的。

一、memcache

 

PHP 如何作爲 memcached 客戶端

有兩種方法可以使 PHP 作爲 memcached 客戶端,調用 memcached 的服務進行對象存取操作。

第一種,PHP 有一個叫做 memcache 的擴展,Linux  下編譯時需要帶上 –enable-memcache[=DIR] 選項,編譯完成後

並在php.ini配置文件中有這一項,而且庫文件也有此文件

extension = "memcache.so"

除此之外,還有一種方法,可以避開擴展、重新編譯所帶來的麻煩,那就是直接使用 php-memcached-client

 

 

 

二、memcached 服務端安裝

首先是下載 memcached 了,目前最新版本是 v1.4.8,直接從官方網站即可下載到除此之外,memcached  用到了 libevent

# tar -xzf libevent-1ast.1a.tar.gz # cd libevent-1.1a # ./configure --prefix=/usr # make # make install # cd .. # tar -xzf memcached-last.tar.gz # cd memcached# ./configure --prefix=/usr # make # make install

 

 安裝完成後需要啓動

memcached -d -m 50 -p 11211 -u root

參數說明:-m 指定使用多少兆的緩存空間;-p 指定要監聽的端口; -u 指定以哪個用戶來運行

接下來是要安裝php的memcache模塊與memcached通信修改php.ini

找到session.save_handler,並設爲 session.save_handler = memcache,把session.save_path前面的分號去掉,並設置爲 session.save_path = “tcp://127.0.0.1:11211″  session.save_handler = memcache session.save_path = “tcp://172.16.100.50:11211″   #memcached所在服務器地址或者某個目錄下的 .htaccess :  php_value session.save_handler “memcache” php_value session.save_path “tcp://172.16.100.50:11211″ #memcached所在服務器地址再或者在某個一個應用中:

修改完後,重啓php和nginx

之後編輯個測試頁面test.php


  1. <?php

  2. error_reporting(E_ALL); 

  3. $memcache = new Memcache; 

  4. $memcache->connect('172.16.100.17', 11211) or die("Could not connect"); 

  5.  

  6. $memcache->set('key', 'This is a test!', 0, 60); 

  7. $val = $memcache->get('key'); 

  8. echo $val; 

  9. ?>
     

 

通過web瀏覽器訪問成功圖示如下:

 

 至此,基本配置都已經完成,下面需要安裝出來mysql,整個架構就基本實現了。

筆者在這裏就不演示mysql的主主架構了,虛擬機真不夠用了。給出一個二進制mysql的教程。

綠色二進制包安裝MySQL 5.5.15

①:安裝過程

## 爲MySQL建立用戶和組 groupadd -g 3306 mysql useradd -g mysql -u 3306 -s /sbin/nologin -M mysql  ## 二進制安裝方式 tar xf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local ln -sv /usr/local/mysql-5.5.15-linux.2.6-i686 /usr/local/mysql  mkdir /mydata  ## 創建數據保存目錄 chown -R mysql:mysql /mydata/ cd /usr/local/mysql scripts/mysql_install_db --user=mysql --datadir=/mydata/data     chown -R root .  ## 加入啓動腳本 cp support-files/mysql.server /etc/init.d/mysqld chkconfig --add mysqld  ##修改配置文件 cp support-files/my-large.cnf /etc/my.cnf ## 加入mySQL命令export PATH=$PATH:/usr/local/mysql/bin ## 定義頭文件ln -sv /usr/local/mysql/include /usr/include/mysqlldconfig

②:配置過程

 

vim /etc/my.cnf
[mysqld]段內加入並修改以下兩處
datadir = /mydata/data
thread_concurrency 2 
   ## (併發線程數,一般是cpu核心的兩倍)

 

 

vim /etc/profile 在裏面加入:
PATH=$PATH:/usr/local/mysql/bin

 

 

vim /etc/ld.so.conf.d/mysql.conf 寫入
/usr/local/mysql/lib

 

③:啓用過程

service mysqld start cd /root/lnmp

 

輸入以下SQL語句,創建一個具有root權限的用戶(admin)和密碼(12345678):
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY '123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY '123';

 


PS:

php在編譯的時候要支持上mysql,如果是php和mysql分離開來,最好yum裝上php-mysql和mysql-devel包 然後再編譯帶上with-mysql

varnish在實現方向代理負載均衡的時候要定義爲組的結構,還要定義出動作的觸發條件。

memcached  的緩存對象要設置合理,不然反而會減慢效率。

nginx在優化時要結合機器的硬件,切勿網上直接copy。


另外附加一份優化的文檔,還望對各位有幫助:


(1)Nginx的優化 一般來說nginx 配置文件中對優化比較有作用的爲以下幾項: worker_processes 8; nginx 進程數,建議按照cpu 數目來指定,一般爲它的倍數。 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; 爲每個進程分配cpu,上例中將8 個進程分配到8 個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。 worker_rlimit_nofile 102400; 這個指令是指當一個nginx 進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx 進程數相除,但是nginx 分配請求並不是那麼均勻,所以最好與ulimit-n 的值保持一致。 use epoll; 使用epoll 的I/O 模型,這個不用說了吧。 worker_connections 102400; 每個進程允許的最多連接數, 理論上每臺nginx 服務器的最大連接數爲worker_processes*worker_connections。 keepalive_timeout 60; keepalive 超時時間。 client_header_buffer_size 4k; 客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求頭的大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。分頁大小可以用命令getconf PAGESIZE 取得。 open_file_cache max=102400 inactive=20s; 這個將爲打開文件指定緩存,默認是沒有啓用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時間文件沒被請求後刪除緩存。 open_file_cache_valid 30s; 這個是指多長時間檢查一次緩存的有效信息。 open_file_cache_min_uses 1; open_file_cache 指令中的inactive 參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive 時間內一次沒被使用,它將被移除。   (2)關於內核參數的優化:請修改文件/etc/sysctl.conf net.ipv4.tcp_max_tw_buckets = 6000 timewait 的數量,默認是180000。 net.ipv4.ip_local_port_range = 1024 65000 允許系統打開的端口範圍。 net.ipv4.tcp_tw_recycle = 1 啓用timewait 快速回收。 net.ipv4.tcp_tw_reuse = 1 開啓重用。允許將TIME-WAIT sockets 重新用於新的TCP 連接。 net.ipv4.tcp_syncookies = 1 開啓SYN Cookies,當出現SYN 等待隊列溢出時,啓用cookies 來處理。 net.core.somaxconn = 262144 web 應用中listen 函數的backlog 默認會給我們內核參數的net.core.somaxconn 限制到128,而nginx 定義的NGX_LISTEN_BACKLOG 默認爲511,所以有必要調整這個值。 net.core.netdev_max_backlog = 262144 每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。 net.ipv4.tcp_max_orphans = 262144 系統中最多有多少個TCP 套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被複位並打印出警告信息。這個限制僅僅是爲了防止簡單的DoS 攻擊,不能過分依靠它或者人爲地減小這個值,更應該增加這個值(如果增加了內存之後)。 net.ipv4.tcp_max_syn_backlog = 262144 記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有128M 內存的系統而言,缺省值是1024,小內存的系統則是128。 net.ipv4.tcp_timestamps = 0 時間戳可以避免序列號的卷繞。一個1Gbps 的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種&ldquo;異常&rdquo;的數據包。這裏需要將其關掉。 net.ipv4.tcp_synack_retries = 1 爲了打開對端的連接,內核需要發送一個SYN 並附帶一個迴應前面一個SYN 的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK 包的數量。 net.ipv4.tcp_syn_retries = 1 在內核放棄建立連接之前發送SYN 包的數量。 net.ipv4.tcp_fin_timeout = 1 如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2 狀態的時間。對端可以出錯並永遠不關閉連接,甚至意外當機。缺省值是60 秒。2.2 內核的通常值是180 秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB 服務器,也有因爲大量的死套接字而內存溢出的風險,FIN- WAIT-2 的危險性比FIN-WAIT-1 要小,因爲它最多隻能吃掉1.5K 內存,但是它們的生存期長些。 net.ipv4.tcp_keepalive_time = 30 當keepalive 起用的時候,TCP 發送keepalive 消息的頻度。缺省是2 小時。 (3)關於FastCGI 的幾個指令: fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; 這個指令爲FastCGI 緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。 fastcgi_connect_timeout 300; 指定連接到後端FastCGI 的超時時間。 fastcgi_send_timeout 300; 向FastCGI 傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI 傳送請求的超時時間。 fastcgi_read_timeout 300; 接收FastCGI 應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI 應答的超時時間。 fastcgi_buffer_size 4k; 指定讀取FastCGI 應答第一部分需要用多大的緩衝區,一般第一部分應答不會超過1k,由於頁面大小爲4k,所以這裏設置爲4k。 fastcgi_buffers 8 4k; 指定本地需要用多少和多大的緩衝區來緩衝FastCGI 的應答。 fastcgi_busy_buffers_size 8k; 這個指令我也不知道是做什麼用,只知道默認值是fastcgi_buffers 的兩倍。 fastcgi_temp_file_write_size 8k; 在寫入fastcgi_temp_path 時將用多大的數據塊,默認值是fastcgi_buffers 的兩倍。 fastcgi_cache TEST 開啓FastCGI 緩存並且爲其制定一個名稱。個人感覺開啓緩存非常有用,可以有效降低CPU 負載,並且防止502 錯誤。 fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301     1d; fastcgi_cache_valid any     1m; 爲指定的應答代碼指定緩存時間,如上例中將200,302 應答緩存一小時,301 應答緩存1 天,其他爲1 分鐘。 fastcgi_cache_min_uses 1; 緩存在fastcgi_cache_path 指令inactive 參數值時間內的最少使用次數,如上例,如果在5 分鐘內某文件1 次也沒有被使用,那麼這個文件將被移除。 fastcgi_cache_use_stale error timeout invalid_header http_500; 不知道這個參數的作用,猜想應該是讓nginx 知道哪些類型的緩存是沒用的。

 


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