【请教】编译安装nginx后,绑定系统服务启动失败的问题
来源:7-5 实例演示反向代理和负载均衡

刘大鱼
2019-06-03
课程之外的内容请教一下老师
通过编译的方式安装了nginx安装路径是/etc/nginx安装完成后nginx -t测试OK/etc/nginx/sbin/nginx启动也OK可以看到相应的进程。在此基础上我试图将nginx服务设置成系统服务通过service nginx start/restart/stop/reload来管理nginx在安装完成nginx并执行过一次手工启动之后做了以下操作
1、通过nginx -s stop关闭nginx并将conf/nginx.conf文件中的pid文件路径改为了/var/run/nginx.pid下面的启动脚本设置的pid路径是这个
2、在/etc/init.d下配置启动脚本nginx文件拷贝了官方脚本内容本地安装路径跟此文档一致所以没有变动其中的内容https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/
3、通过service start nginx启动服务失败报错如下
● nginx.service - SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
Active: failed (Result: exit-code) since 一 2019-06-03 18:27:19 CST; 10min ago
Docs: man:systemd-sysv-generator(8)
Process: 4303 ExecStart=/etc/rc.d/init.d/nginx start (code=exited, status=5)
6月 03 18:27:19 localhost.localdomain systemd[1]: Starting SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server...
6月 03 18:27:19 localhost.localdomain systemd[1]: nginx.service: control process exited, code=exited status=5
6月 03 18:27:19 localhost.localdomain systemd[1]: Failed to start SYSV: NGINX is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server.
6月 03 18:27:19 localhost.localdomain systemd[1]: Unit nginx.service entered failed state.
6月 03 18:27:19 localhost.localdomain systemd[1]: nginx.service failed.
Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.
在网上找不到什么解决办法nginx重新安装也解决不了请老师帮忙看一下是什么原因万分感谢
补充启动脚本如下
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: NGINX is an HTTP(S) server, HTTP(S) reverse
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=([^ ]*).*//g' -`
if [ -n "$user" ]; then
if [ -z "`grep $user /etc/passwd`" ]; then
useradd -M -s /bin/nologin $user
fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
fi
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
这个问题我自己摸索着解决了不过还是出现了一些问题需要请教一下老师
在上面贴的第一段错误日志代码中有一个进程的结果Process: 4303 ExecStart=/etc/rc.d/init.d/nginx start (code=exited, status=5)我发现脚本中start模块里exit 5的代码是 [ -x $nginx ] || exit 5即判断nginx上面定义的变量/usr/sbin/nginx不存在时就会返回5的状态。
我检查了自己的/usr/sbin目录确实没有nginx这个目录于是就自行从/etc/nginx/sbin/nginx拷贝了一份过来再执行系统启动命令还是报错这次报的是status=6这个状态对应的前置条件在脚本中可以找到是如果不存在/etc/nginx/nginx.conf文件否则就报错返回状态6我的nginx.conf文件在/etc/nginx/conf目录下所以把脚本中的文件路径改到/etc/nginx/conf/nginx.conf就可以了。
好奇为什么编译安装和yum安装的配置文件路径不同。
再测试系统start/restart/stop/reload命令就正常了。
我有个疑问/usr/sbin目录下的文件是怎么生成的() 编译安装的软件都需要自行拷贝一份文件进去吗()但是我看到的编译安装指导都没有这个步骤。
2回答
-
你好
是这样的,其实理论上是一样的,官方打包也是源码编译,只是官方打包会有一定规范,并且会在打包文件中做启动脚本等等,其实你可以把官方包 解压出来看看,应该对你有帮助
012019-06-06 -
编程浪子
2019-06-04
你好
非常抱歉这么晚回复,请把你自启动脚本贴出来我们看看
022019-06-05
相似问题