柚子快報邀請碼778899分享:Nginx 與 PHP 的集成
Nginx 與 PHP 的集成詳解
Nginx 作為一款高性能的 Web 服務器,廣泛應用于各類 Web 服務的架構中。與傳統(tǒng)的 Apache 服務器不同,Nginx 更擅長處理高并發(fā)的請求,尤其在靜態(tài)資源服務和反向代理方面表現(xiàn)出色。然而,當 Nginx 用作 Web 服務器時,它并不像 Apache 那樣直接支持 PHP 解析。為了使 Nginx 能夠處理動態(tài)的 PHP 內容,我們通常需要借助 PHP-FPM(FastCGI Process Manager)來完成 PHP 代碼的處理。
一、Nginx 與 PHP 的集成原理
1.1 Nginx 與 PHP-FPM
Nginx 本身并不直接支持處理 PHP 請求,它通過 FastCGI 協(xié)議與 PHP-FPM 進行通信。PHP-FPM 是 PHP 的一個高效的進程管理器,它負責處理 PHP 請求并生成動態(tài)的網(wǎng)頁內容,然后將結果返回給 Nginx。Nginx 作為反向代理,將請求轉發(fā)到 PHP-FPM,而 PHP-FPM 負責解析 PHP 文件并返回給 Nginx 結果,Nginx 再將該結果返回給客戶端。
1.2 FastCGI 協(xié)議
FastCGI 是一種獨立于 Web 服務器的協(xié)議,旨在提高 Web 服務器處理動態(tài)內容的效率。與傳統(tǒng)的 CGI 不同,F(xiàn)astCGI 通過持久化進程池來處理多個請求,從而避免了每次請求都需要創(chuàng)建新進程的性能瓶頸。Nginx 和 PHP-FPM 都使用 FastCGI 協(xié)議進行通信,Nginx 將 PHP 請求通過 FastCGI 協(xié)議轉發(fā)給 PHP-FPM,后者進行 PHP 解析和執(zhí)行,最終將結果返回給 Nginx。
二、安裝 PHP 和 PHP-FPM
2.1 安裝 PHP-FPM
在 Linux 系統(tǒng)上,安裝 PHP 和 PHP-FPM 通常通過包管理器來完成。以 Ubuntu 為例,使用以下命令安裝 PHP 和 PHP-FPM:
sudo apt update
sudo apt install php-fpm php-mysql
php-fpm:這是 PHP 的 FastCGI 進程管理器,它負責處理 PHP 請求。php-mysql:這個擴展包允許 PHP 訪問 MySQL 數(shù)據(jù)庫。
安裝完成后,PHP-FPM 將作為服務運行,你可以通過以下命令檢查 PHP-FPM 是否成功安裝:
php -v # 查看 PHP 版本
systemctl status php7.4-fpm # 查看 PHP-FPM 狀態(tài)(具體版本號根據(jù)系統(tǒng)不同而不同)
2.2 安裝 Nginx
如果系統(tǒng)尚未安裝 Nginx,可以通過以下命令進行安裝:
sudo apt update
sudo apt install nginx
安裝完成后,可以使用以下命令啟動 Nginx 服務:
sudo systemctl start nginx
sudo systemctl enable nginx
三、配置 Nginx 與 PHP 的集成
3.1 配置 PHP-FPM
PHP-FPM 的配置文件通常位于 /etc/php/{version}/fpm/pool.d/www.conf,你可以編輯該文件來調整 PHP-FPM 的運行參數(shù)。特別是以下幾個配置項:
user 和 group 配置:指定 PHP-FPM 進程的用戶和用戶組。 user = www-data
group = www-data
listen 和 listen.owner:指定 PHP-FPM 監(jiān)聽的地址和權限。通常,PHP-FPM 使用 Unix socket 或 TCP 協(xié)議監(jiān)聽,Unix socket 的性能更好。 listen = /run/php/php7.4-fpm.sock # 使用 Unix socket
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm 配置:pm(進程管理)控制 PHP-FPM 的進程池配置。常見的配置項有: pm = dynamic # 動態(tài)管理進程數(shù)
pm.max_children = 50 # 最大進程數(shù)
pm.start_servers = 5 # 啟動時的進程數(shù)
pm.min_spare_servers = 5 # 最小空閑進程數(shù)
pm.max_spare_servers = 35 # 最大空閑進程數(shù)
修改完 PHP-FPM 配置后,記得重新啟動 PHP-FPM 服務以應用更改:
sudo systemctl restart php7.4-fpm
3.2 配置 Nginx 轉發(fā) PHP 請求
在 Nginx 中,你需要在 server 塊中配置 location 指令,將 PHP 請求轉發(fā)到 PHP-FPM 進行處理。以下是一個典型的配置示例:
server {
listen 80;
server_name www.example.com;
root /var/www/html; # 指定網(wǎng)站根目錄
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 將 PHP 請求轉發(fā)給 PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf; # 包含標準 FastCGI 配置
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 指定 PHP-FPM 的 Unix socket 地址
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ .php$:匹配以 .php 結尾的請求,將這些請求轉發(fā)到 PHP-FPM 進行處理。fastcgi_pass:指定 PHP-FPM 的 Unix socket 地址或 TCP 地址(如果 PHP-FPM 使用 TCP 協(xié)議監(jiān)聽的話)。fastcgi_param SCRIPT_FILENAME:告訴 PHP-FPM 要執(zhí)行的 PHP 腳本的路徑。
3.3 配置 Nginx 與 PHP-FPM 通過 TCP 通信
在一些高可用架構中,Nginx 和 PHP-FPM 可能不在同一臺服務器上運行,而是通過網(wǎng)絡連接。此時,你需要將 fastcgi_pass 配置為 TCP 地址:
fastcgi_pass 127.0.0.1:9000; # PHP-FPM 使用 TCP 協(xié)議監(jiān)聽的端口
3.4 測試配置
配置完成后,重啟 Nginx 以使配置生效:
sudo systemctl restart nginx
然后,創(chuàng)建一個簡單的 PHP 文件來測試配置:
phpinfo();
?>
將該文件放置在網(wǎng)站根目錄下,訪問該文件時,Nginx 應該將請求轉發(fā)給 PHP-FPM 處理,并展示 PHP 的配置信息頁面。
四、Nginx 與 PHP 集成的優(yōu)化
4.1 配置 PHP-FPM 進程管理
在高并發(fā)的場景中,合理配置 PHP-FPM 的進程管理至關重要。根據(jù)訪問量的大小和服務器的資源情況,可以調整 PHP-FPM 的進程池配置。以下是常見的調優(yōu)參數(shù):
pm.max_children:設置 PHP-FPM 啟動的最大子進程數(shù)。需要根據(jù)服務器的內存大小來調整,過高可能導致內存不足,過低則可能導致請求排隊。pm.start_servers:指定啟動時的子進程數(shù),通常設置為一個較低的值,以便在高峰期自動擴展。pm.max_requests:每個 PHP-FPM 進程處理的最大請求數(shù)。設置為一個合理的值可以防止內存泄漏。
4.2 啟用 OPcache
PHP 的 OPcache 可以將編譯后的 PHP 字節(jié)碼緩存到內存中,從而提高 PHP 執(zhí)行效率。啟用 OPcache 后,PHP 不需要每次請求時都進行編譯,從而節(jié)省了處理時間。
編輯 PHP 配置文件(如 /etc/php/7.4/fpm/php.ini),啟用 OPcache:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
4.3 靜態(tài)資源的優(yōu)化
Nginx 在處理靜態(tài)資源時具有極高的效率,因此應該將靜態(tài)資源(如圖片、CSS、JavaScript)直接交給 Nginx 處理,而將動態(tài)請求交給 PHP-FPM。通過 try_files 指令,可以避免不必要的請求轉發(fā),提高性能:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
4.4 PHP-FPM 日志和性能監(jiān)控
為了確保 PHP-FPM 在高負載下的穩(wěn)定性,可以啟用 PHP-FPM 的日志記錄和性能監(jiān)控。PHP-FPM 提供了訪問日志和慢請求日志,幫助開發(fā)人員排查性能瓶頸。
access.log = /var/log/php7.4-fpm/access.log
slowlog = /var/log/php7.4-fpm/slow.log
request_slowlog_timeout = 5s # 慢請求的閾值
五、總結
通過與 PHP-FPM 的集成,Nginx 能夠高效地處理 PHP 請求,提供更高的并發(fā)能力和性能。本文介紹了如何安裝和配置 PHP-FPM、如何配置 Nginx 轉發(fā) PHP 請求,以及如何進行性能優(yōu)化。通過合理配置 PHP-FPM 進程池、啟用 OPcache 和優(yōu)化靜態(tài)資源的處理,Nginx 與 PHP 的集成能夠提供一個穩(wěn)定、高效的 Web 服務平臺,適應高并發(fā)和高負載的需求。
柚子快報邀請碼778899分享:Nginx 與 PHP 的集成
本文內容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉載請注明,如有侵權,聯(lián)系刪除。