CentOS下與Apache連接的PHP多版本共存方案實現(xiàn)詳解
在apache下整合fastCGI模式運行的php-fpm,似乎網上很少相關材料,就連英文版材料也少。只要是php-fpm,基本上都是與nginx搭配。查了一大批相關資料,寫本文總結一下。
apache下有多個fastCGI的支持方案:至少有mod_fcgi、mod_fastcgi(git)、mod_proxy_fcgi等。這兩個模塊都有點老,尤其mod_fastcgi自從2007年以來就沒有更新,略掉不談,事實上沒用過用。mod_proxy_fcgi模塊是httpd 2.4+的版本正式引入,通過簡潔的一行 ProxyPassMatch 指令即可。
mod_fcgi
mod_fcgi模塊本身是做fastCGI進程管理的,使用它就不需要使用php-fpm管理進程了。核心配置參數(shù)
LoadModule fcgid_module modules/mod_fcgid.so <VirtualHost *:80> DocumentRoot "/var/www/html/site_1" ServerName "www.yourhost.com" DirectoryIndex index.html index.php #php.ini的存放目錄,Linux下通常不需要 #FcgidInitialEnv PHPRC "D:/php" # 設置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi進程在處理完所有請求前退出 FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000 #php-cgi每個進程的最大請求數(shù) FcgidMaxRequestsPerProcess 1000 #php-cgi最大的進程數(shù) FcgidMaxProcesses 3 #最大執(zhí)行時間 FcgidIOTimeout 600 FcgidIdleTimeout 600 #php-cgi的路徑 FcgidWrapper /usr/local/php7/bin/php-cgi .php AddHandler fcgid-script .php FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000 <Directory "/var/www/html/site_1"> Options +ExecCGI </Directory> </VirtualHost>
幾個Fcgid*指令,是優(yōu)化之用,這里僅示例,要按實際情況調整數(shù)值。具體參看mod_fcgi官方文檔
使用mod_fcgid的幾個特點
php-fgi進程是由apache模塊啟動并管理,不需要配置php-fpm
在php-cig進程以apache用戶身份運行,php程序寫的文件,其權限為apache用戶(而不像php-fpm下寫文件為php-fpm用戶所有,默認是nobody),這樣在目錄權限管理方面一致性高些。
mod_fastcgi
雖然CentOS 6.x下是apache 2.2,但所幸已經有人成功移植: https://github.com/ceph/mod-proxy-fcgi 我們可以直接使用;更幸運的是它已經進入epel源,直接yum安裝即可;不想匹配epel源的,直接下載rpm包安裝也可以(示例 http://mirrors.ustc.edu.cn/epel/6/x86_64/)
當然可以重新編譯安裝apache 2.4, 這樣直接有mod_proxy_fcgi可以使用,但這里還是保持原版本不變,省掉編譯的工作量。
參考mod_proxy_fcgi官方文檔,整合php-fpm的配置指令
ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/"
語法很簡單,跟配置反向代理類似,可以按實際需要做修改。事實上與mod_proxy模塊語法一致的,不同處是將http協(xié)議改成fcig協(xié)議。
以上是apache整合php-fpm模式運行的fastCGI,接下來要對yum安裝的php做下配置修改。
yum安裝的php配置文件 /etc/httpd/conf.d/php.conf ,其中有如下一行
AddHandler php5-script .php
我們要對不同的站點啟用不同的php,上面一行是對全局的.php文件分配給php模塊處理,我們把這一行注釋掉。而是在每個站點啟用不同的php運行模式。
以上即是處理方式。
[已知問題]:裸目錄地址轉發(fā)
有一個困擾的問題沒有解決,感覺有點像模塊bug:
對于配置了DirectoryIndex index.php的目錄,如果其子目錄沒有index.php,上述ProxyPassMatch還是會做fastCGI轉發(fā),這時會看到php-fpm的404響應,而不是apache的響應403頁面。但前面的規(guī)則并不轉發(fā)這裸空目錄的url,所以感覺像bug
再者就是,對于ProxyPassMatch匹配的目錄,apache自動索引功能失效。(當然如果不開啟autoindex就無所謂了。生產環(huán)境下通常不開啟的)
其它,似乎也沒有什么嚴重后果,或者我沒還意識到(?)。
解決方法:每個目錄下,都放置一個index.html,避免fpm-php處理空請求
- CentOS 6.4安裝配置LAMP服務器(Apache+PHP5+MySQL)
- 解析centos中Apache、php、mysql 默認安裝路徑
- 在CentOS 6 中安裝WordPress(一) 安裝Apache,Mysql, PHP環(huán)境
- CentOS(Linux)下的apache服務器配置與管理方法分享
- CentOS Linux 下配置Apache2+PHP5+MySQL5+GD庫的方法
- CentOS 5.4 服務器配置 yum安裝Apache+php+Mysql
- Linux+php+apache+oracle環(huán)境搭建之CentOS下源碼編譯安裝PHP
- CentOS 6.3 安裝配置Apache2.2.6的方法(源碼編譯安裝)
- CentOS 7.2配置Apache服務httpd(上)
- CentOS 7.2配置Apache服務httpd(下)
相關文章
php大小寫轉換函數(shù)(strtolower、strtoupper)用法介紹
strtoupper() 函數(shù)把字符串轉換為大寫而strtolower函數(shù): 該函數(shù)將傳入的字符串參數(shù)所有的字符都轉換成小寫,并以小定形式放回這個字符串。下面通過本文給大家分享php大小寫轉換函數(shù)(strtolower、strtoupper)用法,需要的朋友參考下吧2017-11-11php redis 處理websocket聊天記錄的實例代碼
本文通過實例代碼給大家介紹了php redis 處理websocket聊天記錄的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07Zend Framework教程之Bootstrap類用法概述
這篇文章主要介紹了Zend Framework教程之Bootstrap類用法,簡單分析了Bootstrap的功能,定義,相關參數(shù)與使用方法,需要的朋友可以參考下2016-03-03