Two instances of Apache on the same server

Two instances of Apache on the same server

Gabor Szabo szabgab at gmail.com
Tue Oct 5 15:42:10 IST 2010


I need to run two instances of Apache on the same SuSE based server but there
is something very basic I don't manage. In order to run to servers
I'll need two pid files
to hold the two process ids. So the first thing I tried was to change
the pidfile for the existing server.

I shut down Apache and the changed  /etc/init.d/apache2
the following line:

: ${pidfile:=/var/run/httpd2.pid}

to:

: ${pidfile:=/var/run/httpd2b.pid}

The problem is that after starting the web server using

/etc/init.d/apache2 start

it still created the /var/run/httpd2.pid file and NOT the
/var/run/httpd2b.pid file.

When I tried to stop the web server:
 /etc/init.d/apache2 stop
I got:
"Shutting down httpd2 (not running) "

As an experience, then I renamed
/var/run/httpd2.pid to /var/run/httpd2b.pid
and tried to shut down the server again

/etc/init.d/apache2 stop

It printed:
Shutting down httpd2 (waiting for all children to terminate)
and then it got stuck for quite a while (20-30 sec maybe)
In the end it stopped the server but also left the
/var/run/httpd2b.pid file.

I am quite lost as looking at the /etc/init.d/apache2 script I don't know
where does it take the old name from. Not even where does it create
the pid file.


regards
  Gabor


ps. This is the /etc/init.d/apache2 script:
   ---------------------------------------------------
#!/bin/sh
#
# Copyright (c) 1996, 1997, 1998 S.u.S.E. GmbH
# Copyright (c) 1998, 1999, 2000, 2001 SuSE GmbH
# Copyright (c) 2002, 2003, (2004?) SuSE Linux AG
# Copyright (c) 2004(?), 2005, 2006, 2007, 2008 SUSE Linux Products GmbH
#
# Authors: Rolf Haberrecker <apache at suse.de>, 2001
#          Peter Poeml <apache at suse.de>, 2002, 2003, 2004, 2005, 2006,
2007, 2008
#
#
# /etc/init.d/apache2
#
### BEGIN INIT INFO
# Provides:			apache apache2 httpd
# Required-Start:		$local_fs $remote_fs $network
# Should-Start:			$named $time postgresql sendmail mysql ypclient dhcp radiusd
# Should-Stop:			$named $time postgresql sendmail mysql ypclient dhcp radiusd
# Required-Stop:		$local_fs $remote_fs $network
# Default-Start:		3 5
# Default-Stop:			0 1 2 6
# Short-Description:		Apache 2.2 HTTP Server
# Description:			Start the Apache HTTP daemon
### END INIT INFO

pname=apache2
: ${sysconfdir:=/etc/$pname}
: ${apache_link:=/usr/sbin/httpd2}
: ${sysconfig_apache:=/etc/sysconfig/$pname}
: ${pidfile:=/var/run/httpd2b.pid}
: ${logdir:=/var/log/$pname}
: ${homedir:=/var/lib/$pname}

#
# load the configuration
#

#
# Note about ulimits:
# if you want to set ulimits, e.g. to increase the max number of open
file handle,
# or to allow core files, you can do so by editing /etc/sysconfig/apache2 and
# simply write the ulimit commands into that file.
# Example:
# ulimit -n 16384
# ulimit -H -n 16384
# ulimit -c unlimited
# See the output of "help ulimit" in the bash, or "man 1 ulimit".
#
test -s /etc/rc.status && . /etc/rc.status && rc_reset

. /usr/share/$pname/load_configuration
export ${!APACHE_*}

httpd_conf=${APACHE_HTTPD_CONF:-$sysconfdir/httpd.conf}

apache_bin=$(/usr/share/$pname/find_mpm 2>/dev/null)

test -L $apache_link && apache_bin=$(readlink $apache_link)

if [ -z "$APACHE_MPM" ]; then
	APACHE_MPM=${apache_bin##*-}
fi

if ! [ -x $apache_bin ]; then
	echo >&2 ${warn}$apache_bin-$APACHE_MPM is not a valid httpd2 binary.
	echo >&2 Check your APACHE_MPM setting in /etc/sysconfig/$pname. $norm
	rc_failed 5
	rc_status -v1
	rc_exit
fi

# a proper home should be set, otherwise the server might end up
# with HOME=/root and some script might try to use that
HOME=$homedir

get_server_flags()
{
	unset server_flags
	case "$action" in startssl) server_flags="-DSSL";; esac
	for i in $APACHE_SERVER_FLAGS; do
		case $i in
		-D)	;;
		-D*)	server_flags="$server_flags $i";;
		*)	server_flags="$server_flags -D$i";;
		esac
	done
}

