第十八章 lamp架構

18.1 lamp簡介

  有了前面學習的知識的鋪墊,今天可以來學習下第一個常用的web架構了。

  所謂lamp,其實就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一組動態網站或者服務器的開源軟件,除Linux外其它各部件本身都是各自獨立的程序,但是因爲經常被放在一起使用,擁有了越來越高的兼容度,共同組成了一個強大的Web應用程序平臺。


  LAMP指的是Linux(操作系統)、Apache(HTTP服務器)、MySQL(也指MariaDB,數據庫軟件)和PHP(有時也是指Perl或Python)的第一個字母,一般用來建立web應用平臺


18.2 Web服務器工作流程

  在說lamp架構平臺的搭建前,我們先來了解下什麼是CGI,什麼是FastCGI,什麼是......


  web服務器的資源分爲兩種,靜態資源和動態資源。

  所謂靜態資源就是指靜態內容,客戶端從服務器獲得的資源的表現形式與原文件相同。可以簡單的理解爲就是直接存儲於文件系統中的資源

  動態資源則通常是程序文件,需要在服務器執行之後,將執行的結果返回給客戶端。


  那麼web服務器如何執行程序並將結果返回給客戶端呢?下面通過一張圖來說明一下web服務器如何處理客戶端的請求

wKiom1ldsGqRlk_KAACp_UaOlp4828.png

  如上圖所示

  階段①顯示的是httpd服務器(即apache)和php服務器通過FastCGI協議進行通信,且php作爲獨立的服務進程運行

  階段②顯示的是php程序和mysql數據庫間通過mysql協議進行通信。php與mysql本沒有什麼聯繫,但是由Php語言寫成的程序可以與mysql進行數據交互。同理perl和python寫的程序也可以與mysql數據庫進行交互


18.2.1 cgi與fastcgi

  上圖階段①中提到了FastCGI,下面我們來了解下CGI與FastCGI。

  

  CGI(Common Gateway Interface,通用網關接口),CGI是外部應用程序(CGI程序)與WEB服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的過程。CGI規範允許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器,CGI將web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。

  

  FastCGI(Fast Common Gateway Interface)是CGI的改良版,CGI是通過啓用一個解釋器進程來處理每個請求,耗時且耗資源,而FastCGI則是通過master-worker形式來處理每個請求,即啓動一個master主進程,然後根據配置啓動幾個worker進程,當請求進來時,master會從worker進程中選擇一個去處理請求,這樣就避免了重複的生成和殺死進程帶來的頻繁cpu上下文切換而導致耗時


18.2.2 httpd與php結合的方式

  httpd與php結合的方式有以下三種:

  a) modules:php將以httpd的擴展模塊形式存在,需要加載動態資源時,httpd可以直接通過php模塊來加工資源並返回給客戶端

    httpd prefork:libphp5.so(多進程模型的php)

    httpd event or worker:libphp5-zts.so(線程模型的php)

  b) CGI:httpd需要加載動態資源時,通過CGI與php解釋器聯繫,獲得php執行的結果,此時httpd負責與php連接的建立和斷開等

  c) FastCGI:利用php-fpm機制,啓動爲服務進程,php自行運行爲一個服務,https通過socket與php通信


  較於CGI方式,FastCGI更爲常用,很少有人使用CGI方式來加載動態資源


18.2.3 web工作流程

  下面來通過上面的圖說明一下web的工作流程

  客戶端通過http協議請求web服務器資源,web資源收到請求後判斷客戶端請求的資源是靜態資源或是動態資源,若是靜態資源則直接從本地文件系統取之返回給客戶端。否則若爲動態資源則通過FastCGI協議與php服務器聯繫,通過CGI程序的master進程調度worker進程來執行程序以獲得客戶端請求的動態資源,並將執行的結果通過FastCGI協議返回給httpd服務器,httpd服務器收到php的執行結果後將其封裝爲http響應報文響應給客戶端。在執行程序獲取動態資源時若需要獲得數據庫中的資源時,由Php服務器通過mysql協議與MySQL/MariaDB服務器交互,取之而後返回給httpd,httpd將從php服務器收到的執行結果封裝成http響應報文響應給客戶端。


