當前位置:首頁 » 編程語言 » phpfpmpid

phpfpmpid

發布時間: 2024-05-07 13:44:29

A. 請教php-fpm的pid問題

如果只是提交amh php start 沒額外加域名標識的話就會全部主機的php都啟動。
腳本
for domain in `ls /home/wwwroot/`; do
if ; then
/root/amh/php $selected $domain;
fi;
done;
所以說是以/home/wwwroot/主機目錄為准。
面板上只刪除主機是沒刪除主機wwwroot文件目錄的,避免誤刪整個目錄。
另外/root/amh/php這個腳本有定義php_pid變數的。
php_pid="/usr/local/php/var/run/pid/php-fpm-$domain.pid";
剛才沒仔細看腳本php_pid="/usr/local/php/var/run/pid/php-fpm-$domain.pid";
for domain in `ls /home/wwwroot/`; do
if ; then
/root/amh/php $selected $domain;
fi;
done;
其實有了
那其實這里讀取域名的腳本就有這么一個邏輯問題了
刪除了域名 一般是不會刪文件夾
那這樣就會在這里報錯了 雖然不影響使用
不過我觀察到域名的記錄資料庫也是有記錄的
這里的$php_pid 是改成讀取資料庫好還是判斷文件夾哪~
又或者這樣 刪除域名後 在被刪除域名的文件夾添加個判斷文件 removed
再在上面的循環中添加一個if ! -f removed
同時 建立主機的那裡也要加個步驟
綁定域名 指定目錄後
加一個刪除 目錄下的 removed文件的步驟

B. 如何用supervisor守護php-fpm主進程以實現php-fpm的自動重啟

1. 安裝supervisor
supervisor本身是python實現的,而且是調研階段,故先創建一個新的virtualenv環境,然後用pip安裝好supervisor包。

至此,基本的調研環境搭建完畢。當然,php-fpm和PHP環境以及前端的Nginx是早就ready的。

2. 分析php-fpm.sh腳本

通常編譯安裝PHP後,php-fpm這個2進制的C程序也會被編譯並安裝好,典型路徑在php_install_path/sbin/目錄下。該
目錄下還有個名為php-fpm.sh的腳本用於控制php-fpm進程的start/stop/restart/reload等動作。

./sbin/php-fpm.sh腳本中,」start」操作啟動了php-fpm主進程,其餘的操作都是通過向php-fpm master進程發signal實現的。

<code class="hljs bash">## code segment in php-fpm.sh
case "$1" in
start)
echo -n "Starting php-fpm "
## 下面這行是關鍵命令
$php_fpm_BIN --daemonize $php_opts

if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi

wait_for_pid created $php_fpm_PID

if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;</code>

從上面是終端輸入」./sbin/php-fpm.sh
start」時,實際執行的代碼,可以看到,php-fpm進程的啟動參數是–daemonize
$php_opts,而$php_opts的值為」–fpm-config $php_fpm_CONF –pid $php_fpm_PID」。

注意: php-fpm.sh啟動php-fpm master進程時,傳入了daemonize參數,表明php-fpm master process以守護(daemon)方式啟動,而根據supervisor文檔的說明,當用supervisor監護進程時,被監護進程不能是守護進程,這是由於守護進程通常會在fork完子進程後就讓父進程」結束生命」,也即由supervisor創建的父進程退出,此時,supervisor無法再監護已退出進程創建出來的子進程。關於daemon process的行為,可以參考linux Daemon Writing HOWTO一文來理解。

根據上面的分析,我們知道,只要supervisor啟動php-fpm進程時,不傳入daemonize參數即可。

3. 實現php-fpm主進程守護功能的supervisor配置文件

上面的分析已經告訴我們應該怎麼解決問題了,下面直接上驗證可用的配置文件。文件位於php-fpm.conf同級目錄下(典型路徑為php_install_path/etc/)。

<code class="hljs bash"><code class="hljs vhdl">
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9015 ; (ip_address:port specifier, *:port for all iface)

[supervisord]
logfile=./var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=2 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=./var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
identifier=sup.php-fpm ; (supervisord identifier, default is 'supervisor')

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=http://127.0.0.1:9015 ; use an http:// url to specify an inet socket

[program:php-fpm]
command=bash -c "sleep 1 && /home/slvher/tools/php/5.6.11/sbin/php-fpm --fpm-config /home/slvher/tools/php/5.6.11/etc/php-fpm.conf --pid /home/slvher/tools/php/5.6.11/var/run/php-fpm.pid" ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; whether/when to restart (default: unexpected)
startretries=5 ; max # of serial start failures (default 3)
exitcodes=0,2,70 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=2 ; max num secs to wait b4 SIGKILL (default 10)
</code></code>

配置文件結構通過查看supervisor文檔很容易就能掌握,有兩個配置項需要特別注意:

1) command

它指定了supervisor要監控的進程的啟動命令,可以看到,這里我們沒有給php-fpm傳入daemonize參數,其餘參數只是展開了php-fpm.sh中的shell變數而已。

