此文凝聚筆者很多心血請尊重筆者勞動,轉載請註明出處。違法直接人肉出電話 寫大街上。php
http://freeze.blog.51cto.com/
我的小站剛上線css
http://www.linuxwind.comhtml
有問題還能夠來QQ羣89342115交流。前端
今兒網友朋友說:freeze黔驢技窮了,博客也不更新,也不跟網友互動了.java
.
..
...
那好吧,我就來一篇重量級的..這篇就叫作
(lvs+heartbeat
+
varnish+nginx+eAccelerator
+memcached)
原本想起個比較風趣點的標題,可想來思去,仍是走常規路線,作一系列的手把手吧。
這樣一來,便於個人老朋友們識別,也讓我對這篇文章的粒度把我有個定位。
本篇博文主要介紹利用開源的解決方案,來爲企業搭建web高併發服務器架構花了一個多小時,畫了張圖片,但願能先幫你理解整個架構,以後我在一一介紹.linux的大型架構實際上是一點點小架構拼接起來的,筆者從各個應用開始配置,最後在徹底整合起來,以實現效果。

筆者所使用的環境爲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配置 不用配置
- # Director配置
- ifconfig eth0 172.16.100.10/16
- ifconfig eth0:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
- route add -host 172.16.100.1 dev eth0:0
- echo 1 > /proc/sys/net/ipv4/ip_forward
- echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
- echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
- echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
- echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- ifconfig lo:0 172.16.100.1 broadcast 172.16.100.1 netmask 255.255.255.255 up
- route add -host 172.16.100.1 dev lo:0
- ipvsadm -A -t 172.16.100.1:80 -s wlc
- ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2
- 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)
修改上面模型圖兩臺主從服務器的信息
- vim /etc/hosts
- 10.10.10.1 node1.heartbeat.com node1
- 10.10.10.2 node2.heartbeat.com node2
- vim /etc/sysconfig/network
- hostname node1.heartbeat.com
爲了安全起見,node1和node2的通訊須要加密進行
- ssh-keygen -t rsa
- ssh-copy-id -i .ssh/id_rsa.pub root@node2.heartbeat.com
- ssh node2 -- ifconfig
準備工做完成,下面開始安裝heartbeat和ldirectord
所須要的安裝包爲

本人直接用yum來實現,能自動解決依賴關係 ,node1和node2都須要安裝
- yum localinstall -y --nogpgcheck ./*
安裝後配置:
- cd /usr/share/doc/heartbeat-2.1.4
- cp authkeys /etc/ha.d/
- cp haresources /etc/ha.d/
- cp ha.cf /etc/ha.d/
- #拷貝heartbeat所需配置文件到指定目錄下
- vim /etc/ha.d/ha.cf
- bcast eth1
- node node1.heartbeat.com
- node node2.heartbeat.com
- vim /etc/ha.d/authkeys
- auth 2
- 2 sha1 [鍵入隨機數]
- chmod 400 authkeys
- vim /etc/ha.d/haresource
- node1.heartbeat.com 172.16.100.1/24/eth0/172.16.0.255 ldirectord::ldirectord.cf httpd
同步配置文件到node2
- /usr/lib/heartbeat/ha_propagate
- scp haresources node2:/etc/ha.d/
配置ldirectord,同步配置文件
- cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/ldirectord.cf
- #複製ldirector的配置文件
內容以下配置
- checktimeout=5
- #當DR收不到realserver的迴應,設定幾秒後斷定realserver當機或掛掉了,預設5秒。
- checkinterval=3
- #查詢間隔,每一個幾秒偵測一次realserver
- autoreload=yes
- #配置文件發生改變是否自動重讀
- quiescent=yes
- #靜態連接,yes:表示偵測realserver宕機,將其權值至零(若是開啓了persistent參數不要用yes);no:表示偵測到宕機realserver,隨即將其對應條目從ipvsadm中刪除。
- virtual=172.16.100.1:80
- real=172.16.100.11:80 gate 4
- fallback=127.0.0.1:80 gate #realserver所有失敗,vip指向本機80端口。
- service=http
- request="test.html" #用於健康檢測的url,realserver的相對路徑爲var/www/html目錄
- receive="ok" #用於健康檢測的url包含的關鍵字
- scheduler=wlc
- #persistent=600
- #持久連接:表示600s以內贊成ip將訪問同一臺realserver
- protocol=tcp
- checktype=negotiate
- #檢查類型:negotiate,表示DR發送請求,realserver恢復特定字符串才表示服務正常;connect,表示DR可以連線realserver即正常。
- checkport=80
啓動兩個節點上的heartbeat
- service heartbeat start
- ssh node2 -- 'service heartbeat start'
- #啓動兩節點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所需的支持庫:
- tar zxvf libiconv-1.13.1.tar.gz
- cd libiconv-1.13.1/
- ./configure --prefix=/usr/local
- make
- make install
- cd ../
- tar zxvf libmcrypt-2.5.8.tar.gz
- cd libmcrypt-2.5.8/
- ./configure
- make
- make install
- /sbin/ldconfig
- cd libltdl/
- ./configure --enable-ltdl-install
- make
- make install
- cd ../../
- tar zxvf mhash-0.9.9.9.tar.gz
- cd mhash-0.9.9.9/
- ./configure
- make
- make install
- cd ../
- ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
- ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
- ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
- ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib/libmcrypt.so.4.4.8
- ln -s /usr/local/lib/libmhash.a /usr/lib/libmhash.a
- ln -s /usr/local/lib/libmhash.la /usr/lib/libmhash.la
- ln -s /usr/local/lib/libmhash.so /usr/lib/libmhash.so
- ln -s /usr/local/lib/libmhash.so.2 /usr/lib/libmhash.so.2
- ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib/libmhash.so.2.0.1
- ln -s /usr/local/bin/libmcrypt-config /usr/bin/libmcrypt-config
- tar zxvf mcrypt-2.6.8.tar.gz
- cd mcrypt-2.6.8/
- /sbin/ldconfig
- ./configure
- make
- make install
- cd ../
-
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則配置成功

到這裏,前端的應用基本就算完成了,接下來就是數據庫了
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,

- # 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
- <?php
- error_reporting(E_ALL);
- $memcache = new Memcache;
- $memcache->connect('172.16.100.17', 11211) or die("Could not connect");
-
- $memcache->set('key', 'This is a test!', 0, 60);
- $val = $memcache->get('key');
- echo $val;
- ?>
經過web瀏覽器訪問成功圖示以下:

至此,基本配置都已經完成,下面須要安裝出來mysql,整個架構就基本實現了。
筆者在這裏就不演示mysql的主主架構了,虛擬機真不夠用了。給出一個二進制mysql的教程。
綠色二進制包安裝MySQL 5.5.15
①:安裝過程
- 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/mysql
- 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 |
③:啓用過程
- 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 的鏈路確定會遇到之前用過的序列號。時間戳可以讓內核接受這種「異常」的數據包。這裏須要將其關掉。
- 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 知道哪些類型的緩存是沒用的。
寫了2天,終於完成這篇架構了,可能還有不少細節不夠完善,但主要展現的部分都已完成了,linux的精髓就是把不少小的軟件組合成一個龐大的項目,各盡其能。
感謝google,感謝馬哥,還應感謝反賊和遠颺博客中的一些思路。
有問題還望多多交流。
此文凝聚筆者很多心血請尊重筆者勞動,轉載請註明出處。違法直接人肉出電話 寫大街上。
http://freeze.blog.51cto.com/
我的小站剛上線
http://www.linuxwind.com
有問題還能夠來QQ羣89342115交流。
轉自:http://freeze.blog.51cto.com/1846439/684498