1

Today I rebooted my server and PHP5-FPM failed the start due to /var/run/php5-fpm/ not being found.

The /var/run/ is cleared on reboot and most services recreate their /var/run/ directories on reboot as seen in this SF question. I always assumed that PHP5-FPM created /var/run/php5-fpm/ automatically when restarted and prior restarts have had no problems.

Has PHP5-FPM stopped creating the directory in an update or did it never create the directory anyway? My last reboot before today was over 30 days ago and I did not need to manually create the /var/run/php5-fpm/ directory for that or any previous reboots.

Do I need to add mkdir to my init.d file for php5-fpm, or is there another recommended way? Also, why did this "directory not found" error not happen before?

Other info:

The server is running Debian 7 (Wheezy), Nginx, and MySQL. /var/run is linked to /run/. /run/ has permissions of 755, owned by root.

Thanks.

PHP5-FPM file in /etc/init.d/ contents

#!/bin/sh
### BEGIN INIT INFO
# Provides:          php-fpm php5-fpm
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php5-fpm
# Description:       Starts The PHP FastCGI Process Manager Daemon
### END INIT INFO

# Author: Ondrej Sury <ondrej@debian.org>

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="PHP5 FastCGI Process Manager"
NAME=php5-fpm
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS="--daemonize --fpm-config /etc/php5/fpm/php-fpm.conf"
PIDFILE=/var/run/php5-fpm.pid
TIMEOUT=30
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Don't run if we are running upstart
if init_is_upstart; then
    exit 1
fi

#
# Function to check the correctness of the config file
#
do_check()
{
    /usr/lib/php5/php5-fpm-checkconf || return 1
    return 0
}

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS 2>/dev/null \
                || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
    start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_check $VERBOSE
        case "$?" in
            0)
                do_start
                case "$?" in
                    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
                esac
                ;;
            1) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
    stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
    status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
    check)
        do_check yes
        ;;
    reload|force-reload)
        log_daemon_msg "Reloading $DESC" "$NAME"
        do_reload
        log_end_msg $?
        ;;
    reopen-logs)
        log_daemon_msg "Reopening $DESC logs" $NAME
        if start-stop-daemon --stop --signal USR1 --oknodo --quiet \
            --pidfile $PIDFILE --exec $DAEMON
        then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;
    restart)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
    *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
        exit 1
    ;;
esac

:
ansonl
  • 111
  • 1
  • 6

3 Answers3

1

I think it depends on how this set in your configuration.

On my debian setup I dont have that dir only have a php5-fpm.pid on var/run

But I have a socket on /var/lib/php5-fpm in orther setups the socket is on /tmp but is because I have set it there, and dont have the var/lib/php5-fpm

So I think you configure that for create socket on /var/run/php5-fpm but that dir deleted con reboot and php5-fpm dont create it for default ( this is my case, php5-fpm create sockets but if the dir does not exist php5-fpm does not create the socket and you need create dir before )

So check your settings and see where the socket is created.

Skamasle
  • 412
  • 2
  • 10
  • The socket is created in the `/var/run/php5-fpm folder`. – ansonl Sep 13 '13 at 16:00
  • Try to change that location. If you create something on var/run is deleted on reboot, try to make a dir there and then reboot and you see that, thats the problem, try to change socket locations to /var/lib/php5-fpm, /tmp or directly on /var/run, but not on /var/run/somedir – Skamasle Sep 13 '13 at 18:39
  • I check the default conf file for PHP5-FPM, and the default location is in `/var/run/php5-fpm.sock`. Is there a better place to put these sockets? I thought the reason for sockets to be there was so they would be cleared on purpose. Is putting them else where a safe practice? I haven't been able to find nay information regarding either. – ansonl Sep 13 '13 at 18:51
  • Safe to pur sockets on /var/run there is de default socket and pid, you can leave there all sockets web1.sock, web2.sock but can put it on orther dir and the performance will the same, ispconfig panel put it by default on /var/lib/php5-fpm/ orther installs leave it on /tmp The most important is that php5-fpm does not create directories, so the socket must be in a directory that is not removed on reboot. PD and socket is created by file.conf located on pool.d dir. /etc/php5/fpm/ – Skamasle Sep 13 '13 at 21:04
  • Okay, thanks. Do you know why other programs can write to `/var/run/` while PHP5-FPM all of a sudden cannot? – ansonl Sep 13 '13 at 21:23
  • php5-fpm can write there, but php5-fpm dont make dirs, I dont know why, but for example if you set sockets on /tmp/php5-fpm/web.sock and dir php5-fpm does not exist php5-fpm renurt a dir not found and you need create dir manually, a lot of programs work similar. – Skamasle Sep 13 '13 at 22:43
0

If I had to guess the folder should be manually created and this is a permissions problem. Make sure the proper permissions are set for that folder.

David Eisen
  • 633
  • 5
  • 21
  • The `/var/run/` directory is a link to `/run/`. `/run/` has the permissions 755 owned by root. I can't seem to find the correct permissions for `/run/`. Also, since the other services can mkdir in `/run/`, would this still signal is permissions problem? – ansonl Sep 13 '13 at 16:53
0

I still don't know why PHP5-FPM stopping working all of a sudden, but since the problem is due to PHP5-FPM not being able to make directories in /var/run/, a workaround is to add the command

mkdir /var/run/php5-fpm/

to the /etc/init.d/php5-fpm file under function do_start().

This way when PHP5-FPM starts, it will create the directory /var/run/php5-fpm/.

Note: /var/run is linked to /run/ so /run/ may work on your system, too.

ansonl
  • 111
  • 1
  • 6