大家已經注意到,command也不是直接調起php-fpm,而是通過bash -c執行了兩個命令,而第一個命令是sleep 1。這是由於php-fpm在stop後,其佔用的埠通常不能立即釋放,此時,supervisor以極快的速度試圖重新拉起進程時,可能會由於報如下錯誤而導致幾次retry均失敗:

<code class="hljs bash"><code class="hljs vhdl"><code class="hljs vbscript">## var/log/php-fpm.error.log
[18-Jul-2015 21:35:28] ERROR: unable to bind listening socket for address '127.0.0.1:9002': Address already in use (98)
[18-Jul-2015 21:35:28] ERROR: FPM initialization failed</code></code></code>

而supervisor目前還不支持delay restart功能,因此,這里只能通過先sleep再啟動的略顯tricky的方法來解決問題,結果表明,療效不錯且無副作用。-_-

2) autorestart

其文檔描述如下:

<code class="hljs bash"><code class="hljs vhdl"><code class="hljs vbscript"><code class="hljs livecodeserver">May be one of false, unexpected, or true. If false, the process will never be autorestarted. If unexpected, the process will be restart when the program exits with an exit code that is not one of the exit codes associated with this process』 configuration (see exitcodes). If true, the process will be unconditionally restarted when it exits, without regard to its exit code.</code></code></code></code>

其默認值是unexpected,表示若被監護進程的exit code異常時,supervisor才會重新拉起進程。這里設置為true,表明任何時候進程退出均會被再次拉起。

這樣配置好後,在本文第1步搭建好的virtualenv環境中,運行如下命令即可完成supervisor對php-fpm master進程的監護:

<code class="hljs bash"><code class="hljs vhdl"><code class="hljs vbscript"><code class="hljs livecodeserver"><code class="hljs avrasm">shell> supervisord -c etc/sup.php-fpm.conf</code></code></code></code></code>

然後,通過ps x | fgrep fpm可以看到,php-fpm主進程已經被拉起了。
然後,kill掉php-fpm主進程,再次ps x | fgrep fpm可以看到,一個新的php-fpm主進程會被supervisor創建出來。

至此,用supervisor守護php-fpm主進程以實現php-fpm的自動重啟的需求已經解決了。

C. 如何在linux下安裝多個不同版本的PHP

Linux下部署php多版本共存
背景說明
自php7問世,身為最新版本控的我馬上升級體驗,但是由於伺服器上還有舊程序在運行,只好部署一個php多版本共存環境。
現有環境是lnmp
- CentOS 6.7
- nginx 1.10.1
- mariadb-10.0.26
- php 7.0.8
為了更好兼容舊的php程序,推薦使用5.4.45. 主要是兼容mysql擴展。
開始安裝
首先要下載php-5.4.45.tar.gz源碼包。
通過源碼安裝
# tar xzvf php-5.4.45.tar.gz
# cd php-5.4.45

# ./configure --prefix=/usr/local/php54 --with-config-file-path=/usr/local/php54/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext --disable-fileinfo --enable-intl --with-xsl

# make ZEND_EXTRA_LIBS='-liconv'
# make install
# cp php.ini-proction /usr/local/php/etc/php.ini

------------------------------------------------------------------------------------------------
php.ini 配置
post_max_size = 50M
upload_max_filesize = 50M
date.timezone = PRC
short_open_tag = On
cgi.fix_pathinfo=0
max_execution_time = 300
disable_functions=passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
------------------------------------------------------------------------------------------------
php-fpm.conf 配置
------------------------------
# vim /usr/local/php/etc/php-fpm.conf1
[global]
pid = /usr/local/php54/var/run/php-fpm.pid
error_log = /usr/local/php54/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php54-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1:9001
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 40
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 40
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

----------------------------------------------------------------------------------
啟動 php-fpm
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php54-fpm
# chmod +x /etc/init.d/php54-fpm
# /etc/init.d/php54-fpm start
-------------------------------------------------------------------------------------------
修改nginx配置,對需要的服務配置使用php-5.4.45
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php54-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
----------------------------------------------------------------------------------------
配置php-5.4.45 的php54-fpm 開機自動啟動
# chkconfig --add php54-fpm
# chkconfig php54-fpm on

D. 如何修改 php-fpm的運行用戶

第一種:一個php-fpm主進程

這種方式比較簡單,也只需要一個php-fpm自啟動文件。

