一、定位PHP-FPM錯誤日志文件
PHP-FPM的錯誤日志路徑通常由配置文件決定,默認常見位置包括:
/var/log/php-fpm/error.log
/var/log/php-fpm/www-error.log
/var/log/php7.x-fpm.log
(x
為PHP版本號,如7.4、8.2)可通過以下命令快速查找:
sudo find /var/log -name "*php-fpm*log"
若路徑未確定,可檢查PHP-FPM主配置文件(/etc/php/{version}/fpm/php-fpm.conf
)或pool配置文件(/etc/php/{version}/fpm/pool.d/www.conf
)中的error_log
指令。
二、常用日志查看與分析命令
tail -f
命令跟蹤日志文件的實時更新,快速捕捉新出現的錯誤:sudo tail -f /var/log/php-fpm/error.log
grep
命令篩選關鍵詞(如“error”“fatal”“warning”),縮小分析范圍:sudo grep -i "error" /var/log/php-fpm/error.log # 查找錯誤信息
sudo grep -i "fatal" /var/log/php-fpm/error.log # 查找致命錯誤
sudo grep -i "warning" /var/log/php-fpm/error.log # 查找警告信息
sort
和uniq
命令,統計重復出現的錯誤次數,定位高頻問題:sudo grep "PHP Fatal error" /var/log/php-fpm/error.log | sort | uniq -c | sort -rn
slowlog
參數),可通過以下命令分析慢請求:sudo tail -f /var/log/php-fpm/www-slow.log # 慢日志路徑需根據配置調整
常用慢日志分析命令(找出執行時間最長的請求):sudo awk '/^.*script_filename.*$/{print $0}' /var/log/php-fpm/www-slow.log | sort -k 10 -nr | head -10
三、常見錯誤類型及解讀
PHP語法/運行時錯誤:
日志中會出現PHP Fatal error
(致命錯誤,腳本終止)、PHP Warning
(警告,腳本繼續執行)、PHP Notice
(通知,輕微問題)。
示例:
[01-Sep-2023 12:34:56] PHP Fatal error: Uncaught Error: Call to undefined function foo() in /var/www/my_script.php:12
Stack trace:
#0 /var/www/my_script.php(12): foo()
#1 {main}
thrown in /var/www/my_script.php on line 12
解讀:腳本/var/www/my_script.php
第12行調用了未定義的函數foo()
,導致致命錯誤。
權限問題:
日志中出現Permission denied
(權限被拒絕),通常因PHP-FPM進程用戶(如www-data
)無權訪問腳本、目錄或套接字文件。
示例:
[01-Sep-2023 12:35:00] WARNING: [pool www] child 1234 said into stderr: "ERROR: Unable to open primary script: /var/www/html/index.php (Permission denied)"
解讀:www-data
用戶無法讀取/var/www/html/index.php
文件。
端口/套接字沖突:
日志中出現Address already in use
(地址已被使用)或socket already in use
(套接字已被使用),因PHP-FPM監聽的端口或套接字被其他進程占用。
示例:
[01-Sep-2023 12:35:05] ERROR: unable to bind listening socket for address '/run/php/php7.4-fpm.sock': Address already in use
[01-Sep-2023 12:35:05] ERROR: FPM initialization failed
解讀:/run/php/php7.4-fpm.sock
套接字已被其他進程占用,導致PHP-FPM無法啟動。
資源限制:
日志中出現pm.max_children reached
(進程數達到上限)、Allowed memory size exhausted
(內存耗盡)或unable to create new process
(無法創建新進程),因資源不足導致請求無法處理。
示例:
[01-Sep-2023 12:35:10] WARNING: [pool www] server reached pm.max_children setting (50), consider raising it
解讀:當前進程數已達pm.max_children
設置的50,需增加該值以處理更多并發請求。
擴展加載失敗:
日志中出現Unable to load dynamic library
(無法加載動態庫),因PHP擴展未正確安裝或配置。
示例:
[01-Sep-2023 12:35:15] WARNING: [pool www] child 1235 said into stderr: "PHP Startup: Unable to load dynamic library 'redis.so' (tried: /usr/lib/php/20210902/redis.so (/usr/lib/php/20210902/redis.so: cannot open shared object file: No such file or directory), /usr/lib/php/20210902/redis.so.so (/usr/lib/php/20210902/redis.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0"
解讀:redis.so
擴展未找到,需安裝或修復該擴展。
四、常見錯誤解決方法
權限問題:
www-data
)對腳本、目錄有讀寫權限:sudo chown -R www-data:www-data /var/www/html # 修改網站目錄所有者
sudo chmod -R 755 /var/www/html # 設置目錄權限
www.conf
中的listen.owner
和listen.group
設置,確保與進程用戶一致:sudo nano /etc/php/{version}/fpm/pool.d/www.conf
# 確認以下兩行
listen.owner = www-data
listen.group = www-data
sudo systemctl restart php{version}-fpm
```。
端口/套接字沖突:
netstat
或lsof
查找占用進程:sudo netstat -tulnp | grep 9000 # 檢查端口占用
sudo lsof /run/php/php7.4-fpm.sock # 檢查套接字占用
sudo kill -9 <PID> # 替換<PID>為占用進程ID
www.conf
中的listen
指令(如將端口改為9001或修改套接字路徑):sudo nano /etc/php/{version}/fpm/pool.d/www.conf
# 修改為
listen = 127.0.0.1:9001 # 或 listen = /run/php/php7.4-fpm.sock
資源限制:
pm.max_children
(進程數):根據服務器內存調整(如每進程占用100MB內存,1GB內存可設為10):sudo nano /etc/php/{version}/fpm/pool.d/www.conf
pm.max_children = 50 # 根據實際情況調整
memory_limit
(內存限制):修改php.ini
文件:sudo nano /etc/php/{version}/fpm/php.ini
memory_limit = 256M # 根據實際情況調整
擴展加載失敗:
php -m | grep redis # 檢查redis擴展是否加載
sudo apt-get install php{version}-redis # 替換<version>為PHP版本號
php.ini
中無效的擴展行(如extension=redis.so
),或重新安裝擴展。配置文件語法錯誤:
php-fpm -t
命令測試配置文件語法:sudo php-fpm{version} -t # 替換<version>為PHP版本號