如何解決php fpm出錯問題

2022-01-10 10:00:18

php fpm出錯的解決辦法:1、在nginx的目錄中建立個php的檢測指令碼index.php;2、找到nginx載入php設定的部分;3、修改路徑即可。

本文操作環境:linux5.9.8系統、PHP5.5版、Dell G3電腦。

如何解決php fpm出錯問題?

nginx呼叫php-fpm出錯解決方法和nginx設定詳解

這篇文章介紹了nginx呼叫php-fpm出錯的解決方法,最後給出了nginx設定方法,需要的朋友可以參考下

裝完了nginx和php-5.5,設定好了nginx呼叫php後,就開始啟動php-fpm。

使用下面的命令

程式碼如下:

/usr/local/php/sbin/php-fpm

就可以啟動了。

在nginx的目錄中建立個php的檢測指令碼index.php

結果在開啟http://localhost/index.php

悲劇的發現居然無法開啟 。檢視紀錄檔檔案,看了下報錯原因

程式碼如下:

2013/07/01 22:34:26 [error] 3214#0: *64 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.168.19, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.168.140"

檢視下埠 。看到php-fpm的9000埠已經開啟了,說明php-fpm是沒什麼問題的,問題出在了nginx上了。可能是我的組態檔有問題。

找到nginx載入php設定的那塊。另外參考了下網上nginx的組態檔。

在第69行有一個呼叫指令碼路徑

程式碼如下:

fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

我把路徑改下,改成下面的就可以了。

程式碼如下:

 fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
http://localhost/index.php

可以出現php的版本資訊了。

大家還可以參考下面的設定方法

php-fpm不用再依賴其它的fastcgi啟動器,比如lighttpd的spawn-fcgi。

php-fpm的使用非常方便,設定都是在php-fpm.ini的檔案內

而啟動,重新啟動都可以從php/sbin/php-fpm中進行

更方便的是修改php.ini後可以直接使用php-fpm reload進行載入 無需殺掉程序就可以完成php.ini的修改載入

結果顯示使用php-fpm可以使php有不小的效能提升

php-fpm控制的程序.cpu回收的速度比較慢.記憶體分配的很均勻

而spawn-cgi控制的程序CPU下降的很快.而記憶體分配的比較不均勻.

有很多程序似乎未分配到,而另外一些卻佔用很高.

可能是由於程序任務分配的不均勻導致的.而這也導致了總體響應速度的下降

而php-fpm合理的分配.導致總體響應的提到以及任務的平均

使用php-fpm需要在php原始碼上打修補程式,然後重新編譯php

一.下載php-fpm

wget http://cn.php.net/get/php-5.2.8.tar.gz/from/www.php.net/mirror
wget http://php-fpm.anight.org/downloads/head/php-5.2.8-fpm-0.5.10.diff.gz

與php-5.2.9在同一級目錄

gzip -cd php-5.2.8-fpm-0.5.10.diff.gz | patch -d php-5.2.9 -p1

修補程式打好以後,編譯php的時候增加了下面幾個引數:

–enable-fpm 啟用fastcgi模式的fpm支援

–with-fpm-conf php-fpm的組態檔(預設是PREFIX/etc/php-fpm.conf)

–with-fpm-log php-fpm的紀錄檔檔案(預設是PREFIX/logs/php-fpm.log)

–with-fpm-pid php-fpm的pid檔案(預設是PREFIX/logs/php-fpm.pid)
./configure --prefix=/EBS/php \
--with-config-file-path=/EBS/php/etc \
--enable-fastcgi \
--enable-fpm \
--OTHERS

注:--enable-fastcgi \ 需要在--enable-fpm \的前面,否則,fpm不能編譯上。

二.編譯好php後,修改組態檔

vi /EBS/php/etc/php-fpm.conf

需要注意下面幾處設定

<value name="listen_address">127.0.0.1:9000</value>

這個表示php的fastcgi程序監聽的ip地址以及埠

<value name="user">nobody</value>
<value name="group">nobody</value>

表示php的fastcgi程序以什麼使用者以及使用者組來執行,預設該行是註釋掉的,需要開啟

<value name="display_errors">0</value>

是否顯示php錯誤資訊

<value name="max_children">5</value>

最大的子程序數目

執行php-fpm:

php-fpm用一個程式來控制fastcgi程序,這個檔案在$PREFIX/sbin/php-fpm

/usr/local/php/sbin/php-fpm

該程式有如下引數:

start 啟動php的fastcgi程序

stop 強制終止php的fastcgi程序

quit 平滑終止php的fastcgi程序

restart 重新啟動php的fastcgi程序

reload 重新載入php的php.ini

