数字营销 · Web开发 · 基础设施

Linux下Nginx服务脚本的写法和原理

介绍在 Linux 下为编译安装的 Nginx 编写服务脚本,并通过 chkconfig 实现启动、停止、重启和开机自启动。

提示:本文写于 2013 年,文中涉及的 Linux 运行级别、chkconfig 以及 Nginx 服务脚本均基于当时的服务器环境,请结合文章发布时间阅读。

在 Linux 下编译使用 Nginx 的同学都知道,Linux 下编译安装的 Nginx 本身并没有自动启动的功能,而且关闭或者 reload 起来也比较麻烦。

比如关闭 Nginx,要么使用 killall 结束 Nginx 进程,要么进入 Nginx 的安装目录,通过 Nginx 自带的命令进行相关操作。

另外,有时候服务器因为一些问题需要重启,系统重启之后,Nginx 还需要手动运行,这样也比较麻烦。

下面来讲一下具体的办法。

最简单的开机自动启动方法

如果只是希望 Nginx 能够开机自动启动,有一个最简单的方法。

编辑:

/etc/rc.d/rc.local

在最后加入一行:

Nginx安装路径/sbin/nginx

这样,系统启动之后就会自动运行 Nginx。

当然,如果需要关闭、重启或者 reload Nginx,就必须进入 Nginx 的安装目录,通过

/sbin/nginx

来进行操作,也可以直接结束 Nginx 的主进程。

可以说,这样的操作还是比较麻烦的,特别是服务器中经常需要添加新网站或者测试 Nginx 参数的时候,每次都需要进入安装目录进行操作。

使用 Linux 服务管理 Nginx

这时候可以利用 Linux 的服务管理机制,手动添加一个服务,用来管理 Nginx 的守护进程。

首先来了解一下 Linux 的服务。

Linux 的服务脚本一般存放在:

/etc/rc.d/init.d/

目录下。

这些服务通常都是通过 Shell 脚本来实现的。

我们知道,Linux 有 0 到 6 一共 7 个运行级别,不同的运行级别下,启动的服务也各不相同。

在:

/etc/rc.d/

下面,可以看到:

rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d

这 7 个目录。

目录中分别存放各个运行级别下需要启动和关闭的服务。

进入我们比较常用的 rc3.d,可以发现其中的文件几乎全部都是指向:

../init.d/

目录下对应服务脚本的软链接。

其中还有一个 local 服务,是指向:

/etc/rc.d/rc.local

的。

到这里,其实就可以理解前面第一种开机自动启动 Nginx 方法的运行原理了:

系统通过 local 服务运行 rc.local 脚本,然后由 rc.local 执行 Nginx。

继续回到 rc3.d,可以发现这些服务文件虽然都是指向 ../init.d/ 下文件的软链接,但是它们的名称和 init.d 下的服务名称并不完全一样。

那么,这个命名规则又是怎样的呢?

首先,文件开头的 K 或者 S,代表服务是否在开机时启动:

  • S 代表启动
  • K 代表关闭

第二个是数字,代表服务启动或者关闭的顺序。

由于 Linux 下很多软件存在依赖关系,因此只有按照合理的顺序启动,才能保证程序正常运行。

最后就是服务名称,这个名称和:

/etc/rc.d/init.d/

下面对应的服务名称一致。

如何编写一个 Nginx 服务脚本?

那么,我们怎么去编写一个服务呢?

是不是编写完成之后,还需要手动进入对应的运行级别目录,创建服务软链接,再修改服务名称?

其实不用这么麻烦。

Linux 下的服务脚本有一些通用规则,只需要按照这些规则编写服务,系统就可以根据相关设置自动创建对应的服务链接。

下面来看一个简单的 Nginx 服务脚本:

#!/bin/bash

# chkconfig: 2345 10 90
# description: Nginx Service Script

case $1 in

start)
echo "Starting Nginx..."
/opt/nginx/sbin/nginx
;;

reload)
echo "Reloading Nginx..."
/opt/nginx/sbin/nginx -s reload
;;

stop)
echo "Stopping Nginx..."
/usr/bin/killall -s QUIT nginx
;;

restart)
echo "Restarting Nginx..."
$0 stop
$0 start
;;

*)
echo "Usage: $0 {start|reload|stop|restart}"
exit 222
;;

esac

exit 0

第一行:

#!/bin/bash

代表使用 Bash 来运行这个脚本。

第二行:

# chkconfig: 2345 10 90

是给 chkconfig 使用的配置说明。

其中:2345 代表这个服务在哪些运行级别下运行。

10 代表启动顺序。
90 代表关闭顺序。

这里需要注意,启动顺序需要合理设置。

如果数字设置得太小,例如设置为 1,那么可能在一些网络服务还没有启动之前,Nginx 就已经开始启动,从而导致 Nginx 启动失败。

第三行:

# description: Nginx Service Script

用于描述这个服务。

从 case 开始的部分,就是 Shell 脚本本身的语法,这里就不再详细介绍了。

安装服务脚本

把这个文件命名为 nginx

然后复制到 /etc/rc.d/init.d/ 目录下。

接下来增加运行权限:

chmod+x /etc/rc.d/init.d/nginx

这时候就可以直接使用:

service nginx start

来启动 Nginx。同样也可以:

service nginx stop
service nginx reload
service nginx restart

来对 Nginx 进行相应的操作。

再进入:

rc2.d
rc3.d
rc4.d
rc5.d

这些目录,就可以发现系统已经自动创建了相应运行级别的服务软链接。

如果希望 Nginx 开机自动启动,只需要:

chkconfig nginx on

执行之后,再查看相应运行级别目录,就会发现服务链接的开头已经变成了:

S

这样,Nginx 就可以交给 Linux 的服务管理机制进行统一管理了。

评论0

欢迎分享你的看法,也欢迎补充不同的实践经验。