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

我inheritance了一个生产Web服务器,并且我看到至less5个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”。

服务器正在提供实时stream量,所以我必须非常小心地做出任何更改。

从运行ps aux | grep nginx 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”我认为这是调用第五个)。

所以这里是真正的问题:

  1. 我怎么才能重新启动nginx,并确保它使用相同的configuration,目前正在运行? (我吓坏了,如果我做了一个nginx -s reload它会通过加载错误版本的nginx来取消网站)
  2. 使nginx -t命令的最佳方式是指nginx -t的“正确”版本? (假设当前运行的是正确的)
  3. /etc/nginx/conf.d/看到的configuration文件与我在/usr/local/nginx*/conf/文件夹中看到的configuration文件有什么区别?
  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 
  • 但是命令/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 

这告诉我,如果我要重新启动服务器,我的web服务器将不会启动,因为/usr/sbin/nginx (在启动脚本中提到)的可执行文件无法parsingconfiguration/usr/sbin/nginx -t 。 那是对的吗?

一个牛仔在这里

牛仔在这里

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

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

Nginx 1.0.15是旧的(从2012年4月起),所以你的系统不太可能在使用systemd,因此在/etc/init.d中查找init脚本。

在这种情况下,我会做的是创build一个相同的基本操作系统的虚拟机,并将以下目录树复制到它。

  • 在/ etc / nginx的
  • 在/ usr /本地/ nginx的,nobrotli /
  • 你的生产树
  • 来自/etc/init.d的相关init脚本

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

现在你有一个testing环境,你可以把东西弄出来。

/usr/local/nginx-nobrotli/sbin/nginx到PATH中

 export /usr/local/nginx-nobrotli/sbin/nginx:$PATH 

现在当你运行nginx时,它将运行本地编译的版本,它应该像你期望的那样工作。 它可能仍然会抛出弯曲的球,这取决于它是如何被编译的,例如你可能需要使用-c /etc/nginx/nginx.conf来确保它正在拾取正确的configuration文件。 你可以用别名来解决这个问题。

我怎样才能重新启动nginx …

希望/etc/init.d/nginx重新启动(或类似),你将不得不根据你在你的环境中find的。

什么是最好的方式来使nginx -t …

删除所有不相关的版本(基于testing)并适当调整PATH。 请参阅上面有关configuration选项。

有什么区别…

考虑到你的ps命令的输出,它们可能是不相关的。 但是一般来说,它们会是本地编译的nginx所期望的configuration。 我们知道它们很可能没有在ps命令中使用。

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

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

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

良好的意图,testing,版本控制一些其他的原因 – 你select。

当你想出来的文件。 返回到你的产品系统,并删除cruft。 谈判一个维护窗口,并testing你学到了什么和实现了什么。

* 牛仔 。 我相信很多人会认识到这一点,我们越好越好。