Unix 系統(tǒng)下的 Apache 2.x

本節(jié)包括在 Unix 平臺(tái)的 Apache 2.x 下安裝 PHP 的說明和提示。

警告

不推薦在使用 Apache 2 的產(chǎn)品中使用線程化 MPM。應(yīng)使用預(yù)分支 MPM,Apache 2.0 和 2.2 默認(rèn)的 MPM。其原因見 FAQ 中的相關(guān)條目使用線程化 MPM 的 Apache2。

推薦閱讀 ? Apache 文檔,了解一下 Apache 2.x 服務(wù)器,以及詳細(xì)的安裝參數(shù)。

可以從 ? Apache 下載站點(diǎn)下載最新版本的Apache,并且根據(jù)上文選擇合適版本的 PHP 下載。本向?qū)H包含最基礎(chǔ)的內(nèi)容,只能讓 Apache 2.x 和 PHP 能夠正常工作。更多信息請(qǐng)閱讀 ? Apache 文檔。這里省略所有的版本號(hào),以保證本文的正確性。需要將本文的“NN”替換為相應(yīng)的版本號(hào)。

當(dāng)前 Apache 2.x 有兩個(gè)流行的版本 - 2.4 和 2.2。雖然選擇某個(gè)版本會(huì)有種種原因,但是如果可以考慮的話,我們還是建議使用最新的 Apache 2.4 版本。當(dāng)然,以下的介紹同樣適合 Apache 2.4 和 2.2。請(qǐng)注意 Apache 2.2 已經(jīng)不再被官方支持,并且不再發(fā)布新功能和補(bǔ)丁更新。

  1. 從上面列出的地方獲取 Apache 源碼包,然后解壓:

    tar -xzf httpd-2.x.NN.tar.gz
    
  2. 同樣,獲取 PHP 源碼包并解壓:

    tar -xzf php-NN.tar.gz
    
  3. 編譯并安裝 Apache。請(qǐng)參考 Apache 安裝文檔了解編譯 Apache 的更多細(xì)節(jié)。

    cd httpd-2_x_NN
    ./configure --enable-so
    make
    make install
    
  4. 現(xiàn)在已經(jīng)將 Apache 2.x.NN 安裝在 /usr/local/apache2。本安裝支持可裝載模塊 和標(biāo)準(zhǔn)的 MPM prefork。之后,可以使用如下命令啟動(dòng) Apache 服務(wù)器:

    /usr/local/apache2/bin/apachectl start
    
    如果成功,可以停止 Apache 服務(wù)器并繼續(xù)安裝 PHP:
    /usr/local/apache2/bin/apachectl stop
    

  5. 現(xiàn)在需要配置并編譯 PHP。在這里可以用各種各樣的參數(shù)來自定義 PHP,例如啟動(dòng)哪些擴(kuò)展功能包的支持等。用 ./configure --help 命令可以列出當(dāng)前可用的所有參數(shù)。在此例中,將給出一個(gè)在有 MySQL 支持的 Apache 2 上進(jìn)行配置的范例。

    如果按照上面的說明從源代碼編譯了 Apache,下面的例子會(huì)正確匹配 apxs 的路徑。如果通過其他方式安裝了 Apache,需要相應(yīng)的調(diào)整 apxs 的路徑。注意,在有些發(fā)行版本中,可能將 apxs 更名為 apxs2。

    cd ../php-NN
    ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
    make
    make install
    

    如果決定在安裝后改變配置選項(xiàng),只需重復(fù)最后的三步 configure,make,以及 make install,然后需要重新啟動(dòng) Apache 使新模塊生效。Apache 不需要重新編譯。

    請(qǐng)注意,除非明確有提示,否則“make install”命令將安裝 PEAR、各種 PHP 工具諸如 phpize,并安裝 PHP CLI 等等。

  6. 配置 php.ini

    cp php.ini-development /usr/local/lib/php.ini
    

    可以編輯 php.ini 來設(shè)置 PHP 運(yùn)行時(shí)的選項(xiàng)。如果想要把此文件放到另外的位置,需要在步驟 5 添加 --with-config-file-path=/path 選項(xiàng)。

    如果選擇了 php.ini-production,請(qǐng)務(wù)必閱讀其中的變更列表,它們將影響 PHP 的執(zhí)行。

  7. 編輯 httpd.conf 文件以調(diào)用 PHP 模塊。LoadModule 表達(dá)式右邊的路徑必須指向系統(tǒng)中的 PHP 模塊。以上的 make install 命令可能已經(jīng)完成了這些,但務(wù)必要檢查。

    PHP 8 版本:

    LoadModule php_module modules/libphp.so

    PHP 7 版本:

    LoadModule php7_module modules/libphp7.so
  8. 告知 Apache 將特定的擴(kuò)展名解析成 PHP,例如,讓 Apache 將擴(kuò)展名 .php 解析成 PHP。為了避免潛在的危險(xiǎn),例如上傳或者創(chuàng)建類似 exploit.php.jpg 的文件并被當(dāng)做 PHP 執(zhí)行,我們不再使用 Apache 的 AddType 指令來設(shè)置。參考下面的例子,你可以簡(jiǎn)單的將需要的擴(kuò)展名解釋為 PHP。 我們將添加 .php 來進(jìn)行演示。

    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

    或者,你也想將 .php,.php2,.php3,.php4,.php5,.php6,以及 .phtml 文件都當(dāng)做 PHP 來運(yùn)行,我們無需額外的設(shè)置,僅需按照下面這樣來:

    <FilesMatch "\.ph(p[2-6]?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>

    然后,可以將 .phps 文件由 PHP 源碼過濾器處理,使得其在顯示時(shí)可以高亮源碼,設(shè)置如下:

    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>

    mod_rewrite 也有助于將那些不需要運(yùn)行的 .php 文件的源碼高亮顯示,而并不需要將他們更名為 .phps 文件:

    RewriteEngine On
    RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]

    不要在正式生產(chǎn)運(yùn)營(yíng)的系統(tǒng)上啟動(dòng) PHP 源碼過濾器,因?yàn)檫@可能泄露系統(tǒng)機(jī)密或者嵌入的代碼中的敏感信息。

  9. 按照通常的方式啟動(dòng) Apache 服務(wù):

    /usr/local/apache2/bin/apachectl start
    

    或者

    service httpd restart
    

按照上面的步驟便可以使 Apache 2.x 將 PHP 作為 SAPI 模塊了。當(dāng)然 Apache 和 PHP 都還有很多配置選項(xiàng),可以在相應(yīng)的源代碼目錄中使用 ./configure --help 獲得更多信息。

假如要編譯一個(gè)多線程版本的 Apache,可在編譯時(shí)選擇用 worker MPM 來替換標(biāo)準(zhǔn)的 prefork MPM。只需在上面的第 3 步使用:

--with-mpm=worker

如果不是很明確這樣做的后果并且大概理解其含義的話,最好不要進(jìn)行這一步。更多信息請(qǐng)參考 Apache 文檔中關(guān)于 ? MPM-Modules 的部分。

注意:

Apache MultiViews 常見問題中討論了在 PHP 中使用 MultiViews。

注意:

要編譯多線程版本的 Apache,系統(tǒng)必須支持多線程。這也意味著需要將 PHP 編譯為正處在試驗(yàn)階段的 Zend Thread Safety(ZTS),因此并不是所有的擴(kuò)展都可以使用了。推薦編譯 Apache 使用標(biāo)準(zhǔn)的 prefork MPM-Module。