Recently, a colleague has a guardianship requirement for the PHP-FPM process, i.e. if the master process of PHP-FPM quits unexpectedly (possibly crash, it could be a false kill), then the master process is expected to be pulled automatically to avoid interruption of service.
We know that supervisor is a very powerful process monitoring (monitor & Control) tool that can theoretically implement the PHP-FPM master process's daemon requirements. Therefore, I help colleagues to test how to use supervisor to complete his needs, the results show that supervisor is really an artifact, just a reasonable configuration file, it can solve the problem.
Here is my research process and the final implementation of the PHP-FPM main process daemon function configuration file, here to make a record, but also hope to help others.
1. Installing Supervisor
Supervisor itself is a Python implementation, and is the research phase, so first create a new virtualenv environment, and then install the Supervisor package with PIP.
At this point, the basic research environment has been built. Of course, PHP-FPM and PHP environments and the front-end nginx are ready for the long time.
2. Analyzing php-fpm.sh Scripts
Usually after compiling and installing PHP, PHP-FPM this 2-binary C program will also be compiled and installed, typical path in the php_install_path/sbin/directory. The directory also has a script named php-fpm.sh to control actions such as start/stop/restart/reload of the PHP-FPM process.
In the./sbin/php-fpm.sh script, the "start" Operation initiates the PHP-FPM master process, and the rest is implemented by signal to the PHP-FPM master process.
# # code segment in Php-fpm.shcase "$" in start) echo-n "Starting php-fpm" # # The following line is the key command $php _fpm_bin--d Aemonize $php _opts if ["$?"! = 0]; then echo "Failed" exit 1 fi wait_for_pid created $php _fpm_pid< c9/>if [-N "$try"]; Then echo "Failed" exit 1 Else echo ' done ' fi ;;
From the above is the terminal input "./sbin/php-fpm.sh start", the actual execution of the code, you can see that the PHP-FPM process startup parameters are? daemonize $php _opts, and the $php_opts value is "? Fpm-config $ php_fpm_conf pid $php _fpm_pid ".
Note : When php-fpm.sh starts the PHP-FPM master process, the Daemonize parameter is passed in, indicating that PHP-FPM master processes is started in Daemon (daemon) mode. According to the supervisor documentation, when using the Supervisor monitoring process, the guardianship process cannot be the daemon , because the daemon usually "ends the life" of the parent process after the child process is forked. That is, the parent process created by supervisor exits, at which point supervisor can no longer monitor the child processes that have been created by the exiting process. The behavior of Daemon process can be understood by referring to the Linux Daemon Writing howto article.
Based on the above analysis, we know that as long as supervisor starts the PHP-FPM process, it does not pass in the Daemonize parameter.
3. Supervisor configuration file that implements the PHP-FPM Master process daemon function
The above analysis has told us how to solve the problem, the following directly on the verification of the available configuration files. The file is located in the php-fpm.conf sibling directory (typical path is php_install_path/etc/).
[Inet_http_server]; inet (TCP) server disabled by defaultport=127.0.0.1:9015; (Ip_address:port specifier, *:p ort 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) 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 1024x768) minprocs=200; (min. avail process descriptors;default) 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)
The configuration file structure is easy to grasp by looking at the supervisor documentation, with two configuration items that require special attention :
1) command
It specifies the start command for the process to be monitored by the supervisor, as you can see, we have not passed the daemonize parameter to PHP-FPM, and the rest of the arguments simply expand the shell variable in the php-fpm.sh.
It has been noted that command is not a direct php-fpm, but rather the execution of two commands through Bash-c, and the first command is Sleep 1. This is due to the fact that the port that is occupied by PHP-FPM after stop is usually not released immediately, and when supervisor attempts to pull up the process at a very fast speed, it may fail several times due to the following error retry:
# # var/log/php-fpm.error.log[18-jul-2015 21:35:28] error:unable to bind listening sockets for address ' 127.0.0.1:9002 ': Ad Dress already in use (98) [18-jul-2015 21:35:28] ERROR:FPM initialization failed
And supervisor currently does not support the delay restart function, therefore, here can only be done by first sleep and then start a slightly tricky method to solve the problem, the results show that the curative effect is good and no side effects. -_-
2) AutoRestart
The documentation is described below:
May be one of false, unexpected, or true. If false, the process would never be autorestarted. If unexpected, the process would be restart when the program exits with a exit code that was not one of the exit codes Asso Ciated with this process ' configuration (see Exitcodes). If true, the process would be unconditionally restarted when it exits, without regard to its exit code.
The default value is unexpected, which indicates that supervisor will not pull the process again until the exit code exception for the monitored process. This is set to true to indicate that any time the process exits will be pulled again.
After this configuration, in the 1th step of this article set up a good virtualenv environment, run the following command to complete the Supervisor PHP-FPM Master process monitoring:
Shell> supervisord-c etc/sup.php-fpm.conf
Then, by PS x | Fgrep FPM can see that the PHP-FPM master process has been pulled up.
Then, kill the PHP-FPM main process, again PS x | Fgrep FPM You can see that a new PHP-FPM master process is created by supervisor.
At this point, the need to use Supervisor Daemon PHP-FPM master process to achieve PHP-FPM automatic restart has been resolved.
Resources
- Supervisor:a Process Control System
- Linux Daemon Writing HOWTO
========================= EOF ====================
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.