logrotate 重新啟用log檔案

也就是說,在修改了php.ini之後,我們可以使用

/usr/local/php/sbin/php-fpm reload

這樣,就保持了在php的fastcgi程序持續執行的狀態下,又重新載入了php.ini。

程式碼如下:

user www www;
worker_processes 10;
error_log logs/error.log notice;
pid logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
   use epoll;
   worker_connections 51200;
}
http
{
   include mime.types;
   default_type application/octet-stream;
   charset gb2312;
   server_names_hash_bucket_size 128;
   #sendfile on;
   #tcp_nopush on;
   keepalive_timeout 60;
   tcp_nodelay on;
   gzip on;
   gzip_min_length 1k;
   gzip_buffers 4 8k;
   gzip_http_version 1.1;
   gzip_types text/plain application/x-javascript text/css text/html application/xml;
   {
   listen 80;
   server_name 192.168.1.2;
   index index.html index.htm index.php;
   root /EBS/www;
   if (-d $request_filename)
   {
   rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
   }
   location ~ .*\.php?$
   {
   include fcgi.conf
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   }
   log_format access '$remote_addr - $remote_user [$time_local] "$request" '
   '$status $body_bytes_sent "$http_referer" '
   '"$http_user_agent" $http_x_forwarded_for';
   access_log logs/access.log access;
   }
}

新建組態檔

程式碼如下:

/usr/local/nginx/conf/fcgi.conf

注:nginx自帶了一個組態檔,/usr/local/nginx/conf/fastcgi_params,該組態檔缺少粗體字型的部分,會造成存取php檔案時報404錯誤。

複製程式碼程式碼如下:

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
#fastcgi_param REDIRECT_STATUS 200;

四 設定XCache

1、安裝xcache模組

wgethttp://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
tar -xvzf xcache-1.2.2.tar.gz
cd xcache-1.2.2
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-xcache --enable-xcache-optimizer
make
make install

2、計算密碼的md5值

echo -n "password"|md5sum
5f4dcc3b5aa765d61d8327deb882cf99

3、設定XCache

;注:zend_extension,用來載入zend的擴充套件,是絕對路徑, extension是相對路徑,相對於extension_dir的相對路徑,非zend擴充套件

如果你更改路徑以後,一定要apachectl stop後再start,而不要restart。

vi /usr/local/php/etc/php.ini

新增:

程式碼如下:

[xcache-common]
zend_extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/xcache.so
[xcache.admin]
; Change xcache.admin.user to your preferred login name
xcache.admin.user = "admin"
; Change xcache.admin.pass to the MD5 fingerprint of your password
; Use md5 -s "your_secret_password" to find the fingerprint
xcache.admin.pass = "5f4dcc3b5aa765d61d8327deb882cf99"
[xcache]
; Change xcache.size to tune the size of the opcode cache
xcache.size = 24M
xcache.shm_scheme = "mmap"
xcache.count = 2
xcache.slots = 8K
xcache.ttl = 0
xcache.gc_interval = 0
; Change xcache.var_size to adjust the size of variable cache
xcache.var_size = 8M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300
xcache.test = Off
xcache.readonly_protection = On
xcache.mmap_path = "/tmp/xcache"
xcache.coredump_directory = ""
xcache.cacher = On
xcache.stat = On
xcache.optimizer = Off
[xcache.coverager]
xcache.coverager = On
xcache.coveragedump_directory = ""

5、重新啟動PHP模組

正常load之後,

在phpinfo顯出的資訊內

Zend這快應該會加上XCache的內容

6、另外兩種加速模組:

在我們的測試中,效果都要好於xcache,這3中加速不能同時存在兩種,有衝突。

6.1 apc

程式碼如下:

wget http://pecl.php.net/get/APC-3.0.19.tgz
cd APC-3.0.19
/usr/local/php/bin/phpize
./configure --enable-apc --enable-apc-mmap --with-apxs=/EBS/apache/bin/apxs --with-php-config=/EBS/php/bin/php-config
make
make install
6.2 eaccelerator
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.zip
cd eaccelerator-0.9.5.3
/usr/local/php/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/EBS/php/bin/php-config
make
make install
vi php.ini
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

五、使用nginx對應多臺facgi伺服器

思路:前端一臺nginx,用於做為負載均衡和處理靜態頁面。利用nginx的upstream模組來將php請求分發到後段的php-fpm伺服器上。

後端多臺php-fpm的伺服器,只起php-fpm服務來處理php。

這樣做減少了php-fpm上的nginx服務,相當於少了一層。

推薦學習:《》

以上就是如何解決php fpm出錯問題的詳細內容,更多請關注TW511.COM其它相關文章!