action="$1"
case "$action" in
    stop|try-restart|*status*|probe)
	;;
    *)
	shift; get_server_flags
	${get_module_list_done:=false} || /usr/share/$pname/get_module_list
&& export get_module_list_done=true
	${get_includes:=false} || /usr/share/$pname/get_includes && export
get_includes_done=true
	;;
esac

#
# main part
#
case "$action" in
    start*)
	if [ -e $pidfile ]; then
	        $0 status &>/dev/null
		ret=$?
		if [ $ret = 1 ]; then
				echo "Warning: found stale pidfile (unclean shutdown?)"
		elif [ $ret = 0 ]; then
				echo "Apache is already running ($pidfile)"
				rc_failed $ret
				rc_status -v1
				rc_exit
		fi
	fi

	echo -n "Starting httpd2 (${APACHE_MPM:-${apache_bin#*-}}) "
	cmdline=$(echo $apache_bin -f $httpd_conf $server_flags "$@")
	if eval $cmdline -t > $logdir/rc$pname.out 2>&1 ; then
		export -n ${!APACHE_*}
		eval startproc -f -t ${APACHE_START_TIMEOUT:-2} $cmdline
		ret=$?

		if test -t 1 && stty -a 2>/dev/null | grep -q -- -echo\ ; then
			# this means that apache was still waiting for a passphrase to be entered
			stty echo 2>/dev/null
			echo;echo
			echo >&2 An SSL passphrase has not been entered within
${APACHE_START_TIMEOUT:-<not set>} seconds.
			echo >&2 To increase this timeout, adjust APACHE_START_TIMEOUT in
$sysconfig_apache .
			# this surely means that apache won't start, despite it looked good
to startproc
			killall $apache_bin
			echo >&2 "Trying to start the server without SSL (-D NOSSL)."
			$0 start "$@" -D NOSSL
			# rc_failed 1
			# rc_status -v1
			# rc_exit
		else
			rc_failed $ret
			rc_status -v
		fi
	else
		if [ "$link" = "$base" ] ; then
			cat $logdir/rc$pname.out
			echo >&2
			echo >&2 The command line was:
			echo >&2 $cmdline
			echo >&2
		else
			echo -e -n "\nsee $logdir/rc$pname.out for details\n";
		fi
		rc_failed 1
		rc_status -v1
        fi
	;;
    stop)
	echo -n "Shutting down httpd2 "
        if [ ! -f $pidfile -a -f $pidfile.rpmsave ]; then mv
$pidfile.rpmsave $pidfile; fi
	if ! [ -f $pidfile ]; then
		echo -n "(not running)"
	else
		pid=$(<$pidfile)
		kill -TERM $pid 2>/dev/null
		case $? in
		    1)  echo -n "(not running)";;
		    0)  # wait until the processes are gone (the parent is the last one)
			echo -n "(waiting for all children to terminate) "
			for ((wait=0; wait<120; wait++)); do
				if test -f $pidfile; then
					usleep 500000
					continue
				fi
				if ! test -f /proc/$pid/exe; then
					break
				fi
				if test "$(readlink /proc/$pid/exe 2>/dev/null)" = $apache_bin; then
					usleep 500000
				else
					break
				fi

			done
			;;
		esac
	fi

	rc_status -v
	;;
    stop-graceful)
        echo "Shutting down httpd2 gracefully (SIGWINCH)"
        if ! [ -f $pidfile ]; then
                echo -n "(not running)"
        else
                pid=$(<$pidfile)
                kill -WINCH $pid 2>/dev/null
                case $? in
                    1)  echo -n "(not running)";;
                    0)  # wait until the pidfile is gone. The parent
stays there, but closes the listen ports.
                        echo -n "(waiting for parent to close listen