18.3 lamp平臺構建

18.3.1 通過yum安裝方式構建lamp平臺

  CentOS7下構建lamp:

  要安裝的程序包:httpd,php,php-mysql,mariadb-server

  注意:php要求httpd使用prefork MPM

yum -y install httpd php php-mysql mariadb-server
systemctl start httpd.service
systemctl start mariadb.service


  CentOS6下構建lamp:

  要安裝的程序包:httpd,php,php-mysql,mysql-server

yum -y install httpd php php-mysql mysql-server
service httpd start
service mysqld start



18.3.2 編譯安裝lamp

  http對fastcgi協議的支持

  a) httpd-2.2:需要額外安裝fastcgi模塊

wget https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.bz2
tar xf mod_fcgid-2.3.9.tar.bz2
cd mod_fcgid-2.3.9
./configure.apxs
make
make install

  b) httpd-2.4:自帶fastcgi模塊


  安裝次序:httpd,MariaDB,php

  安裝httpd-2.2:

cd /usr/src
wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.2.32.tar.bz2
tar xf httpd-2.2.32.tar.bz2
cd httpd-2.2.32
./configure --prefix=/usr/local/httpd
make
make install
echo 'PATH=/usr/local/httpd/bin:$PATH' > /etc/profile.d/httpd.sh
source /etc/profile.d/httpd.sh
ln -s /usr/local/httpd/include/ /usr/include/httpd
echo 'MANPATH /usr/local/httpd/man' >> /etc/man.config
apachectl start

  

  安裝MariaDB:

cd /usr/src
wget http://ftpmirror.gnu.org/gcc/gcc-5.2.0/gcc-5.2.0.tar.bz2
tar xf gcc-5.2.0.tar.bz2
cd gcc-5.2.0
./contrib/download_prerequisites
yum -y install gcc-c++ glibc-static gcc

./configure --prefix=/usr/local/gcc  --enable-bootstrap  --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j $(cat /proc/cpuinfo |grep 'processor'|wc -l)
make install

echo 'export PATH=/usr/local/gcc/bin:$PATH' > /etc/profile.d/gcc.sh
. /etc/profile.d/gcc.sh
ln -sv /usr/local/gcc/include/ /usr/include/gcc
echo '/usr/local/gcc/lib64' > /etc/ld.so.conf.d/gcc.conf
echo '/usr/local/gcc/lib' >> /etc/ld.so.conf.d/gcc.conf
ldconfig -p |grep gcc  #驗證是否導出頭文件

cd /usr/src
yum install -y ncurses-devel openssl-devel openssl cmake mysql-devel
wget 
 
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 mysql
mkdir -pv /data/mydata
chown -R mysql.mysql /data/mydata

tar xf mariadb-10.2.6.tar.gz
cd mariadb-10.2.6
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mydata \
-DSYSCONFDIR=/etc  \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 -DWITH_SSL=system \
-DWITH_ZLIB=system -DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make -j $(cat /proc/cpuinfo |grep 'processor'|wc -l)
make install


  cmake參數說明:

# 安裝根目錄
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql

# 數據存儲目錄
-DMYSQL_DATADIR=/data/mydata

# UNIX socket文件
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock

# 配置文件(my.cnf)目錄
-DSYSCONFDIR=/etc

# 默認字符集
-DDEFAULT_CHARSET=utf8

# 默認字符校對
-DDEFAULT_COLLATION=utf8_general_ci

# TCP/IP端口
-DMYSQL_TCP_PORT=3306 

# * ARCHIVE 引擎支持
-DWITH_ARCHIVE_STORAGE_ENGINE=1 

