我在这里结束了不止一次,所以我认为在使用了这里的答案之后,我将根据自己的经验提供一个更新的答案。特别感谢@danorton和@orj的回答。
该脚本已经在运行于Ubuntu 12.04的Nginx 1.0.11和Passenger 3.0.11的Upstart 1.5上进行了测试。如果您不使用乘客,则可能需要玩转乘火车post-stop
。请参阅新贵食谱。
在空白处/etc/init/nginx.conf
添加以下行(您可以根据需要删除评论):
description "nginx http daemon"
start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]
env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid
# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork
# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t
# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT
# Start Nginx
exec $DAEMON
我已经从Nginx Wiki上获取了Upstart脚本,并对其进行了调整,因为不需要很多行,引起混乱或不起作用。
您可能需要更改env DAEMON
和env PID
行,具体取决于您在哪里安装了nginx并正在编写PID。可以在nginx中配置PID。
我尝试了各种形式的expect
。expect fork
似乎只有工作。Nginx使用乘客创建了61个叉子。Upstart需要0、1或2。正如其他人所暗示的,Upstart将跟踪错误的PID。我也删除respawn
了它,因为相同的原因它什么也没做。一些其他的启动前/启动后脚本可能能够通过获取实际的PID来解决此问题。但是,我使用monit处理重启,因此不需要它。
不要使用daemon off
。这仅用于开发。参见http://wiki.nginx.org/CoreModule#daemon
参考文献: