您好,登錄后才能下訂單哦!
通過LAMP平臺部署及應用 已經可以部署出LAMP平臺,來面對客戶端的請求,但是由于這些組件都是在一臺服務器上進行安裝,如果出現問題,將導致LAMP平臺的癱瘓。在實際環境中,不可能將LAMP平臺都部署在同一臺服務器上,這就需要使用到LAMP動靜分離的技術。
博文大綱:
一、LAMP動靜分離的相關概念
1.PHP的工作模式
2.FastCGI模式的工作機制
二、實現LAMP動靜分離
1.FastCGI方式編譯安裝php
2.搭建Apache并配置通過fastcgi協議調用php
- 搭建Mysql數據庫
4.ab壓力測試工具
5.安裝php加速軟件Xcache
三、部署Discuz論壇
要想實現LAMP動靜分離,最主要的還是PHP,因為我們需要使用PHP解釋器來解析動態頁面,然后向Web服務器傳輸解析后的網站內容。我們下面重點介紹一下PHP。
PHP在在LAMP環境下共有三種工作模式:
首選客戶端發起請求,請求一般分為兩種:一種是靜態請求,可以直接由Apache響應直接返回客戶端所需資源;另一種動態請求,其中包含PHP或Perl這種腳本解釋型語言,則由Apache服務器通過fastcgi協議調用php服務器執行并返回給Apache,由Apache向客戶端返回客戶端所需資源,如果這個過程中涉及到對數據的操作,此時php服務器還會通過mysql協議調用mysql服務器。如圖:
案例所需:
獲取PHP所需軟件包
[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
配置選項相關解釋:
- --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 開始它就是默認設置
[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就會緩存動態頁面信息,實際環境中一般也使用不到,所以這里就略過了。
下載Discuz論壇程序
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服務器網頁根目錄
客戶端訪問測試
訪問論壇成功!
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。