如何通过 upstart 启动 nginx?

如何通过 upstart 启动 nginx?

背景:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"

我已经构建了 nginx,我想使用 upstart 来启动它:

来自站点的 nginx upstart 脚本:

description "nginx http daemon"

start on runlevel 2

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

console owner

exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"

respawn

当我尝试使用 initctl 运行它时,我收到“未知作业”,我刚刚了解到这显然意味着存在错误,(用“错误”描述错误有什么问题?)

有人能给我指出正确的方向吗?我已经阅读了文档,但对于 SysV init 替代品来说,它似乎有点简略……但无论如何,只需将这个作业添加到列表中,运行它,然后继续我剩下的生活……有什么建议吗?

编辑:initctl 版本 init(upstart 0.6.5)

答案1

stop on对于 Upstart >= 0.5,upstart 作业描述中不能包含多个指令。

console owner可能不是您想要的(这会使 nginx 成为系统控制台的所有者)。

尝试:

description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf  -g "daemon off;"
respawn

答案2

我已经来这里不止一次了,所以我想根据自己使用这里的答案后的经验提供一个更新的答案。特别感谢@danorton 和@orj 的回答。

此脚本已在 Ubuntu 12.04 上运行的 Upstart 1.5 上进行了测试,该版本搭载了 Nginx 1.0.11 和 Passenger 3.0.11。如果您不使用 Passenger,则可能需要尝试使用该post-stop行。请参阅 Upstart cookbook。

在空白处/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 脚本并对其进行了调整,因为其中许多行是不需要的、会引起混淆或者不起作用。

您可能需要根据您安装 nginx 的位置以及写入 PID 的位置来更改env DAEMON和行。PID 可以在 nginx 中配置。env PID

我尝试了所有形式的expect。只有expect fork似乎有效。使用 Passenger nginx 创建 61 个分支。Upstart 需要 0、1 或 2。正如其他人所暗示的那样,Upstart 将跟踪错误的 PID。我还删除了它,respawn因为它可能出于同样的原因什么也不做。一些额外的启动前/启动后脚本可能能够通过获取真实 PID 来解决这个问题。但是,我使用 monit 来处理重启,所以不需要它。

请勿使用daemon off。这仅用于开发。请参阅http://wiki.nginx.org/CoreModule#daemon

参考:

答案3

你不能。至少不能正确地做到这一点。

Nginx 不会以 upstart 要求的两种方式(通过“expect fork”或“expect daemon”)生成其守护进程,因此 upstart 无法跟踪主 nginx 进程。有一些 hack 可以做到,但它们也有自己的问题。

如果你不介意 upstart 无法跟踪主进程并在关机时终止它,那么这样做可以奏效:

start on local-filesystems \
  and (net-device-added INTERFACE=lo) \
  and (runlevel [12345])
stop on runlevel [06]

env DAEMON=/usr/sbin/nginx

respawn
respawn limit 10 5

expect daemon

pre-start script
  $DAEMON -t
end script

$DAEMON

答案4

我用:

description "Nginx HTTP Server"

start on filesystem
stop on runlevel [!2345]

respawn

exec /opt/nginx/sbin/nginx -g "daemon off;"

停止runlevel [!...]似乎更标准。这是股票 ssh/samba 脚本所做的。您还应该添加位,respawn以便在它死机时重新启动。我也不确定您为什么要console output只将控制台输出发送到 stdout。默认行为是只将控制台输出发送到记录器。

你可以看到所有的文档Upstart 维基百科

相关内容