經過LAMP平臺部署及應用 已經能夠部署出LAMP平臺,來面對客戶端的請求,可是因爲這些組件都是在一臺服務器上進行安裝,若是出現問題,將致使LAMP平臺的癱瘓。在實際環境中,不可能將LAMP平臺都部署在同一臺服務器上,這就須要使用到LAMP動靜分離的技術。php
博文大綱:
1、LAMP動靜分離的相關概念
1.PHP的工做模式
2.FastCGI模式的工做機制
2、實現LAMP動靜分離
1.FastCGI方式編譯安裝php
2.搭建Apache並配置經過fastcgi協議調用phphtml
- 搭建Mysql數據庫
4.ab壓力測試工具
5.安裝php加速軟件Xcache
3、部署Discuz論壇
要想實現LAMP動靜分離,最主要的仍是PHP,由於咱們須要使用PHP解釋器來解析動態頁面,而後向Web服務器傳輸解析後的網站內容。咱們下面重點介紹一下PHP。mysql
PHP在在LAMP環境下共有三種工做模式:web
首選客戶端發起請求,請求通常分爲兩種:一種是靜態請求,能夠直接由Apache響應直接返回客戶端所需資源;另外一種動態請求,其中包含PHP或Perl這種腳本解釋型語言,則由Apache服務器經過fastcgi協議調用php服務器執行並返回給Apache,由Apache向客戶端返回客戶端所需資源,若是這個過程當中涉及到對數據的操做,此時php服務器還會經過mysql協議調用mysql服務器。如圖:sql
案例所需:數據庫
獲取PHP所需軟件包apache
[root@localhost ~]# yum -y install libxml2-devel lzip2-devel libcurl-devel \ libmcrypt-devel openssl-devel bzip2-devel //安裝PHP程序所須要的依賴包 [root@localhost ~]# tar zxf libmcrypt-2.5.7.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/libmcrypt-2.5.7/ [root@localhost libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install //編譯安裝 libmcrypt 軟件包
[root@localhost ~]# tar zxf php-5.6.27.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/php-5.6.27/ [root@localhost php-5.6.27]# ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd \ --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets \ --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib \ --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt \ --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d \ --with-bz2 --enable-maintainer-zts && make && make install
配置選項相關解釋:vim
- --prefix=/usr/local/php5.6 //指定安裝位置;
- --with-mysql=mysqlnd //安裝鏈接mysql工具支持 mysql;
- --with-pdo-mysql=mysqlnd //支持Mysql pdo 模塊
- --with-mysqli=mysqlnd //支持 mysqli 模塊
注意:上面的三選項的做用:數據庫與 php 不在一個服務器上,指定此種方式,安裝數據庫 鏈接驅動;- --with-openssl //支持 openssl 模塊;
- --enable-fpm //支持 fpm 模式;
- --enable-sockets //啓用 socket 支持;
- --enable-sysvshm //啓用系統共享內存支持;
- --enable-mbstring //多字節字串、像咱們的中文就是多字節字串;
- --with-freetype-dir //支持 freetype、就要裝 freetype-devel、跟字體相關的、字體解析工具 --with-jpeg-dir --with-png-dir;
注意:上面的二選項的做用:處理 jpeg、png 圖片的、php 能夠動態生成 jpeg 圖片;- --with-zlib //是個壓縮庫、在互聯網傳輸時用來壓縮傳輸的;
- --with-libxml-dir=/usr //這個 libxml 是用來解析 xml 的;
- --enable-xml //支持 xml ;
- --with-mhash //支持 mhash;
- --with-mcrypt=/usr/local/libmcrypt //libmcrypt-devel 這個程序包所指定的;
- --with-config-file-path=/etc //指定配置文件的存放路徑;
- --with-config-file-scan-dir=/etc/php.d //配置文件掃描路徑;
- --with-bz2 //支持 BZip2 爲了支持 apache 的 worker 或 event 這兩個 MPM,編譯時使用了--enable-maintainer-zts 選項
若是使用 PHP5.3 以上版本,爲了連接 MySQL 數據庫,能夠指定 mysqlnd,這樣在本機就不須要先安裝 MySQL 或 MySQL 開發包了。mysqlnd 從 php 5.3 開始可用,能夠編譯時綁定到它 (而不用和具體的 MySQL 客戶端庫綁定造成依賴),但從 PHP 5.4 開始它就是默認設置api
[root@localhost ~]# cp /usr/src/php-5.6.27/php.ini-production /etc/php.ini //複製源碼包下的配置文件生成php的配置文件
[root@localhost ~]# cp /usr/src/php-5.6.27/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm //複製源碼包下的啓動腳本 [root@localhost ~]# chmod +x /etc/init.d/php-fpm [root@localhost ~]# chkconfig --add php-fpm //添加爲系統服務,如今還不能夠啓動,由於還沒生成php服務器的配置文件
[root@localhost ~]# cd /usr/local/php5.6/etc/ [root@localhost etc]# cp php-fpm.conf.default php-fpm.conf //本來安裝完成的後配置文件不生效,因此須要更名(這是php-fpm的配置文件) [root@localhost etc]# sed -i 's#;pid = run/php-fpm.pid#pid = run/php-fpm.pid#g' php-fpm.conf //指定pid文件存放位置 [root@localhost etc]# sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/g' php-fpm.conf //修改監聽地址爲所有監聽 [root@localhost etc]# sed -i 's/pm.max_children = 5/pm.max_children = 50/g' php-fpm.conf //修改最大啓動的子進程數爲50 [root@localhost etc]# sed -i 's/pm.start_servers = 2/pm.start_servers = 5/g' php-fpm.conf //修改初始啓動進程數爲5 [root@localhost etc]# sed -i 's/pm.min_spare_servers = 1/pm.min_spare_servers = 5/g' php-fpm.conf //修改最小空閒子進程數爲5 [root@localhost etc]# sed -i 's/pm.max_spare_servers = 3/pm.max_spare_servers = 35/g' php-fpm.conf //修改最大空閒子進程爲35 [root@localhost ~]# systemctl start php-fpm //啓動php服務 [root@localhost ~]# netstat -anpt | grep 9000 //肯定9000在監聽 tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 45563/php-fpm: mast
若是防火牆是開啓的狀態,須要進行如下操做:瀏覽器
[root@localhost ~]# firewall-cmd --permanent --add-port=9000/tcp [root@localhost ~]# firewall-cmd --reload //容許TCP9000訪問,重載以當即生效 [root@localhost ~]# mkdir -p /var/www/benet //在該主機上新鍵虛擬主機目錄用於存放網頁文件
參考安裝Apache 進行安裝Apache,這裏就略過了,Apache安裝完成以後,須要進行如下操做!
自從Apache 2.4之後已經專門有一個模塊對FastCGI的實現,此模塊爲mod_proxy_fcgi.so,它實際上是做爲mod_proxy.so模塊的擴充,所以如下兩個模塊須要被加載:
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_module modules/mod_proxy.so
操做以下:
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf //編輯httpd的主配置文件 …………………… //省略部份內容 # LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so # LoadModule proxy_module modules/mod_proxy.so //去除模塊前面的「#」號,啓用模塊 #Include conf/extra/httpd-vhosts.conf //去除「#」號,啓用虛擬主機配置文件 定位到AddType:添加如下一行: AddType application/x-httpd-php .php //讓apache能識別php格式的頁面 定位到如下內容: <IfModule dir_module> DirectoryIndex index.php index.html //在index.html前面添加index.php </IfModule> [root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf //編輯Apache的虛擬主機配置文件,修改成如下內容: <VirtualHost *:80> ServerAdmin admin@admin.com DocumentRoot "/var/www/benet" ServerName www.benet.com ServerAlias www.benet.com ErrorLog "logs/benet-error_log" CustomLog "logs/benet-access_log" common ProxyRequests Off //關閉正向代理 ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.1.3:9000/var/www/benet/$1 <Directory "/var/www/benet"> Options FollowSymLinks //禁止目錄遍歷 AllowOverride None //容許請求爲空 Require all granted //容許全部客戶端訪問 </Directory> </VirtualHost> [root@localhost ~]# mkdir -p /var/www/benet [root@localhost ~]# systemctl restart httpd //建立虛擬目錄以後,重啓httpd服務
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.1.3:9000/var/www/benet/$1 //把以.php 結尾的文件請求發送到 php-fpm 進程,php-fpm 至少須要知道運 行的目錄和 URI,因此這裏直接在 fcgi://192.168.1.3:9000 後指明瞭這兩個參數,其它的參數的傳遞已經被 mod_proxy_fcgi.so 進行了封裝,不須要手動指定。 特別注意的是,IP地址後面的目錄路徑須要與<VirtualHost> 中的 DocumentRoot 後的路徑一致 。ProxyPassMatch 只有知足特定正則模式的內容纔會匹配並執行此規則,這裏的模式是,^/(.*\.php(/.*)?)$ 從網站(虛擬主機<VirtualHost> 的根目錄開始,匹配任何以 .php 結尾,或者在 .php 以後 緊跟一個 / 再跟別的內容的路徑。 ^ (caret) 和 $ (dollar)標誌要匹配的路徑的開始和結束 ( )括號裏的內容能夠用 $1 來表示,以方便後面引用它。 fcgi:// 192.168.1.3:9000 經過 mod_proxy_fcgi 來轉發的代理,使用 fastCGI 協議,轉到 PHP-FPM 監聽的端口。 /path/to/your/documentroot/ 很是重要!必須與虛擬主機的路徑匹配,且必須是對應 php 文件在操做系統中的絕對路徑。 不然會找不到文件。 $1 能夠從原始請求擴展成整個請求路徑的變量,這裏指代前面( ) 裏面匹配的那個路徑(uri)
注意:Apache httpd 2.4 之前的版本中,要麼把 PHP 做爲 Apache 的模塊運行,要麼添加一個第 三方模塊支持 PHP-FPM 實現。
在php服務器上建立測試網頁:
[root@localhost ~]# cat /var/www/benet/index.php <?php phpinfo(); ?>
訪問效果以下:
安裝這樣頁面,就表示Apache已經能夠和php協同工做了
以上是利用Apache的虛擬主機來調用php-fpm進行工做,其實Apache自己就能夠調用php-fpm,無需建立虛擬主機。
因爲編譯安裝Mysql數據庫須要很長的時間,本人提供Mysql安裝腳本及安裝所需軟件 一分鐘安裝完成(mysql數據庫的帳號root默認的密碼是123)!
安裝完成以後,進行如下操做:
[root@localhost ~]# mysql -u root -p123 mysql> grant all on *.* to lzj@'192.168.1.%' identified by '123456'; //建立數據庫用戶並進行受權 mysql> exit
在php服務器填寫測試腳本:
[root@localhost ~]# cat /var/www/benet/test.php <?php $link=mysql_connect('192.168.1.2','lzj','123456'); if($link) echo "恭喜你,數據庫鏈接成功!!!"; else echo "connect shibai"; mysql_close($link); ?>
訪問進行測試:
看到這個頁面就表示Apache、PHP、Mysql能夠協同工做了!
網絡性能壓力測試是服務器網站性能調優過程當中必不可缺乏的一環。只有當服務器處在高壓的狀況下,才能體現出軟件、硬件等各類設置不當所暴露的問題。
性能測試工具比較經常使用的就是:ab、http_load、webbench、siege。本篇博文只介紹ab工具。
ab是Apache自帶的壓力測試工具。ab很是實用,它不只能夠對apache服務器進行網站訪問壓力測試,也能夠對其餘類型的服務器進行壓力測試。好比:Nginx、Tomcat、IIS等。
ab命令會建立多個併發訪問線程,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基於URL的,所以,它既能夠測試Apache的負載壓力,也能夠測試Nginx、Tomcat、IIS等其餘Web服務器的壓力。
ab命令對發出負載的計算機要求很低,它既不會佔用很高的CPU,也不會佔用不少內存。但卻會給目標服務器形成巨大的負載。進行測試時,須要格外注意,不然可能一次性測試太多的負載,可能形成目標服務器資源耗盡,嚴重致使死機。
ab的安裝很是簡單,若是是源碼包進行安裝Apache的話,Apache安裝完畢後,ab就存放在Apache安裝目錄的bin目錄下;
若是是使用yum的方式安裝Apache的話,ab命令默認存放在/usr/bin目錄下;
注意:若是不想安裝Apache又想使用ab命令的話,就須要使用yum的方式安裝httpd-tools。
查看ab是否安裝成功,能夠進行如下測試:
這是因爲安裝openssl時指定的庫位置出現錯誤。
若是出現上述狀況,解決方法以下:
[root@localhost ~]# export LD_LIBRARY_PATH=/usr/local/openssl/lib/ //將所需模塊所在路徑導出爲環境變量 [root@localhost ~]# /usr/local/http-2.4.23/bin/ab -V //這樣就能夠正常使用 This is ApacheBench, Version 2.3 <$Revision: 1748469 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/
ab命令經常使用的參數有兩個:
[root@localhost ~]# cat /var/www/benet/index.html iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii //建立Apache的首頁文件 [root@localhost ~]# ab -c 500 -n 10000 http://192.168.1.1/index.html //對192.168.1.1的Web服務器進行測試 This is ApacheBench, Version 2.3 <$Revision: 1748469 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.1.1 (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Completed 10000 requests Finished 10000 requests Server Software: Apache/2.4.23 Server Hostname: 192.168.1.1 Server Port: 80 Document Path: /index.html //請求的資源名稱 Document Length: 34 bytes //響應數據的正文長度 Concurrency Level: 500 //併發個數 Time taken for tests: 1.727 seconds //處理這些請求所花費的時間 Complete requests: 10000 //成功請求完成的次數 Failed requests: 0 //失敗的請求次數 Total transferred: 2780000 bytes //全部請求的響應數據長度總和 HTML transferred: 340000 bytes //請求的正文數據總和 Requests per second: 5788.87 [#/sec] (mean) //吞吐量-每秒請求數(計算公式:請求的次數/用戶等待時間)吞吐量越大越好 Time per request: 86.373 [ms] (mean) //用戶平均等待時間(計算方式:用戶等待時間/(請求的次數/併發)) Time per request: 0.173 [ms] (mean, across all concurrent requests) //服務器平均等待時間(計算方式:用戶等待時間/完成請求的次數) Transfer rate: 1571.59 [Kbytes/sec] received //用戶請求的數據大小(計算方式:數據總長度/用戶等待時間) Connection Times (ms) min mean[+/-sd] median max Connect: 0 24 138.0 4 1034 Processing: 8 50 93.8 16 822 Waiting: 0 47 93.2 13 816 Total: 12 74 168.7 20 1255 Percentage of the requests served within a certain time (ms) 50% 20 66% 25 75% 31 80% 39 90% 222 95% 250 98% 832 99% 1050 100% 1255 (longest request) //這部分數據用於描述每一個請求處理時間的分佈狀況
在進行性能測試過程當中有幾個指標比較重要:
1.吞吐量:服務器併發處理能力的量化描述。指的是在某個併發用戶數下單位時間內處理的請求數。某個併發用戶數下單位時間內能處理的最大請求數,稱之爲最大吞吐量。
注意:吞吐量是基於併發用戶數的。這句話的含義:
2.併發鏈接數:併發鏈接數指的是某個時刻服務器所接收的請求數目,簡單的講,就是一個會話。
3.併發用戶數:一個用戶能夠同時會產生一個會話或多個會話,也就是鏈接數;
4.用戶平均等待時間:計算公式:處理完成全部請求數所花費的時間/(總請求數/併發用戶數);
5.服務器平均等待時間:計算公式:處理完成多有請求數所花費的時間/總請求數。也就是吞吐量的倒數。同時也就是用戶平均等待時間/併發用戶數。
如下操做均在php服務器上完成。
下載Xcache軟件
[root@localhost ~]# tar zxf xcache-3.2.0.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/xcache-3.2.0/ [root@localhost xcache-3.2.0]# /usr/local/php5.6/bin/phpize Configuring for: //須要使用phpize命令來生成configure配置文件 PHP Api Version: 20131106 Zend Module Api No: 20131226 Zend Extension Api No: 220131226 [root@localhost xcache-3.2.0]# ./configure --enable-xcache --enable-xcache-coverager \ --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config && make && make install //編譯安裝以後,這條路徑相當重要: Installing shared extensions: /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/
編譯配置參數詳解:
[root@localhost ~]# touch /tmp/xcache [root@localhost ~]# chmod 777 /tmp/xcache
[root@localhost ~]# cp -r /usr/src/xcache-3.2.0/htdocs/ /var/www/benet/xcache //以便使用web頁面進行訪問,查看效果
[root@localhost ~]# vim /etc/php.ini //編輯php的配置文件 //在末尾添加如下內容 [xcache-common] extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so //啓用php的xcache擴展功能 [xcache.admin] xcache.admin.enable_auth = Off //關閉xcache認證 [xcache] xcache.shm_scheme ="mmap" //決定xcache如何從系統共享內存 //nmap是一種內存映射文件的方法 xcache.size=60M //所用共享緩存的大小,若是設置爲0,將沒法使用 xcache.count =1 //將cache切分紅多少塊,建議設置爲cpu數 xcache.slots =8K //指做爲hash槽個數的參考值 xcache.ttl=0 //文件生存時間,設置爲0將無限緩存 xcache.gc_interval =0 //觸發垃圾回收的時間間隔,默認爲0秒 xcache.var_size=64M //針對變量的緩存 xcache.var_count =1 xcache.var_slots =8K xcache.var_ttl=0 xcache.var_maxttl=0 xcache.var_gc_interval =300 xcache.test =Off //關閉測試功能 xcache.readonly_protection = Off //啓動會下降性能,可是略微提升安全性 xcache.mmap_path ="/tmp/xcache" //用於只讀文件路徑 xcache.coredump_directory ="" //在遇到故障時,放置核心轉儲功能,必須是php可寫入的目錄,保留爲空表示禁用 xcache.cacher =On //使用opcode緩存,xcache.size=0時無效 xcache.stat=On //使用stat發現檢查腳本的更新 xcache.optimizer =Off //禁用優化 [xcache.coverager] xcache.coverager =On //啓用代碼覆蓋信息採集器 xcache.coveragedump_directory ="" //放置數據採集信息的目錄位置,默認使用目錄/tmp/pcovis [root@localhost ~]# scp -r /var/www/benet/xcache/ 192.168.1.1:/var/www/benet //將xcache網頁文件複製到Apache服務器網頁根目錄 [root@localhost ~]# systemctl restart php-fpm //從新啓動php
客戶使用瀏覽器進行訪問測試:
若是如今對動態頁面進行壓力測試,此時xcache就會緩存動態頁面信息,實際環境中通常也使用不到,因此這裏就略過了。
php服務器進行如下操做:
[root@localhost ~]# unzip Discuz_7.0.0_FULL_SC_UTF8.zip -d discus //將Discuz軟件程序解壓到discus目錄 [root@localhost ~]# mv discus/Discuz_7.0.0_FULL_SC_UTF8/upload/ /var/www/benet/bbs //將Discuz程序中的upload移動到網站跟目錄下 [root@localhost ~]# chown -R nobody:nobody /var/www/benet/bbs/ [root@localhost ~]# chmod -R 777 /var/www/benet/bbs/ //將目錄設置權限(測試環境賦予最大權限) [root@localhost ~]# sed -i 's/short_open_tag = Off/short_open_tag = On/g' /etc/php.ini //修改php服務器的配置文件 [root@localhost ~]# systemctl restart php-fpm //重啓php-fpm [root@localhost ~]# echo "/var/www/benet 192.168.1.0/24(rw,sec=sys,sync,no_root_squash)" >> /etc/exports [root@localhost ~]# systemctl restart nfs [root@localhost ~]# showmount -e Export list for localhost.localdomain: /var/www/benet 192.168.1.0/24 //配置nfs服務,並重啓nfs服務
Mysql服務器進行如下操做:
[root@localhost ~]# mysql -u root -p123 //登陸Mysql服務器 mysql> create database bbs; //建立bbs數據庫
Apache服務器進行如下操做:
[root@localhost ~]# mount -t nfs 192.168.1.3:/var/www/benet/ /var/www/benet //將php服務器的網頁根目錄複製到Apache服務器網頁根目錄
客戶端訪問測試
訪問論壇成功!
———————— 本文至此結束,感謝閱讀 ————————