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

 分类: Server

在linux下编译使用Nginx的同学都知道,Linux下Nginx本身并没有自动启动的功能,并且关闭或者reload起来都比较麻烦,比如关闭,要么通过killall结束nginx进程,要么进入nginx安装目录通过nginx -t的指令进行相关操作。另外一点,有时候服务器可能有问题需要重启,系统重启之后,nginx还需要手动运行,这样都比较麻烦。下面来讲一下具体的办法:

如果你只需要让nginx开机自己自动,有个最简单的办法,编辑/etc/rc.d/rc.local文件,在最后加入一行”nginx安装路径/sbin/nginx” 即可(不包含引号),系统将会在启动之后自动启动nginx。当然,如果你需要关闭,重启,或者reload就必须要进入到nginx的安装目录,通过/sbin/nginx来操作(也可以直接kill掉nginx主进程来关闭)。可以说,这样是非常麻烦的,特别是在经常要往服务器里添加新网站或者测试参数,添加之后,每次都需要进入安装目录操作。

这时候可以通过linux的服务管理来手动添加一个服务,用来管理nginx的守护进程。首先来了解一下linux的服务,Linux的所有的服务都存放在/etc/rc.d/init.d/目录下,所有的服务都是用shell脚本写的。我们知道,linux有0到6一共7个运行级别,不同的运行级别下,它们运行的服务也各不一样。在/etc/rc.d/下面,有rc0.d-rc6.d一个7个目录,目录下分别存放各个运行级别下的服务。进入一个我们最常用的运行级别rc3.d,可以发现它下面的文件几乎全部都是指向../init.d/,有一个local服务是指向上面讲的/etc/rc.d/rc.local,这里我们就知道Nginx第一种开机自动方法的运行原理了:系统有一个local服务,通过启动rc.local这个脚本,来运行相应的程序。继续回到rc3.d,我们发现这些服务文件虽然是指向../init.d/下文件的软连接,但是它们的名称和../init.d/下的不一样。那么这个命名规则又是怎样的呢?首先,文件开头的K或者S,代表开机是否启动,S代表开机启动,K则不是;第二个是数字,代表的是启动顺序,由于linux下一些软件的依赖性比较强,只有按顺序启动才能保证程序运行的正确;第二个是服务名,和../init.d/下的是一样的。

那么我们怎么去编写一个服务呢,是不是编写好之后,都需要去相应的运行级别下,创建服务的软链接,然后更改一下服务名?其实远不用这么麻烦,linux下服务有一些通用的规则,只需要按照这些规则编写服务,系统会自动按照相应的设置进行配置,下面来看一个简单的nginx服务的写法:

#!/bin/bash
#chkconfig: 2345 10 90
#description: Nginx Service Script
#
case $1 in
	start)
		echo  "Starting Nginx..."
		/opt/nginx/sbin/nginx		//这里是nginx二进制管理文件位置
		;;
	reload)
		echo "Reloading Nginx..."
		/opt/nginx/sbin/nginx -s reload
		;;
	stop)
		echo  "Stopping Nginx..."
		/usr/bin/killall  -s  QUIT  nginx
		;;
	restart)
		echo  "Restaring Nginx..."
		$0  stop
		$0  start
		;;
	*)
		echo  "Usage: $0 {start|stop|restart}"
                exit 222
                ;;
esac
exit  0

第一行代表用bashell运行此脚本,所有shell脚本中都必须包涵这一行,第二行注释,2345代表此服务运行级别,10代表启动顺序为第10个,90代表关闭的顺序。这里要注意,需要合理的设置启动顺序,如果太小的话,比如设置为1,可能网络服务都还没有开启,就会出现nginx启动失败。第三行是此服务的描述。从case开始的代码,则是shell语法,这里不再多说。

把这个文件命名为nginx,拷贝到/etc/rc.d/init.d/下,然后用chmod增加运行权限,我们用service nginx start则可以启动nginx服务,我们在进入rc2.d-rc5.d目录下,发现系统已经创建了相应的运行级别服务的软连接了。如果需要让服务开机启动,直接用chkconfig nginx on就行,之后我们也发现软连接的名称开头变成S了。

发表回复