# * ARIA 引擎支持
-DWITH_ARIA_STORAGE_ENGINE=1

# * BLACKHOLE 引擎支持
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 

# * FEDERATEDX 引擎支持
-DWITH_FEDERATEDX_STORAGE_ENGINE=1

# * PARTITION 引擎支持
-DWITH_PARTITION_STORAGE_ENGINE=1 

# * PERFSCHEMA 引擎支持
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 

# * SPHINX 引擎支持
-DWITH_SPHINX_STORAGE_ENGINE=1

# * XTRADB 支持
-DWITH_XTRADB_STORAGE_ENGINE=1 

# * innoDB 引擎支持
-DWITH_INNOBASE_STORAGE_ENGINE=1

# * Myisam 引擎支持
-DWITH_MYISAM_STORAGE_ENGINE=1

# readline庫
-DWITH_READLINE=1 

# 啓用加載本地數據
-DENABLED_LOCAL_INFILE=1

# 擴展支持編碼 ( all | utf8,gbk,gb2312 | none )
-DWITH_EXTRA_CHARSETS=all

# 擴展字符支持
-DEXTRA_CHARSETS=all

# 系統傳輸使用SSL加密
-DWITH_SSL=system

# 系統傳輸使用zlib壓縮,節約帶寬
-DWITH_ZLIB=system

# libwrap庫
-DWITH_LIBWRAP=0

# 運行用戶
-DMYSQL_USER=mysql

# 調試模式
-DWITH_DEBUG=0


  配置MariaDB:

cd /usr/local/mysql/
scripts/mysql_install_db --user=mysql --datadir=/data/mydata/

echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
ln -sv /usr/local/mysql/include/ /usr/local/include/mysql
echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
ldconfig -v
ldconfig -p |grep mysql
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
cp support-files/my-large.cnf /etc/my.cnf
sed -i '/\[mysqld\]/a datadir=/data/mydata' /etc/my.cnf

service mysqld start
mysql -uroot -e 'GRANT all ON *.* TO root@"localhost" identified by "qwe123!"'


 安裝php:詳見18.4.3


18.3.3 測試

  php程序執行環境:在/var/www/html目錄下新建一個index.php文件,其內容如下:

<?php
    phpinfo();
?>


  測試php程序與mysql通信:在/var/www/html目錄下新建一個index.php文件,其內容如下:

<?php
    $conn=mysql_connect('HOSTNAME','USERNAME OF MYSQL','PASSWORD OF MYSQL USER');
    if ($conn)
        echo 'Connect Success!';
    else
        echo 'Connect Failed!';
    fi
    mysql_close();
?>


18.4 php

18.4.1 php解釋器與MariaDB/mysql交互

  php解釋器本身無須與MariaDB交互,只有那些用到數據存儲系統的程序才需要與數據存儲交互。


  常見的數據存儲系統有以下這些:

  a) 文件系統:存儲文件

  b) SQL:MariaDB,Oracle,MSSQL,...

  c) NoSQL:redis,mongodb,hbase,...

  NewSQL


