2024 年 PHP 日本研討會

在 Unix 系統上安裝 Nginx 1.4.x

本文將說明如何使用 PHP-FPM 在 Nginx 1.4.x HTTP 伺服器上安裝和設定 PHP。

本指南假設您已從原始碼建置 Nginx,因此所有二進制檔和設定檔都位於 /usr/local/nginx。 如果情況並非如此,並且您是透過其他方式取得 Nginx,請參閱 » Nginx Wiki 以便將本手冊轉換為您的設定。

本指南將涵蓋設定 Nginx 伺服器以處理 PHP 應用程式並在埠 80 上提供服務的基本知識,如果您希望在本文件範圍之外最佳化您的設定,建議您研究 Nginx 和 PHP-FPM 文件。

請注意,在整個文件中,版本號碼已替換為「x」,以確保本文檔在未來保持正確,請根據需要將其替換為相應的版本號碼。

  1. 建議您瀏覽 Nginx Wiki 的 » 安裝 頁面,以取得並在您的系統上安裝 Nginx。

  2. 取得並解壓縮 PHP 原始碼

    tar zxf php-x.x.x
    
  3. 設定並建置 PHP。您可以在這裡使用各種選項自訂 PHP,例如要啟用的擴充功能。執行 ./configure --help 以取得可用選項列表。在我們的範例中,我們將使用 PHP-FPM 和 MySQLi 支援進行簡單的設定。

    cd ../php-x.x.x
    ./configure --enable-fpm --with-mysqli
    make
    sudo make install
    
  4. 取得設定檔並將其移動到正確的位置

    cp php.ini-development /usr/local/php/php.ini
    cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
    cp sapi/fpm/php-fpm /usr/local/bin
    
  5. 重要的是,如果檔案不存在,我們要防止 Nginx 將請求傳遞到 PHP-FPM 後端,以避免任意腳本注入。

    我們可以透過在 php.ini 檔案中將 cgi.fix_pathinfo 指令設定為 0 來解決此問題。

    載入 php.ini

    vim /usr/local/php/php.ini
    

    找到 cgi.fix_pathinfo= 並修改如下

    cgi.fix_pathinfo=0
    
  6. 在啟動服務之前,必須修改 php-fpm.conf 以指定 php-fpm 必須以使用者 www-data 和群組 www-data 執行

    vim /usr/local/etc/php-fpm.d/www.conf
    

    尋找並修改以下內容

    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user's group
    ;       will be used.
    user = www-data
    group = www-data
    

    現在可以啟動 php-fpm 服務了

    /usr/local/bin/php-fpm
    

    本指南不會進一步設定 php-fpm,如果您有興趣進一步設定 php-fpm,請參閱相關文件。

  7. 現在必須設定 Nginx 以支援 PHP 應用程式的處理

    vim /usr/local/nginx/conf/nginx.conf
    

    修改預設的 location 區塊,使其能夠嘗試提供 .php 檔案

    location / {
        root   html;
        index  index.php index.html index.htm;
    }

    下一步是確保 .php 檔案被傳遞到 PHP-FPM 後端。在已註釋的預設 PHP location 區塊下方,輸入以下內容

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    127.0.0.1:9000;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

    重新啟動 Nginx。

    sudo /usr/local/nginx/sbin/nginx -s stop
    sudo /usr/local/nginx/sbin/nginx
    
  8. 建立一個測試檔案

    rm /usr/local/nginx/html/index.html
    echo "<?php phpinfo(); ?>" >> /usr/local/nginx/html/index.php
    

    現在瀏覽至 https://127.0.0.1。現在應該會顯示 phpinfo() 的資訊。

按照上述步驟,您將擁有一個以 FPM SAPI 模組支援 PHP 的 Nginx 網頁伺服器。當然,Nginx 和 PHP 還有許多其他的設定選項。如需更多資訊,請在對應的原始碼樹狀目錄中輸入 ./configure --help

新增註記

使用者貢獻的註記 8 則註記

Lenny
8 年前
如果某些地方有點不同,從原始碼建置並不容易,而且我在一些目錄和設定選項上遇到了困難。我在網路上到處搜尋,直到找到這個從中文翻譯過來的網站。沒有其他人有解決方案。直到我更改了目錄(項目 2. 錯誤:無法全域化),我才得以啟動 php fpm。我還列出了其他問題,但我能夠解決它們。請不要刪除這個,這是非常有用的資訊。

原始網站(它是中文的,不是我的網站,但我想給予讚揚)

(那裡還有更多內容,您可以前往該網站)

blog.dream1987.top/?paged=2

安裝問題

1. configure: error:. 找不到 Xml2-config 請檢查您的 libxml2 安裝。

解決方案

apt-get install libxml2-dev



2.警告:PEAR_Installer :: download () 的宣告應與 & PEAR_Downloader :: download ($ params) 相容,位於 phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR /Installer.php 的第 43 行

