【请教】编译安装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回答

编程浪子

2019-06-05

你好

是这样的,其实理论上是一样的,官方打包也是源码编译,只是官方打包会有一定规范,并且会在打包文件中做启动脚本等等,其实你可以把官方包 解压出来看看,应该对你有帮助

0
1
刘大鱼
好的,谢谢。
2019-06-06
共1条回复

编程浪子

2019-06-04

你好

非常抱歉这么晚回复,请把你自启动脚本贴出来我们看看

0
2
刘大鱼
问题已经解决了,不过还有一个疑问想请教您,我附在提问的末尾了。
2019-06-05
共2条回复

快速上手Linux 玩转典型应用

以主流CentOS 7 操作系统为例,系统讲解Linux,真实线上环境助你快速上手,独立配置运维服务器

1663 学习 · 572 问题

查看课程