Этот вопрос следует за моим предыдущим вопросом. Резюмировать
nginx
заканчивается в '/usr/local/openresty/nginx/sbin'./nginx
от той папки для запуска nginx.Проблема состоит в том, что у меня должна быть способность сделать материал как service nginx status|reload|start|stop
поскольку я обычно делал бы, если бы я использовал ванильную версию Nginx, установленного через apt-get install nginx|nginx-extras
и т.д.
Мои знания таких проблем являются довольно элементарными. Однако посредством взламывания /etc/init.d/nginx
сценарий, который создается apt-get install nginx
и изменяя идеи, описанные здесь, я создал свое собственное /etc/init.d/nginx
сценарий, который я воспроизвожу ниже
#!/bin/sh
NAME="nginx"
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
APP="/usr/local/openresty/nginx/sbin/nginx"
if [ -r /etc/default/nginx ]; then
. /etc/default/nginx
fi
. /lib/init/vars.sh
. /lib/lsb/init-functions
PID=$(cat /usr/local/openresty/nginx/conf/nginx.conf | grep -Ev '^\s*#' |
awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1)
if [ -z "$PID" ]
then
PID=/var/run/nginx.pid
fi
if [ -n "$ULIMIT" ]; then
ulimit $ULIMIT
fi
start() {
printf "Starting '$NAME'... "
start-stop-daemon --start --background --make-pidfile --pidfile
/var/run/$NAME.pid --exec "$APP"
printf "done\n"
}
killtree() {
local _pid=$1
local _sig=${2-TERM}
for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
killtree ${_child} ${_sig}
done
kill -${_sig} ${_pid}
}
stop() {
printf "Stopping '$NAME'... "
[ -z `cat /var/run/$NAME.pid 2>/dev/null` ] || \
while test -d /proc/$(cat /var/run/$NAME.pid); do
killtree $(cat /var/run/$NAME.pid) 15
sleep 0.5
done
[ -z `cat /var/run/$NAME.pid 2>/dev/null` ] || rm /var/run/$NAME.pid
printf "done\n"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/nginx.pid
--name nginx
;;
status)
status_of_proc -p /var/run/nginx.pid "nginx" "nginx" && exit 0 || exit $?
;;
*)
echo "Usage: $NAME {start|stop|restart|reload|status}" >&2
exit 1
;;
esac
exit 0
С этим на месте, если я перезагружаю свой сервер и проблему a lsof -nP -i | grep LISTEN
Я получаю вывод
nginx 2247 root 6u IPv4 14166 0t0 TCP *:80 (LISTEN)
nginx 2248 nobody 6u IPv4 14166 0t0 TCP *:80 (LISTEN)
Одна из вещей я не понимаю здесь - почему два users:root и никто? Таким образом, если бы я посетил сервером из браузера и выполнил Сценарий PHP, то он был бы выполнен как - никто, базировался бы...?
Я исследовал /var/run/nginx.pid
. PID, зарегистрированный там, 2146, т.е. 1 МЕНЬШЕ, чем, о чем сообщают выше и когда я работаю netstat -anp | grep 80
.
Я несколько раз пробовал этот последний шаг по - несколько перезагрузок - со всегда тем же результатом. Естественно, это означало что последующие попытки перезагрузить или остановить Nginx через service nginx reload
и service nginx stop
отказавший: НЕПРАВИЛЬНЫЙ PID!
Когда я вручную отредактировал /var/run/nginx.pid
гарантировать, что это имеет правильные вещи PID работа как ожидалось.
Я должен признать, что работаю вне своего знания того, как такие вопросы работают здесь. Я был бы очень признателен за любую справку, устраняющую проблемы, с которыми я столкнулся здесь.
Я отправляю ответ здесь в надежде, что он сохранит других часы разочарования, которое я должен был вынести. Легкая проблема для рассматриваний здесь nobody
пользователь, о котором я говорю выше. Это происходит вполне просто, потому что nginx.conf
файл, созданный openresty - видит
/usr/local/openresty/nginx/conf/nginx.conf
, не потрудился определять пользователя. Просто отредактируйте первую строку
#user nobody
, таким образом, она читает user www-data www-data
и что конкретный вопрос отсортирован.
второй выпуск init.d
сценарий. Я боюсь, что openresty документация должна взять вину здесь. Они переходят к некоторым длинам, чтобы объяснить, как получить openresty & как скомпилировать его. Несколько слов о том, как к daemonize это не потерялось бы.
После часов блуждания в темноте я думал о поиске openresty init.d. Самый первый результат, который подошел, был этот . Я воспроизвожу тот сценарий ниже
#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Nginx Daemon"
NAME=nginx
PREFIX=/usr/local/openresty/nginx
DAEMON=$PREFIX/sbin/$NAME
CONF=$PREFIX/conf/$NAME.conf
PID=$PREFIX/logs/$NAME.pid
SCRIPT=/etc/init.d/$NAME
. /lib/lsb/init-functions
if [ ! -x "$DAEMON" ] || [ ! -f "$CONF" ]; then
echo -e "\033[33m $DAEMON has no permission to run. \033[0m"
echo -e "\033[33m Or $CONF doesn't exist. \033[0m"
sleep 1
exit 1
fi
do_start() {
if [ -f $PID ]; then
echo -e "\033[33m $PID already exists. \033[0m"
echo -e "\033[33m $DESC is already running or crashed. \033[0m"
echo -e "\033[32m $DESC Reopening $CONF ... \033[0m"
$DAEMON -s reopen -c $CONF
sleep 1
echo -e "\033[36m $DESC reopened. \033[0m"
else
echo -e "\033[32m $DESC Starting $CONF ... \033[0m"
$DAEMON -c $CONF
sleep 1
echo -e "\033[36m $DESC started. \033[0m"
fi
}
do_stop() {
if [ ! -f $PID ]; then
echo -e "\033[33m $PID doesn't exist. \033[0m"
echo -e "\033[33m $DESC isn't running. \033[0m"
else
echo -e "\033[32m $DESC Stopping $CONF ... \033[0m"
$DAEMON -s stop -c $CONF
sleep 1
echo -e "\033[36m $DESC stopped. \033[0m"
fi
}
do_reload() {
if [ ! -f $PID ]; then
echo -e "\033[33m $PID doesn't exist. \033[0m"
echo -e "\033[33m $DESC isn't running. \033[0m"
echo -e "\033[32m $DESC Starting $CONF ... \033[0m"
$DAEMON -c $CONF
sleep 1
echo -e "\033[36m $DESC started. \033[0m"
else
echo -e "\033[32m $DESC Reloading $CONF ... \033[0m"
$DAEMON -s reload -c $CONF
sleep 1
echo -e "\033[36m $DESC reloaded. \033[0m"
fi
}
do_quit() {
if [ ! -f $PID ]; then
echo -e "\033[33m $PID doesn't exist. \033[0m"
echo -e "\033[33m $DESC isn't running. \033[0m"
else
echo -e "\033[32m $DESC Quitting $CONF ... \033[0m"
$DAEMON -s quit -c $CONF
sleep 1
echo -e "\033[36m $DESC quitted. \033[0m"
fi
}
do_test() {
echo -e "\033[32m $DESC Testing $CONF ... \033[0m"
$DAEMON -t -c $CONF
}
do_info() {
$DAEMON -V
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
reload)
do_reload
;;
restart)
do_stop
do_start
;;
status)
status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $?
;;
quit)
do_quit
;;
test)
do_test
;;
info)
do_info
;;
*)
echo "Usage: $SCRIPT {start|stop|reload|restart|quit|test|info}"
exit 2
;;
esac
exit 0
пропуск в исходном сценарии, который я исправил - не было никакого status
метод.