UU Blog

nginx和php-fpm添加到服务 开启开机自启动

接手管理某台ERP服务器的生产环境。主要配有LNMP环境,前两天发现,这些服务居然都没有配置自启动。

这完全不考虑服务器意外重启导致服务未能启动,从而引起长时间的服务中断么?

所以,今天就特地添加了自启动。

本来,添加自启动是很简单的。尤其是yum安装出来的服务。

CentOS 7

1
systemctl enable nginx php-fpm

CentOS 5/6

1
2
chkconfig nginx on
chkconfig php-fpm on

然而,这台是自己下载的软件包,还是自己编译的不得而知。反正/etc/init.d/ 完全没这两货的影子。

没有那就添加吧,两个bash脚本。

我从网上扒拉了两段自己修改了一下。代码如下:

nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
# chkconfig: - 85 15
PATH=/app/nginx
DESC="nginx daemon"
NAME=nginx
DAEMON=$PATH/sbin/$NAME
CONFIGFILE=$PATH/conf/$NAME.conf
PIDFILE=$PATH/logs/$NAME.pid
scriptNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop() {
$DAEMON -s stop || echo -n "nginx not running"
}
do_reload() {
$DAEMON -s reload || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
;;
reload|graceful)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
;;
restart)
echo -n "Restarting $DESC: $NAME"
do_stop
do_start
echo "."
;;
*)
echo "Usage: $scriptNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0

nginx 主程序一般自带了好多方法,比如好用的 stop、reload。所以nginx的代码显得比较简洁。

关于找nginx路径,一般其实用which nginx 或者 whereis nginx就够了。

但是想补充一个更加可靠的。

  • 先找到nginx的pid号,ps -aux | grep nginx
  • ll /proc/pid号

看到 exe 文件的链接路径就是我们要找的程序全路径了。

1
2
3
4
5
6
7
$ ps -aux | grep nginx
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 1147 0.0 0.0 46328 2488 ? Ss Mar14 0:00 nginx: master process nginx
root 3870 0.0 0.0 47280 3772 ? S Mar29 2:27 nginx: worker process

$ sudo ls -l /proc/1147/ | grep exe
lrwxrwxrwx 1 root root 0 Mar 14 10:17 exe -> /app/nginx/sbin/nginx

php-fpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# pidfile: /var/run/php-fpm.pid
# config: /usr/local/php/etc/php-fpm.conf

php_command=/app/php56/sbin/php-fpm
php_config=/app/php56/etc/php-fpm.conf
php_pid=/app/php56/var/run/php-fpm.pid
RETVAL=0
prog="php-fpm"

#start function
php_fpm_start() {
/app/php56/sbin/php-fpm #-c /app/php56/lib/php.ini -y ${php_config}
}

start(){
if [ -e $php_pid ]
then
echo "php-fpm already start..."
exit 1
fi
php_fpm_start
}

stop(){
if [ -e $php_pid ]
then
parent_pid=`cat $php_pid`
all_pid=`ps -ef | grep php-fpm | awk '{if('$parent_pid' == $3){print $2}}'`
for pid in $all_pid
do
kill $pid
done
kill $parent_pid
fi
exit 1
}

restart(){
# stop
# start
kill -USR2 `cat /app/php56/var/run/php-fpm.pid`
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
# stop
# start
restart
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|status}"
exit 1
esac
exit $RETVAL

这个代码就有点随意了,我做了少量修改,注意修改下执行程序的路径和PID文件的路径就行了,这里代码并没有用到配置文件路径其实。如果无法正确加载配置,可以把我加上的#-c /app/php56/lib/php.ini -y ${php_config} 这句代码注释去掉。

另外 php-fpm的配置路径在ps -aux | grep php-fpm 即可看到。记得修改,去掉pid路径的注释。

虽然代码在没找到pid文件的时候,会自己尝试提取pid,但是建议还是去掉注释。

添加服务,开启自启动

两个文件一个保存为 /etc/init.d/nginx 一个保存为 /etc/init.d/php-fpm 名字可以自己改,但是不推荐。

  • 添加进chkconfig chkconfig --add nginx && chkconfig -add php-fpm

  • 开启开机启动 chkconfig nginx on && chkconfig php-fpm on

可以直接在 /etc/rc.local 修改吗

可以的。

比如

1
2
/app/nginx/sbin/nginx -c /app/nginx/conf/nginx.conf
/app/php56/sbin/php-fpm

为何不这样做,为了以后管理服务,比如重启方便一点。

参考资料

给作者打一针鸡血