我有多个 nginx 实例,但不确定哪个是“正确的”

skb*_*skb 2 nginx

我继承了一个生产网络服务器,我看到它上面至少有 5 个 nginx 副本:

  • /usr/local/nginx/sbin/nginx
  • /usr/local/nginx/sbin/nginx.old
  • /usr/local/nginx-new/sbin/nginx
  • /usr/local/nginx-nobrotli/sbin/nginx
  • /usr/sbin/nginx

当使用“-v”选项运行时,前 4 个返回“nginx 版本:nginx/1.10.0”,而最后一个返回“nginx 版本:nginx/1.0.15”。

服务器正在提供实时流量,因此我必须非常小心地进行任何更改。

从运行中ps aux | grep nginx我可以看到当前使用的是nginx-nobrotli

nginx: master process /usr/local/nginx-nobrotli/sbin/nginx -c /etc/nginx/nginx.conf

让我感到困惑的是,当我只是nginx -t从命令行输入时,我会返回错误。我认为这是因为我真的在调用/usr/sbin/nginx -t(因为nginx -v返回“nginx 版本:nginx/1.0.15”,我认为这是调用第 5 个)。

所以这里是真正的问题:

  1. 如何重新启动 nginx 并确保它使用与当前正在运行的配置相同的配置?(我很害怕,如果我这样做,nginx -s reload它会通过加载错误版本的 nginx 来关闭站点)
  2. 使nginx -t命令引用 nginx 的“正确”版本的最佳方法是什么?(假设当前运行的是正确的)
  3. /etc/nginx/conf.d/我在/usr/local/nginx*/conf/文件夹中看到的配置文件和我在文件夹中看到的配置文件有什么区别?
  4. 如果/usr/local/nginx*文件夹在各自的sbin/文件夹下都包含一个二进制文件,这是否意味着它们是相同的?为什么会有人有这样的 3 个版本?

更新1:

  • 该命令nginx -t返回:

    nginx: [emerg] unknown directive "pagespeed" in /etc/nginx/conf.d/mainsite.conf-adminips-20170214:23
    nginx: configuration file /etc/nginx/nginx.conf test failed
    
    Run Code Online (Sandbox Code Playgroud)
  • 但该命令/usr/local/nginx-nobrotli/sbin/nginx -t返回:

    nginx: the configuration file /usr/local/nginx-nobrotli/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx-nobrotli/conf/nginx.conf test is successful
    
    Run Code Online (Sandbox Code Playgroud)

这让我有点担心,因为/usr/local/nginx-nobrotli/conf/nginx.conf基本上是空的,所以我知道这不是要检查的正确文件。我应该运行/usr/local/nginx-nobrotli/sbin/nginx -t -c /etc/nginx/nginx.conf让“-t”选项检查文件吗?我知道“/etc/nginx/nginx.conf”是正确的文件,我不知道如何#1:检查它是否有效以及#2:安全地执行一个肯定会使用新文件的nginx重新加载.

谢谢你。

更新 2:

以下是内容/etc/init.d/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)

sysconfig="/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/nginx"
pidfile="/var/run/${prog}.pid"

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f $sysconfig ] && . $sysconfig


start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    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 -p $pidfile $prog
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest_q || return 6
    stop
    start
}

reload() {
    configtest_q || return 6
    echo -n $"Reloading $prog: "
    killproc -p $pidfile $prog -HUP
    echo
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

configtest_q() {
    $nginx -t -q -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

# Upgrade the binary with no downtime.
upgrade() {
    local oldbin_pidfile="${pidfile}.oldbin"

    configtest_q || return 6
    echo -n $"Upgrading $prog: "
    killproc -p $pidfile $prog -USR2
    retval=$?
    sleep 1
    if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]];  then
        killproc -p $oldbin_pidfile $prog -QUIT
        success $"$prog online upgrade"
        echo 
        return 0
    else
        failure $"$prog online upgrade"
        echo
        return 1
    fi
}

# Tell nginx to reopen logs
reopen_logs() {
    configtest_q || return 6
    echo -n $"Reopening $prog logs: "
    killproc -p $pidfile $prog -USR1
    retval=$?
    echo
    return $retval
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest|reopen_logs)
        $1
        ;;
    force-reload|upgrade) 
        rh_status_q || exit 7
        upgrade
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    status|status_q)
        rh_$1
        ;;
    condrestart|try-restart)
        rh_status_q || exit 7
        restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart|reopen_logs}"
        exit 2
esac
Run Code Online (Sandbox Code Playgroud)

这告诉我,如果我要重新启动服务器,我的网络服务器将无法启动,因为/usr/sbin/nginx(在启动脚本中提到的)可执行文件在我运行时无法解析配置/usr/sbin/nginx -t。那是对的吗?

use*_*517 5

一个牛仔在这里

一个牛仔在这里

nginx: [emerg] 未知指令“pagespeed”

这就是为什么你在 /usr/local 中有一个 nginx 的副本,pagespeed 模块必须编译到 nginx 中。好意(啊哈*)解释了多个副本。

Nginx 1.0.15 很旧(从 4/2012 开始),因此您拥有的系统不太可能使用 systemd,因此请在 /etc/init.d 中查找 init 脚本。

在这种情况下,我会做的是创建一个具有相同基本操作系统的 VM,并将以下目录树复制到其中。

  • /etc/nginx
  • /usr/local/nginx-nobrotli/
  • 你的生产树
  • 来自 /etc/init.d 的相关初始化脚本

不要从你的发行版安装 nginx。

现在你有了一个测试环境,你可以想办法了。

添加/usr/local/nginx-nobrotli/sbin/nginx到您的 PATH

export /usr/local/nginx-nobrotli/sbin/nginx:$PATH
Run Code Online (Sandbox Code Playgroud)

现在,当您运行 nginx 时,它将运行本地编译的版本,它应该按您的预期工作。根据编译方式,它仍可能会抛出弯曲的球,例如,您可能需要使用-c /etc/nginx/nginx.conf它来确保它获取正确的配置文件。你可以用别名来解决这个问题。

我怎样才能重新启动nginx...

希望 /etc/init.d/nginx restart (或类似的)你必须根据你在你的环境中找到的东西来弄清楚。

制作 nginx -t 的最佳方法是什么?

删除所有不相关的版本(基于测试)并适当调整 PATH。有关配置选项,请参见上文。

和...有什么区别

考虑到您的 ps 命令的输出,它们可能无关紧要。然而,一般来说,它们将是本地编译的 nginx 期望找到它的配置的地方。我们知道它们很可能没有从 ps 命令中使用。

如果 /usr/local/nginx* 文件夹在其各自的 sbin/ 文件夹下都包含一个二进制文件,这是否意味着它们是相同的?

不能保证它们可能有不同的编译选项。

为什么会有人有这样的 3 个版本?

好的意图, 测试, 版本控制 一些其他原因 - 你选。

当你想通了,就记录下来。返回到您的生产系统并删除 cruft。协商维护窗口并测试您学到和实施的内容。

* 牛仔。我相信很多人会认识到这一点,我们从中成长得更好。