警告:PEAR_PackageFile_Parser_v2 :: parse () 的宣告應與 PEAR_XMLParser :: parse ($ data) 相容,位於 phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR/PackageFile/ Parser / v2.php 的第 113 行
[PEAR] Archive_Tar - 已安裝:1.3.13
[PEAR] Console_Getopt - 已安裝:1.3.1
[PEAR] Structures_Graph - 已安裝:1.0.4

警告:PEAR_Task_Replace::init() 的宣告應與 PEAR_Task_Common::init($xml, $fileAttributes, $lastVersion) 相容,檔案位置:phar:///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR/Task/Replace.php,第 31 行
[PEAR] XML_Util - 已安裝:1.2.3

警告:PEAR_Task_Windowseol::init() 的宣告應與 PEAR_Task_Common::init($xml, $fileAttributes, $lastVersion) 相容,檔案位置:phar:///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR/Task/Windowseol.php,第 76 行

警告:PEAR_Task_Unixeol::init() 的宣告應與 PEAR_Task_Common::init($xml, $fileAttributes, $lastVersion) 相容,檔案位置:phar:///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR/Task/Unixeol.php,第 76 行
[PEAR] PEAR - 已安裝:1.9.5

解決方案

找不到解決方法(http://pear.php.net/bugs/bug.php?id=20554

3. 啟動 php-fpm

1. 錯誤:無法開啟設定檔 '/usr/local/etc/php-fpm.conf':找不到檔案或目錄 (2)
錯誤:無法載入設定檔 '/usr/local/etc/php-fpm.conf'
錯誤:FPM 初始化失敗

解決方案

將 php-fpm.conf 檔案從來源複製到該位置。

cp /root/php-7.0.0alpha1/sapi/fpm/php-fpm.conf /usr/local/etc/php-fpm.conf

2. 錯誤:無法從 /usr/local/etc/php-fpm.conf 的第 125 行將 '/usr/local/NONE/etc/php-fpm.d/*.conf' 全域化 (ret = 2)。
錯誤:無法載入設定檔 '/usr/local/etc/php-fpm.conf'
錯誤:FPM 初始化失敗

解決方案

編輯 /usr/local/etc/php-fpm.conf 文件中引入 *.conf 的部分,將路徑更改為正確的路徑 include = /usr/local/etc/php-fpm.d/*.conf

如果沒有 /usr/local/etc/php-fpm.d 目錄,請建立該目錄。

3. 警告:在 /usr/local/etc/php-fpm.conf 的第 125 行,沒有任何項目符合 include 模式 '/usr/local/etc/php-fpm.d/*.conf'。
錯誤:未定義任何 pool,設定檔中至少必須指定一個 pool 區段
錯誤:設定後處理失敗
錯誤:FPM 初始化失敗

解決方案

cp www.conf.default www.conf

4. 錯誤:[pool www] 無法取得群組 'nobody' 的 gid
錯誤:FPM 初始化失敗

解決方案

開啟 www.conf 檔案,將使用者和群組設定為 nginx 的預設設定,通常預設值為 www-data。
uanaoeng at outlook dot com
5 年前
當我執行以下指令啟動 php-fpm 時
/usr/local/bin/php-fpm

我收到以下錯誤訊息
無法從 /usr/local/etc/php-fpm.conf 的第 143 行將 '/usr/local/NONE/etc/php-fpm.d/*.conf' 全域化 (ret=2)。

要修正此錯誤,請執行以下操作
使用文字編輯器將檔案 "/usr/local/etc/php-fpm.conf" 中的字串 "include=NONE/etc/php-fpm.d/*.conf" 更改為 "include=etc/php-fpm.d/*.conf"。

之後,我再次嘗試啟動 php-fpm,但又收到錯誤訊息
在 /usr/local/etc/php-fpm.conf 的第 143 行,沒有任何項目符合 include 模式 '/usr/local/etc/php-fpm.d/*.conf'。

要修正此錯誤,請執行以下操作
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
Leon Nguyen vnlab
3 年前
為了以最快的速度、最少的資源最大化伺服器效能,我決定從最精簡的 Linux/Unix 作業系統(我的 Linux 發行版是基於 rpm 的套件)手動編譯 PHP 8。

我的系統已成功由 PHP 8.0.9 啟動,並啟用了 Opcache/JIT 和其他幾個 PHP 擴充模組。以下是一些可以節省您數小時研究時間的經驗。

1. 在步驟 (3) 之前 - 設定和建置 PHP - 為了確保不會發生錯誤,您可以參考我的必要程式庫。

sudo dnf install \\
gcc gcc-c++ make cmake autoconfig \\
zlib zlib-devel pcre pcre-devel \\
libxml2-devel libxslt-devel \\
bzip2-devel curl-devel libzip-devel \\
sqlite-devel \\
systemd-devel \\
openssl-devel \\
libffi-devel \\
libpng libpng-devel libwebp libwebp-devel libjpeg libjpeg-devel libXpm libXpm-devel \\
freetype-devel \\
gmp-devel \\
libldb-devel \\
libc-client libc-client-devel \\
openldap openldap-devel \\
oniguruma oniguruma-devel \\
net-snmp-devel readline-devel unixODBC-devel \\
uw-imap uw-imap-devel uw-imap-static uw-imap-utils \\
libicu-devel \\
enchant2 enchant2-devel \\
gd gd-devel \\
libsodium libsodium-devel \\
libtidy libtidy-devel

即使之後手動建構 PHP 擴充套件,執行 ./configure, make && make install 時,您可能不會收到錯誤訊息。

2. 在步驟 5 - 修改 php.ini 之前 - 您可以使用以下指令再次確認目前的 PHP 正在讀取哪個 php.ini 檔案

php -ini | grep php.ini
# 我的執行結果。與教學不同。
設定檔 (php.ini) 路徑 => /usr/local/lib
已載入的設定檔 => /usr/local/lib/php.ini
timy.shark
2 年前
非常感謝您撰寫這份教學,以下是我的筆記,或許可以幫助到在 WSL2 容器上進行預設安裝的其他人。
備註:已為 Laravel framework 加入 composer。
以下指令不可直接複製貼上,需要根據情況選擇性使用,因為某些指令旁有註解。
此外,由於與我目前的環境不符,我已將原始編輯者撰寫的一些預設值加上 # 註釋。

sha256sum php-x.x.x.tar.gz => e847745fd66fc8c57fac993a609fefcded93fddccd225f0620a26bb5ae5753c3
tar zxf php-x.x.x
sudo apt install build-essential
sudo apt install -y composer nginx pkgconf libxml2-dev libsqlite3-dev zlib1g-dev
cd php-x.x.x
./configure --enable-fpm --with-mysqli <==感謝您安裝 PHP。
make <== 需要一些時間
sudo make test <== 建議執行,但非必要
sudo make install <= /usr/local/bin /usr/local/php
sudo cp php.ini-development /usr/local/lib/php.ini
sudo cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
sudo cp sapi/fpm/php-fpm /usr/local/bin
sudo vim /usr/local/php/php.ini <= cgi.fix_pathinfo=0
sudo vim /usr/local/etc/php-fpm.d/www.conf <= user=www-data group=www-data
sudo vim sapi/fpm/php-fpm.conf <= 編輯 include=etc/php-fpm.d/*.conf <- 相對路徑
sudo cp sapi/fpm/php-fpm.conf /usr/local/etc
/usr/local/bin/php -v <= $PATH$ 首先使用 /usr/local/bin,然後是 /usr/local/lib/php.ini
sudo /usr/local/bin/php-fpm <= 啟動服務
sudo vim /etc/nginx/sites-available/default <= 在 server {} 下編輯以下內容
location / {
#root html;
#index index.php index.html index.htm;
}
location ~* \.php$ {
#fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

*如果根目錄不存在,請重新啟動 nginx (root /var/www/html),預設為:/usr/share/nginx/html
sudo nginx -t <= 測試 Nginx 設定檔
sudo service nginx reload
sudo service nginx stop
sudo service nginx start <= [OK]

php-fpm 需要作為一個服務運行,或者手動 kill 程序 ps -aux | grep php-fpm ; kill <pid>
Akash Kumar Sharma
8 年前
如果您遇到「找不到檔案」錯誤,請在 PHP 的 location 區塊中,也就是「location ~* \.php$ { }」內,加入「root 根目錄位置」指令,其中根目錄位置例如「/usr/share/nginx/html」。
nguyentienlong88 at gmail dot com
9 年前
在步驟 3,執行「sudo make install」指令後
如果 pear.php.net (https) 出現問題,需要在 Makefile 中將這行 (從 https 改為 http)
PEAR_INSTALLER_URL = http://pear.php.net/install-pear-nozlib.phar
1097625354 at qq dot com
6 年前
cp php/php.ini-development php/lib/php.ini
cp php/etc/php-fpm.conf.default php/etc/php-fpm.conf
cp php/etc/php-fpm.d/www.conf.default php/etc/php-fpm.d/www.conf
610010559 at qq dot com
5 年前
在 Linux 系統中,如果您想將 php-fpm 服務新增到系統服務;這很容易做到,因為 PHP 提供了相關的 shell 腳本

執行 make 和 make install 後;進入原始碼包 sapi/fpm/init.d.php-fpm;在 Linux 系統中輸入程式碼。
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

然後您可以使用「php-fpm {start|stop|force-quit|restart|reload|status|configtest}」指令更方便地控制您的 php-fpm 程式。
To Top