ports and remove pidfile) "
                        for ((wait=0; wait<120; wait++)); do
                                if test -f $pidfile; then
                                        usleep 500000
                                        continue
                                else
                                        break
                                fi
                        done
                        ;;
                esac
        fi

	rc_status -v
	;;
    try-restart)
	## Do a restart only if the service was active before.
	## Note: try-restart is now part of LSB (as of 1.9).
	## RH has a similar command named condrestart.
	$0 status
	if test $? = 0; then
		$0 restart
	else
		rc_reset        # Not running is not a failure.
	fi
	# Remember status and be quiet
	rc_status
	;;
    restart)
	$0 configtest "$@" || { rc_failed $?; rc_exit; }

	if $0 status &>/dev/null; then
		$0 stop
	fi
	$0 start "$@"
	# Remember status and be quiet
	rc_status
	;;
    restart-hup)
	$0 configtest "$@" || { rc_failed $?; rc_exit; }

	if $0 status &>/dev/null; then
		echo -n "Restarting httpd2 (SIGHUP)"
		kill -HUP $(<$pidfile) || return=$rc_failed
	else
		$0 start "$@"
	fi
	# Remember status and be quiet
        rc_status -v
	;;
    restart-graceful)
	$0 configtest "$@" || { rc_failed $?; rc_exit; }

	if $0 status &>/dev/null; then
		$0 stop-graceful "$@"
		$0 start "$@"
	else
		$0 start "$@"
	fi
	# Remember status and be quiet
        rc_status
	;;
    reload|force-reload|graceful)
	echo -n "Reload httpd2 (graceful restart)"
	cmdline=$(echo $apache_bin -f $httpd_conf $server_flags "$@")
	if eval $cmdline -t &> $logdir/rc$pname.out; then
		killproc -USR1 $apache_bin || return=$rc_failed
		rc_status -v
	else
		if [ "$link" = "$base" ] ; then
			echo -e -n "\n\n"
			cat $logdir/rc$pname.out
			echo >&2
			echo >&2 The command line was:
			echo >&2 $cmdline
			echo >&2
		else
			echo -e -n "\nsee $logdir/rc$pname.out for details\n";
		fi
		rc_failed 6
		rc_status -v1
        fi
	;;
    status)
        if [ ! -f $pidfile -a -f $pidfile.rpmsave ]; then mv
$pidfile.rpmsave $pidfile; fi
        echo -n "Checking for httpd2: "
	# we don't use checkproc here since it is confused when we exchange
the binaries
	if ! [ -f $pidfile ]; then
		# not running
		rc_failed 3
	elif [ -s $pidfile -a -d /proc/$(<$pidfile) ]; then
		# running
		:
	else
		# stale pid file
		rc_failed 1
		#rm -f $pidfile
	fi
	rc_status -v
	;;
    probe)
        ## Optional: Probe for the necessity of a reload,
        ## give out the argument which is required for a reload.

	for i in $httpd_conf \
	  $APACHE_CONF_INCLUDE_FILES \
	  $APACHE_CONF_INCLUDE_DIRS
	do
		if [ $i -nt $pidfile ]; then
			echo reload
			break
		fi
	done
        ;;

    conf*|test|syntax|check)
	cmdline=$(echo $apache_bin -f $httpd_conf $server_flags "$@")
	eval $cmdline -t
	rc_failed $?
	rc_exit
	;;

    extr*)
	cmdline=$(echo $apache_bin -f $httpd_conf $server_flags "$@")
	out=$(su - nobody -c "$cmdline" 2>&1)
	case $out in
	    *make_sock:\ could\ not\ bind\ to\ address*) echo Syntax: OK; rc_failed=0;;
	    *) echo Syntax: NOT OK:; echo $out; rc_failed=1;;
	esac
	rc_exit
	;;

    server-status)
	apache2ctl status
	;;

    full-server-status|fullstatus)
	apache2ctl fullstatus
	;;

    *)
    cat >&2 <<-EOF
	Usage: $0 <command> <server flags>

	where <command> is one of:
	        start              - start httpd
	        startssl           - start httpd with -DSSL
	        stop               - stop httpd (sending SIGTERM to parent)
	        try-restart        - stop httpd and if this succeeds (i.e. if
	                             it was running before), start it again.

	        status             - check whether httpd is running

	        restart            - stop httpd if running; start httpd
	        restart-graceful   - stop httpd gracefully if running; start httpd
	        reload|graceful    - do a graceful restart by sending a SIGUSR1, or
	                             start if not running
	        stop-graceful      - stop httpd (sending SIGWINCH to parent)

	        configtest         - do a configuration syntax test
	        extreme-configtest - try to run httpd as nobody (detects more errors
	                             by actually loading the configuration, but cannot
	                             read SSL certificates)
	        probe              - probe for the necessity of a reload, give
	                             out the argument which is required for a reload.
	                             (by comparing conf files with pidfile timestamp)

	        full-server-status - dump a full status screen; requires lynx or w3m
	                             and mod_status enabled
	        server-status      - dump a short status screen; requires lynx or w3m
	                             and mod_status enabled

	        help               - this screen
	
	optional server flags are passed through to httpd.
	
	EOF
    exit 1
esac


# Inform the caller not only verbosely and set an exit status.
rc_exit



More information about the Linux-il mailing list