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

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

 

此文凝聚筆者很多心血請尊重筆者勞動,轉載請註明出處。違法直接人肉出電話 寫大街上。php

http://freeze.blog.51cto.com/
我的小站剛上線css

http://www.linuxwind.comhtml

有問題還能夠來QQ羣89342115交流。前端

 


 

今兒網友朋友說:freeze黔驢技窮了,博客也不更新,也不跟網友互動了.java

.
..
...
那好吧,我就來一篇重量級的..這篇就叫作
《手把手讓你實現開源企業級web高併發解決方案》
(lvs+heartbeat + varnish+nginx+eAccelerator +memcached)
 
原本想起個比較風趣點的標題,可想來思去,仍是走常規路線,作一系列的手把手吧。
這樣一來,便於個人老朋友們識別,也讓我對這篇文章的粒度把我有個定位。
 
本篇博文主要介紹利用開源的解決方案,來爲企業搭建web高併發服務器架構花了一個多小時,畫了張圖片,但願能先幫你理解整個架構,以後我在一一介紹.linux的大型架構實際上是一點點小架構拼接起來的,筆者從各個應用開始配置,最後在徹底整合起來,以實現效果。
 

 

web開源高併發解決方案

 

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

裝過 Development Libraries  Development Tools 包組 mysql

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

 




 

1、配置前端LVS負載均衡nginx

筆者選用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: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:
  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: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 
  4. ipvsadm -Ln 

 

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




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

2、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節點間域名解析,此操做node一、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=
  2. #當DR收不到realserver的迴應,設定幾秒後斷定realserver當機或掛掉了,預設5秒。 
  3. checkinterval=
  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的理由有三點:
一、Varnish採用了「Visual Page Cache」技術,在內存的利用上,Varnish比Squid具備優點,它避免了Squid頻繁在內存、磁盤中交換文件,性能要比Squid高。
二、Varnish的穩定性還不錯,順便說一句,Varnish的性能的發揮關鍵在於Varnish配置文檔的優化.
三、經過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內的L一、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擴展模塊

 


  1. 修改php.ini文件 
  2.  
  3. 手工修改: 
  4. 查找/usr/local/php/etc/php.ini中的extension_dir = "./" 
  5. 修改成 
  6. extension_dir = "/usr/local/php-fcgi/lib/php/extensions/no-debug-non-zts-20090626" 
  7. 增長如下幾行 
  8. extension = "memcache.so" 
  9.  
  10. 再查找output_buffering = Off 修改成 On 
  11. 再查找 ;cgi.fix_pathinfo=0 去掉「;」號,防止Nginx文件類型錯誤解析漏洞。 

 

  1. (6)配置eAccelerator加速PHP: 
  2. mkdir -p /usr/local/eaccelerator_cache  
  3. vi /usr/local/php-fcgi/etc/php.ini  
  4. 跳到配置文件的最末尾,加上如下配置信息: 
  5. [eaccelerator] 
  6. zend_extension="/usr/local/php-fcgi/lib/php/extensions/no-debug-non-zts-20090626eaccelerator.so" 
  7. eaccelerator.shm_size="64" 
  8. eaccelerator.cache_dir="/usr/local/eaccelerator_cache" 
  9. eaccelerator.enable="1" 
  10. eaccelerator.optimizer="1" 
  11. eaccelerator.check_mtime="1" 
  12. eaccelerator.debug="0" 
  13. eaccelerator.filter="" 
  14. eaccelerator.shm_max="0" 
  15. eaccelerator.shm_ttl="3600" 
  16. eaccelerator.shm_prune_period="3600" 
  17. eaccelerator.shm_only="0" 
  18. eaccelerator.compress="1" 
  19. eaccelerator.compress_level="9"  

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

 

 

  1. /usr/sbin/groupadd www 
  2. /usr/sbin/useradd -g www www 
  3. mkdir -p /web 
  4. chmod +w /web 
  5. chown -R www:www /web 

 建立php-fpm配置文件

 

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

 

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

  1. ulimit -SHn 65535 
  2. /usr/local/php/sbin/php-fpm start 

 安裝Nginx 1.1.3

 

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

  1. tar zxvf pcre-8.10.tar.gz 
  2. cd pcre-8.10/ 
  3. ./configure 
  4. make && make install 
  5. cd ../ 

