这个问题是我上一个问题的后续问题。回顾一下
- 我想在我的 Ubuntu 14.04 服务器上使用 OpenResty 而不是普通的 Nginx。
- 我已经按照此处的说明编译了 OpenResty 。
- 编译
nginx
结束在`/usr/local/openresty/nginx/sbin' - 我现在可以
./nginx
从该文件夹启动 nginx。
问题是如果我使用通过etc安装的 Nginx 的香草版本,我需要有能力做一些事情,就像service nginx status|reload|start|stop
我通常会做的那样。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
有了这个,如果我重新启动我的服务器并发出一个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)
我在这里不明白的一件事 - 为什么有两个用户:root 和 nobody?因此,如果我从浏览器访问服务器并执行 PHP 脚本,它将以 - nobody,root ... 运行?
我检查了/var/run/nginx.pid
。那里记录的 PID 是2146,即比上面和我运行时报告的少1 netstat -anp | grep 80
。
我多次尝试最后一步 - 多次重新启动 - 结果总是一样。自然地,这意味着随后尝试重新加载或停止 Nginxservice nginx reload
并service nginx stop
失败:WRONG 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 以及如何编译它。关于如何对其进行守护进程的几句话不会出错。在黑暗中摸索了几个小时后,我想到了寻找openresty init.d。第一个出现的结果就是这个。我在下面重现该脚本
我已更正原始脚本中的遗漏 - 没有
status
方法。