我继承了一个生产 Web 服务器,并且我看到它上面至少有 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 个)。
因此,真正的问题是:
- 我如何重新启动 nginx 并确保它使用当前正在运行的相同配置?(我很担心,如果我这样做,
nginx -s reload
它会通过加载错误版本的 nginx 来关闭网站) - 使命令引用 nginx 的“正确”版本的最佳方法是什么
nginx -t
?(假设当前运行的是正确的) /etc/nginx/conf.d/
我在文件夹中看到的配置文件和配置文件有什么区别/usr/local/nginx*/conf/
?- 如果
/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
但命令
/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
这让我有点担心,因为/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
这告诉我,如果我重新启动服务器,我的网络服务器将无法启动,因为/usr/sbin/nginx
运行时可执行文件(在启动脚本中提到)无法解析配置/usr/sbin/nginx -t
。对吗?
答案1
有个牛仔来过这里
nginx:[emerg] 未知指令“pagespeed”
这就是为什么您在 /usr/local 中有一个 nginx 副本,pagespeed 模块必须编译到 nginx 中。善意 (啊哼*)解释多份副本。
Nginx 1.0.15 比较旧(从 2012 年 4 月开始),因此您的系统不太可能使用 systemd,因此请在 /etc/init.d 中查找 init 脚本。
在这种情况下我会做的是创建一个具有相同基本操作系统的虚拟机并将以下目录树复制到其中。
- /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
现在,当您运行 nginx 时,它将运行本地编译的版本,它应该可以按预期工作。根据编译方式的不同,它仍可能会抛出难题,例如,您可能需要使用 来-c /etc/nginx/nginx.conf
确保它选择了正确的配置文件。您可以使用别名来解决这个问题。
我该如何重新启动 nginx...
希望 /etc/init.d/nginx restart (或类似) 您必须根据在您的环境中发现的内容弄清楚。
使 nginx -t 的最佳方法是什么......
删除所有不相关的版本(基于测试)并适当调整 PATH。有关配置选项,请参阅上文。
... 有什么区别?
根据 ps 命令的输出,它们可能无关紧要。但是一般来说,它们位于本地编译的 nginx 期望找到其配置的位置。我们知道它们可能未被 ps 命令使用。
如果 /usr/local/nginx* 文件夹在其各自的 sbin/ 文件夹下都包含一个二进制文件,这是否意味着它们是相同的?
不能保证它们可能有不同的编译选项。
为什么有人会有这样的 3 个版本?
好的意图、测试、版本控制等一些其他原因- 你选。
当你弄清楚后,记录下来。返回到你的生产系统并删除多余的东西。协商维护窗口并测试你学到并实施的内容。
* 牛仔我相信很多人都会认识到这一点,我们当中的佼佼者会摆脱它。