首先我們查看一下原php-fpm.conf的這個配置文件,分為兩個部分,一個是global塊,另外一個是自定義的塊,配置文件裡面稱為pool池,默認叫「www」。在global池的上方,有一行注釋了的「include=etc/fpm.d/*.conf」配置項,再通過www池的配置,我們可知可以通過不同的池來配置不同的用戶,來達到多個用戶運行php-fpm的目的,步驟如下:

4、刪除前面的global塊,或者注釋掉。

5、修改[www]為其他,比如你[blog]。

6、配置[blog]池,主要修改兩個地方:

6.1:第一處為運行的用戶和用戶組。

即將

12user = www3group = www4。

修改為

12user=nobody #具體用哪個用戶視自己情況而定,我只做個示例3group=nobody4。

6.2:修改監聽的埠或者socket:

即將:

12listen = 127.0.0.1:90003。

修改為:

12listen = /var/socket/php-fpm/blog.socket #php-fpm需要自己創建,當然也可以直接放在php-fpm目錄下3。

修改成其他埠也是可以的,比如:listen = 127.0.0.1:9001。

7、到主配置文件 php-fpm.conf將「include=…」前面的注釋去掉,讓它去讀取fpm.d目錄下的配置文件。

8、到此第一種方案就修改完畢了,重新啟動測試一下:

12service php-fpm reload3。

第二種:兩個php-fpm主進程。

這種方法需要獨立的配置文件和獨立的自啟動文件:

1、復制一份php-fpm.conf主配置文件。

12cp php-fpm.conf php-fpm-blog.conf3。

2、修改主配置文件。

12vim php-fpm-blog.conf3。

2.1:修改[global]下pid和error_log文件的路徑。

修改 pid=run/php-fpm.pid 為 pid=run/php-fpm-blog.pid 。

修改 error_log = /log/php-fpm.log 為 error_log = /log/php-fpm-blog.log。

2.2:修改池的名稱[www]為[blog],不過這個可以不用修改了,因為這里和原來的進程是獨立的。

2.3:修改用戶和用戶組。

2.4:監聽埠或socket文件。

以上兩部可以按照第一種方案進行修改,這里就不再重復。

3、進入/etc/init.d目錄,復制一份自啟動文件。

12cp php-fpm php-fpm23。

4、修改自啟動文件php-fpm2:

4.1:修改配置文件路徑。

12php_fpm-CONF=${prefix}/etc/php-fpm.conf3。

12php_fpm-CONF=${prefix}/etc/php-fpm-blog.conf3。

這個路徑就是剛才的主配置文件。

4.2:修改PID文件路徑:

12php_fpm_PID=${prefix}/var/run/php-fpm.pid3。

為:

12php_fpm_PID=${prefix}/var/run/php-fpm-blog.pid3。

這個路徑要和主配置文件中的pid路徑一致。

5、修改完畢後添加自動啟動。

12chkconfig --add php-fpm23chkconfig --level 2345 php-fpm2 on4。

6、啟動服務。

E. php fpm如何增加拓展

當伺服器上PHP已經安裝好,需要額外添加PHP擴展時怎麼辦?不需要重新安裝PHP,有了phpize我們可以在原有的PHP基礎之上直接安裝擴展庫。
這次編譯僅僅只是單獨編譯PHP的擴展庫,接下來將編譯好的擴展庫加入到現在運行的php中,不對現在運行的php重新編譯,所以沒有一點的影響。

下面我們演示安裝xsl的擴展(不一定常用,僅做為一個範例)
做法一:
1.找到當前運行的php版本的源代碼目錄,如php-5.2.3。進入xsl擴展庫目錄。
$cd /home/pkgs/php-5.3.3/ext/xsl

2.調用phpize程序生成編譯配置文件。
$/home/app/php5.3.3/bin/phpize

3.編譯擴展庫,分別執行下面的configure和make命令。
$./configure-with-php-config=/home/app/php5.3.3/bin/php-config
這一步執行通過後,再執行make命令,如果configure執行不通過,則查找錯誤原因。
$make
#make成功執行後,生成的擴展庫文件在當前目錄的 moles子目錄下,
如/home/php-5.3.3/ext/curl/moles/xsl.so

4.配置php.ini文件
#將編譯好的擴展庫文件復制到PHP的擴展目錄下,可通過查看phpinfo信息。。
$ cp /home/pkg/php-5.3.3/ext/xsl/moles/xsl.so /home/app/php5.3.3/lib/php/extensions/no-debug-non-zts-20090626

#在php.ini文件中找到設置擴展目錄的位置,然後將擴展路徑設置到php安裝目錄/extension/no-debug-non....目錄下,並添加擴展庫位置。
extension_dir /home/app/php5.3.3/lib/php/extensions/no-debug-non-zts-20090626」
extension=xsl.so
5.重啟php,查看phpinfo信息,即可看到剛才添加進去的xsl擴展庫。(如果有多個php-fpm進程的話,平滑重啟主進程即可:kill -USR2 pid)

熱點內容
修改pve伺服器ip 發布:2024-05-19 18:31:52 瀏覽:468
微信密碼忘記了如何取出裡面的錢 發布:2024-05-19 18:27:35 瀏覽:329
vs2005反編譯 發布:2024-05-19 18:26:34 瀏覽:363
ug啟動語言腳本 發布:2024-05-19 18:25:57 瀏覽:874
緩存伺服器技術 發布:2024-05-19 18:25:56 瀏覽:885
androidlistview橫向 發布:2024-05-19 18:21:02 瀏覽:704
多看ftp 發布:2024-05-19 18:11:31 瀏覽:543
給定一個演算法 發布:2024-05-19 17:50:08 瀏覽:864
戀愛生物種離線緩存 發布:2024-05-19 17:49:15 瀏覽:579
卡巴斯基伺服器如何連接外網更新 發布:2024-05-19 17:42:06 瀏覽:560