如何通过upstart启动Nginx?


9

背景:

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

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

来自站点的nginx新贵脚本:

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来运行它时,我得到了“未知工作”,这显然是我发现的,这意味着有错误(“ Error”描述错误是什么问题?)

有人可以指出我正确的方向吗?我已经按原样阅读了文档,对于SysV init替换来说似乎有点稀疏...但是只需要将这项工作添加到列表中,然后运行它,然后继续我剩下的工作即可。 .. 有小费吗?

编辑:initctl版本init(upstart 0.6.5)


1
关于“未知工作”与“错误”的一种评论。您只是在错误的地方看。Initctl不会读取配置文件,它只是要求Upstart加载一个已知的作业-当您发出initctl命令时,upstart不知道该作业。Upstart尝试读取作业文件时,较早发生了错误。系统日志中应该有一条错误消息(/ var / log / syslog,/ var / log / messages或您的系统存储这些日志的任何地方)
Jacek Konieczny,2010年

顺便说一句,事实证明/ sbin中有启动和停止命令,用于启动作业。他们为我工作。现在,它们链接回了initctl,所以我不确定它们为什么起作用,但是它们起作用了。
chiggsy

Answers:


3

stop onUpstart> = 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

仍然未知的工作,a。您从哪里获得此信息?男子?信息?线上?0.6.5在哪里记录?
嬉皮士2010年

有点工作.. thnx
时髦2010年

是的,至少在网络上很难找到最新的Upstart文档。但是手册页相当不错。试试: man 5 init
Jacek Konieczny,2010年

1
这不是在生产服务器上运行nginx的正确方法。该daemon off选项仅用于开发。
PhilT 2012年

16

我在这里结束了不止一次,所以我认为在使用了这里的答案之后,我将根据自己的经验提供一个更新的答案。特别感谢@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 DAEMONenv PID行,具体取决于您在哪里安装了nginx并正在编写PID。可以在nginx中配置PID。

我尝试了各种形式的expectexpect fork似乎只有工作。Nginx使用乘客创建了61个叉子。Upstart需要0、1或2。正如其他人所暗示的,Upstart将跟踪错误的PID。我也删除respawn了它,因为相同的原因它什么也没做。一些其他的启动前/启动后脚本可能能够通过获取实际的PID来解决此问题。但是,我使用monit处理重启,因此不需要它。

不要使用daemon off。这仅用于开发。参见http://wiki.nginx.org/CoreModule#daemon

参考文献:


1
我会认为你想用运行daemon off;,使腕表新贵正确的流程/ PID,而无需为expect forkpost-stop指令。在维基节描述的守护进程选项也指出:“你可以在生产模式与runit / daemontools的使用守护关安全,但你不能做一个优雅的升级。”,我以为是指升级到在新的二进制飞行功能。
加里

3

你不能 无论如何,至少不正确。

Nginx不会以新贵需要的两种方式之一(通过“ expect fork”或“ expect daemon”)来生成其守护进程,因此,新贵无法跟踪主nginx进程。有一些技巧,但是它们有自己的问题。

如果您对新贵无法跟踪主进程并在关机时将其杀死的事实感到满意,则可以这样做:

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

expect daemon导致upstart为我挂起(Ubuntu 12.04,Upstart 1.5,Nginx)。expect fork尽管工作如@danorton提示,但Upstart将跟踪错误的PID。我也无法重生(请参阅我的完整答案)。
PhilT 2012年

2

有一个新贵配置文件例如NGINX的Wiki

您可能需要在配置文件中调整nginx二进制文件的路径。

对于Ubuntu 10.04和nginx 1.0.5,此配置文件对我来说工作正常。

我还安装了一个指向的nginx符号链接/etc/init.d/lib/init/upstart-job因此可以使用标准service命令启动和停止nginx

注意:如果将Phusion Passenger与NGINX一起安装,则可能需要将以下节添加到Upstart配置脚本中:

env PID=/opt/nginx/logs/nginx.pid
post-stop script
    start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script

我发现在我的Ubuntu配置中这是必需的。否则,当我发布initctl stop nginxservice nginx stopnginx时并没有真正停止。我还注意到Upstart认为nginx进程具有一个PID,该PID实际上是乘客进程之一的PID。因此很明显,NGINX / Passenger使Upstart有点混乱。


感谢您为乘客提供的脚本。这似乎停止了进程,但是我stop: Job failed while stopping这样做了。你看到了吗?
PhilT 2011年

我和@PhilT有同样的问题,对此有任何疑问吗?
克劳迪奥·波利

0

我用:

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 Wiki上查看所有的文档。


不幸的是,该Wiki似乎暗示它只是0.5版。以这种方式记录了如此重要的变化,这让我感到很奇怪。
chiggsy

什么是0.5版本?
Jim Mitchener 2010年

一般的Wiki。手册页还可以,但是它们肯定不是“信息”页,通常情况下会更加详细。
chiggsy 2010年


0

奇怪的是,这里没有一个答案能真正完全起作用,因为它们使新贵处于停止/终止状态,从而阻止了另一个新作品的开始。这意味着restart nginx失败。

带有upstart的错误已在https://bugs.launchpad.net/upstart/+bug/406397上得到了很好的记录,令我惊讶的是,upstart的作者似乎并不十分在意修复它。我看到的唯一可行的解​​决方案如下(从同一错误报告中窃取):

# nginx - Nginx Web Server
#

description "Nginx Web Server"

start on (local-filesystems and
    (net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]

env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid

respawn

pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script

script
sleepWhileAppIsUp(){
    while pidof $1 >/dev/null; do
    sleep 1
    done
}
sleepWhileAppIsUp $DAEMON
end script

post-stop script
if pidof > /dev/null $DAEMON;
then
    $DAEMON -s stop
fi
end script

这样写的好处是,即使重生也可以。缺点是丑陋且令人讨厌。


暴发户几乎是一个死产物。Ubuntu是几乎最后一个使用它的发行版。所有其他人都已离开或已经切换。
迈克尔·汉普顿

甚至Ubuntu本身也已切换到较新版本的systemd。但是,由于LTS,我们中的一些系统管理员仍然停留在14.04上。
伊万·阿尼舒克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.