18.4.2 php配置文件

  php官網:www.php.net

  php加速器:APC,eAccelerator,Xcache,OPcache

  配置文件:/etc/php.ini,/etc/php.d/*.ini

  php.ini核心配置選項:http://php.net/manual/zh/ini.core.php

  php.ini配置選項列表:http://php.net/manual/zh/ini.list.php


  配置文件(php.ini)在php啓動時被讀取。對於服務器模塊版本的php,僅在web服務器啓動時讀取一次。對於CGI和CLI版本,每次調用都會讀取


18.4.3 php編譯安裝

  php編譯安裝步驟:

  a) 解決依賴關係

  配置好yum源(系統安裝湖及Epel源)後執行如下命令:

yum -y groupinstall 'Desktop Platform Development'
yum -y install epel-release
yum -y install bzip2-devel libmcrypt-devel libxml2-devel

  b) 編譯安裝php

cd /usr/src
wget http://cn2.php.net/distributions/php-5.6.30.tar.xz
xz -d php-5.6.30.tar.xz
tar xf php-5.6.30.tar
cd php-5.6.30 
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/httpd/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-opcache

  說明:

  這裏爲了支持apache的worker或event這兩個MPM,編譯時使用了--enable-maintainer-zts選項

   如果使用PHP5.3以上版本,爲了鏈接mysql數據庫,可以指定mysqlnd,這樣在本機就不需要先安裝mysql或mysql開發包了

  mysqlnd從php5.3開始可用,可以編譯時綁定到它(而不用和具體的mysql客戶端綁定形成依賴),但從php5.4開始它就是默認設置了

./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
make
#make test
make install
echo 'export PATH=/usr/local/php/bin:$PATH' > /etc/profile.d/php.sh
. /etc/profile.d/php.sh

  c) 爲php提供配置文件

cp php.ini-production /etc/php.ini

  d) 編輯apache配置文件httpd.conf使其支持php

  添加如下兩行:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

  定位至DirectoryIndex index.html,修改爲:

DirectoryIndex index.php index.html

  而後重啓httpd,或讓其重新載入配置文件即可測試php是否已經可以正常使用

  e) 安裝xcache,爲php加速(php5.5及以下版本)

  安裝xcache:

cd /usr/src
wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.bz2
tar xf xcache-3.2.0.tar.bz2
cd xcache-3.2.0
/usr/local/php/bin/phpize
./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make && make install

  安裝結束時,會出現類似如下行:

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20131226/

  編輯php.ini,整合php和xcache:

  首先將xcache提供的樣例配置導入php.ini:

cat xcache.ini >> /etc/php.ini

  說明:xcache.ini文件在xcache的源碼目錄中

  接下來編輯/etc/php.ini,找到zend_extension開頭的行,修改爲如下行:

zend_extension = /usr/local/php/lib/php/extensions/no-debug-zts-20131226/xcache.so


  注意:如果php.ini文件中有多條zend_extension指令行,需確保此新增的行排在第一位

  編輯/etc/php.ini,修改以下內容:

xcache.admin.user = "admin"
#通過openssl passwd -1 PASSWORD命令生成密碼,然後在http://xcache.lighttpd.net/demo/cacher/mkpassword.php頁面加密密碼
xcache.admin.pass = "21232f297a57a5a743894a0e4a801fc3"
xcache.mmap_path =    "/tmp/xcache"


  創建/tmp/xcache文件並賦權:

touch /tmp/xcache
chmod 777 /tmp/xcache


  重啓httpd:

apachectl restart

  然後在phpinfo頁面查看是否有xcache模塊


  f) OPcache(5.5+版本加速)

  PHP5.5.0以後版本自帶Opcache加速器,但默認情況下未啓用。所以編譯的使用我們想要啓用該PHP加速器就應該添加參數 : –enable-opcache 來制定。

  對於已經編譯安裝了PHP5.5.0以上版本但當初又沒有啓用該加速器的用戶可以像PHP添加模塊一樣編譯添加。步驟如下:

cd /usr/src/php-5.6.30/ext/opcache
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install


  最後它會告訴你opcache.so已編譯成功,放在/usr/local/php/lib/php/extensions/no-debug-zts-20131226/目錄下


  編輯php.ini文件,配置opcache

  vim /etc/php.ini

  修改或添加如下代碼並保存退出:

[opcache]
zend_extension=/usr/local/php/lib/php/extensions/no-debug-zts-20131226/opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=200
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=20000
opcache.revalidate_freq=1
opcache.fast_shutdown=1


  然後重啓httpd服務,就可以用php -m命令或在phpinfo界面看到opcache已經開啓了


  常用的opcache配置介紹:

opcache.enable={0|1}#關閉或開啓opcache功能,默認爲0(關閉)

opcache.enable_cli={0|1}#關閉或開啓CLI

opcache.memory_consumption=528 #opcache可用的內存大小,單位爲Mb,根據自身情況而定,決定了總共能夠存儲多少預編譯的PHP代碼

opcache.interned_strings_buffer=8 #zend optimizer + 暫存池中字符串的佔內存總量,單位爲MB,推薦設爲8

opcache.max_accelerated_files=10000#對多緩存文件限制, 最大緩存的文件數目在200到100000之間,命中率不到 100% 的話, 可以試着提高這個值,推薦設爲4000

opcache.revalidate_freq=1 #Opcache會在一定時間內去檢查文件的修改時間, 這裏設置檢查的時間週期, 默認爲 2, 單位爲秒。推薦設爲60,注意,0是一直檢查而不是關閉

opcache.fast_shutdown=1 #打開快速關閉, 打開這個在PHP Request Shutdown的時候回收內存的速度會提高

opcache.max_wasted_percentage=5 #內存“浪費”達到此值對應的百分比,就會發起一個重啓調度。

opcache.use_cwd=0 #開啓這條指令, Zend Optimizer + 會自動將當前工作目錄的名字追加到腳本鍵上,以此消除同名文件間的鍵值命名衝突.關閉這條指令會提升性能,但是會對已存在的應用造成破壞

opcache.validate_timestamps=1 #開啓文件時間戳驗證

opcache.revalidate_path=0 #允許或禁止在 include_path 中進行文件搜索的優化

opcache.save_comments=1 #是否保存文件/函數的註釋。如果apigen、Doctrine、ZF2、PHPUnit需要文件註釋,推薦設爲0

opcache.load_comments=1 #是否加載文件/函數的註釋

opcache.enable_file_override=0 #允許覆蓋文件存在(file_exists等)的優化特性

opcache.optimization_level=0xffffffff #定義啓動多少個優化過程

opcache.inherited_hack=1 #啓用此Hack可以暫時性的解決”can’t redeclare class”錯誤

opcache.dups_fix=0 #啓用此Hack可以暫時性的解決”can’t redeclare class”錯誤

opcache.blacklist_filename= #設置不緩存的黑名單,不緩存指定目錄下cache_開頭的PHP文件。如/png/www/example.com/public_html/cache/cache_

opcache.max_file_size=0 #通過文件大小屏除大文件的緩存.默認情況下所有的文件都會被緩存

opcache.consistency_checks=0 #每 N 次請求檢查一次緩存校驗.默認值0表示檢查被禁用了。由於計算校驗值有損性能,這個指令應當緊緊在開發調試的時候開啓

opcache.force_restart_timeout=180 #從緩存不被訪問後,等待多久後(單位爲秒)調度重啓

opcache.error_log= #錯誤日誌文件名.留空表示使用標準錯誤輸出(stderr)

opcache.log_verbosity_level=1 #將錯誤信息寫入到服務器(Apache等)日誌

opcache.preferred_memory_model= #內存共享的首選後臺.留空則是讓系統選擇

opcache.protect_memory=0 #防止共享內存在腳本執行期間被意外寫入, 僅用於內部調試


  g) 啓用服務器狀態(編輯httpd.conf)

  mod_status模塊可以讓管理員查看服務器的執行狀態,它通過一個HTML頁面展示了當前服務器的統計數據。這些數據通常包括但不限於:

    處於工作狀態的worker進程數

    空閒狀態的worker進程數

    每個worker的狀態,包括此worker已經響應的請求數,及由此worker發送的內容的字節數

    當前服務器總共發送的字節數

    服務器自上次啓動或重啓以來至當前的時長

    平均每秒鐘響應的請求數、平均每秒鐘發送的字節數、平均每個請求所請求內容的字節數

  啓用狀態頁面的方法很簡單,只需要在主配置文件中添加如下內容即可:

<Location /server-status>
    SetHandler server-status
    Allow from all   #httpd-2.2版本使用此條授權
    Require all granted  #httpd-2.4版本使用此條授權
    #注意,Allow語句與Require語句二選一,不可同時使用
</Location>


  需要提醒的是,這裏的狀態信息不應該被所有人隨意訪問。因此,應該限制僅允許某些特定地址的客戶端查看。比如使用Require ip 172.16.0.0/16來限制僅允許指定網段的主機查看些頁面。


  可以用http://ip/server-status來查看狀態界面


18.4.4 配置以fpm方式工作的php

  a) 解決依賴關係

yum -y groupinstall  "X Software Development"

  若想讓編譯的php支持mcrypt擴展,執行以下命令:

yum -y install libmcrypt libmcrypt-devel mhash mhash-devel

  b) 編譯安裝php

cd /usr/src
wget http://cn2.php.net/distributions/php-5.5.38.tar.xz
xz -d php-5.5.38.tar.xz
tar xf php-5.5.38.tar
cd php-5.5.38
./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2
make && make install

cp php.ini-production /etc/php.ini


  c) 配置php-fpm

  爲php-fpm提供SysV init腳本,並將其添加至服務列表:

cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on


  爲php-fpm提供配置文件:

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf


  編輯php-fpm的配置文件(/usr/local/php/etc/php-fpm.conf):

  配置fpm的相關選項爲你所需要的值,並啓用pid文件(如下最後一行):

pm.max_children = 50    #最多同時提供50個進程提供50個併發服務
pm.start_servers = 5    #啓動時啓動5個進程
pm.min_spare_servers = 2    #最小空閒進程數
pm.max_spare_servers = 8    #最大空閒進程數
pid = /usr/local/php/var/run/php-fpm.pid


  啓動php-fpm:

service php-fpm start

  使用如下命令來驗證(如果此命令輸出中有幾個php-fpm進程說明啓動成功了):

ps aux|grep php-fpm

  默認情況下,fpm監聽在127.0.0.1的9000端口,也可以使用如下命令驗證其是否已經監聽在相應的套接字:

ss -tanlp |grep php-fpm


18.4.5 配置httpd-2.4.9

  httpd-2.4.9配置:

  a) 啓用httpd的相關模塊

  在apache httpd 2.4以後已經專門有一個模塊針對FastCGI的實現,此模塊爲mod_proxy_fcgi.so,它其實是作爲mod_proxy.so模塊的擴展,因此,這兩個模塊都要加載,編輯httpd.conf文件,加入以下兩行內容:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


  b) 配置虛擬主機支持使用fcgi

  在需要使用fcgi的虛擬主機中添加類似如下兩行:

ProxyRequests Off#關閉正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1

  如:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/idfsoft.com/$1

  表示把以.php結尾的文件請求發送到php-fpm進程,php-fpm至少需要知道運行的目錄和URI

  所以這裏直接在fcgi://127.0.0.1:9000後指明瞭這兩個參數,其它參數的傳遞已經被mod_proxy_fcgi.so進行了封裝,不需要手動指定


  示例:

<VirtualHost *:80>
    DocumentRoot "/var/www/html/idfsoft.com"
    ServerName idfsoft.com
    ServerAlias www.idfsoft.com
    ProxyRequests Off
    ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/idfsoft.com/$1
    <Directory "/var/www/html/idfsoft.com">
        Options none
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>


  c) 編輯apache的配置文件httpd.conf,讓apache能識別php格式的頁面,並支持php格式的主頁

  添加如下兩行:

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

  定位至DirectoryIndex index.html,修改爲:

DirectoryIndex index.php index.html

  而後重啓httpd,或讓其重新載入配置文件即可測試php是否已經可以正常使用

  

  注意:Apache httpd 2.4以前的版本中,要麼把PHP作爲apache的模塊運行,要麼添加一個第三方模塊支持PHP-FPM實現


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