(2)安裝Nginx

  1. tar zxvf nginx-1.1.3.tar.gz 
  2. cd nginx-1.1.3/
  3.  
  4. ./configure --user=www \
  5. --group=www \
  6. --prefix=/usr/local/nginx \
  7. --with-http_stub_status_module \
  8. --with-http_ssl_module
  9.  
  10. make && make install 
  11. cd ../ 

(3)建立Nginx日誌目錄

  1. mkdir -p /web/logs 
  2. chmod +w /web/logs 
  3. chown -R www:www /web/logs 

(4)建立Nginx配置文件

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

  1. rm -f /usr/local/nginx/conf/nginx.conf 
  2. 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文件:

  1. 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 

  1. ulimit -SHn 65535 
  2. /usr/local/nginx/sbin/nginx 

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

  1. vim /etc/rc.local 

在末尾增長如下內容:

 

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

 

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

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

 


 


 


5、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效率是很可觀的。

1、memcache

 

PHP 如何做爲 memcached 客戶端

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

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

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

extension = "memcache.so"

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

 

 

 

2、memcached 服務端安裝

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

  1. # tar -xzf libevent-1ast.1a.tar.gz 
  2. # cd libevent-1.1a 
  3. # ./configure --prefix=/usr 
  4. # make 
  5. # make install 
  6. # cd .. 
  7. # tar -xzf memcached-last.tar.gz 
  8. # cd memcached
  9. # ./configure --prefix=/usr 
  10. # make 
  11. # make install 

 

 安裝完成後須要啓動

 

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

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

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

  1. 找到session.save_handler,並設爲 session.save_handler = memcache,把session.save_path前面的分號去掉,並設置爲 session.save_path = 「tcp://127.0.0.1:11211″ 
  2.  
  3. session.save_handler = memcache 
  4. session.save_path = 「tcp://172.16.100.50:11211″  #memcached所在服務器地址
  5. 或者某個目錄下的 .htaccess : 
  6.  
  7. php_value session.save_handler 「memcache」 
  8. php_value session.save_path 「tcp://172.16.100.50:11211″ #memcached所在服務器地址
  9. 再或者在某個一個應用中: 

修改完後,重啓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

①:安裝過程

  1. ## 爲MySQL創建用戶和組 
  2. groupadd -g 3306 mysql 
  3. useradd -g mysql -u 3306 -s /sbin/nologin -M mysql 
  4.  
  5. ## 二進制安裝方式 
  6. tar xf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local 
  7. ln -sv /usr/local/mysql-5.5.15-linux.2.6-i686 /usr/local/mysql 
  8.  
  9. mkdir /mydata  ## 建立數據保存目錄 
  10. chown -R mysql:mysql /mydata/ 
  11. cd /usr/local/mysql 
  12. scripts/mysql_install_db --user=mysql --datadir=/mydata/data     
  13. chown -R root . 
  14.  
  15. ## 加入啓動腳本 
  16. cp support-files/mysql.server /etc/init.d/mysqld 
  17. chkconfig --add mysqld 
  18.  
  19. ##修改配置文件 
  20. cp support-files/my-large.cnf /etc/my.cnf
  21.  
  22. ## 加入mySQL命令
  23. export PATH=$PATH:/usr/local/mysql/bin
  24.  
  25. ## 定義頭文件
  26. ln -sv /usr/local/mysql/include /usr/include/mysql
  27. ldconfig 

②:配置過程

 

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

 

③:啓用過程

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

 


寫了2天,終於完成這篇架構了,可能還有不少細節不夠完善,但主要展現的部分都已完成了,linux的精髓就是把不少小的軟件組合成一個龐大的項目,各盡其能。

感謝google,感謝馬哥,還應感謝反賊和遠颺博客中的一些思路。

有問題還望多多交流。

 

此文凝聚筆者很多心血請尊重筆者勞動,轉載請註明出處。違法直接人肉出電話 寫大街上。

http://freeze.blog.51cto.com/
我的小站剛上線

http://www.linuxwind.com

有問題還能夠來QQ羣89342115交流。

轉自:http://freeze.blog.51cto.com/1846439/684498

相關文章
相關標籤/搜索