|
打开终端,何查敲下 `nginx -v`,版本回车。何查屏幕上跳出 `nginx version: nginx/1.24.0`。版本这是何查最直接的办法,前提是版本 nginx 的可执行文件在 PATH 里。大多数用包管理器装出来的何查 nginx 都满足这个条件,比如 apt、版本yum、何查brew 装完,版本二进制文件默认就躺在 `/usr/sbin/nginx` 或 `/usr/local/bin/nginx`,何查系统能直接找到。版本 但事情没这么简单。何查我见过太多服务器上 nginx 的版本路径千奇百怪——源码编译时指定了 `--prefix=/opt/nginx`,或者运维手动挪到了 `/data/apps/nginx/sbin/` 下面。何查这时候 `nginx -v` 会甩你一句 `command not found`。别急,先 `which nginx` 看看有没有输出。没有的话,用 `find / -name nginx -type f 2>/dev/null` 扫一遍。这命令有点暴力,磁盘 IO 会飙一下,但找东西管用。 找到二进制文件后,直接跑绝对路径:`/opt/nginx/sbin/nginx -v`。注意,`-v` 只输出版本号,`-V` 是大写,会额外吐出编译参数、模块列表,信息量大得多。有次排查一个第三方模块没生效的问题,就是靠 `-V` 看到 configure arguments 里压根没带 `--add-module`,白折腾了半天。 如果 nginx 正在运行,还有一种不看二进制文件的办法。先 `ps aux | grep nginx` 找到 master 进程的 PID,然后 `ls -l /proc//exe`。这个软链接指向实际的可执行文件路径。拿到路径再执行 `-v` 或者 `-V`。这招在容器环境里特别顺手——容器里经常没有 `which`,`find` 又太慢,但 `/proc` 总是有的。 再换个角度。nginx 的版本信息也会出现在 HTTP 响应头里。`curl -I http://localhost` 看看,如果 `Server` 字段返回 `nginx/1.24.0`,那版本就明摆着。但很多生产环境会关掉这个——`server_tokens off;` 一加,响应头就只剩 `nginx`,版本号藏起来了。所以这个方法只能碰运气,不能当常规手段。 配置文件里其实也可能藏着线索。有些发行版的包会在 `/etc/nginx/nginx.conf` 顶部写注释,比如 `# nginx 1.18.0`。但这是打包者随手加的,不保证有。更靠谱的是看包管理器自己记录的信息。Debian/Ubuntu 上 `dpkg -l | grep nginx` 会列出所有 nginx 相关包的版本,但注意,这显示的是包的版本,不一定等于 nginx 自身的版本号——发行版经常在包版本里加后缀,比如 `1.18.0-6ubuntu14`,实际 nginx 版本是 `1.18.0`。RHEL/CentOS 用 `rpm -qa | grep nginx` 类似。Arch 的话 `pacman -Q nginx` 直接给出版本。 还有一种情况:nginx 是编译安装的,但源码目录还在。去源码目录里翻 `src/core/nginx.h`,里面有一行 `#define NGINX_VERSION "1.24.0"`。这算是最底层的确认方式了。不过谁会留着源码目录呢,编译完通常就删了。 说个实际踩过的坑。有台机器上 `nginx -v` 显示 1.20.1,但 `nginx -V` 的 configure arguments 里赫然写着 `--with-http_v2_module`,而 1.20.1 默认就带这个模块,根本不需要显式加。后来发现是运维从旧版本升级时直接覆盖了二进制文件,配置文件没动,但二进制其实是 1.22.0 的。`-v` 读的是二进制内嵌的版本字符串,按理不会错,但那次偏偏错了——原因是编译时改了 `NGINX_VERSION` 宏。所以最保险的还是 `-V` 加上 `strings /path/to/nginx | grep nginx/` 交叉验证。`strings` 会把二进制里所有可打印字符抓出来,版本号字符串肯定在里面。 最后提一句,别用 `nginx -v` 去查一个没在运行的 nginx 实例的版本。二进制文件在磁盘上,跟进程跑没跑没关系。但如果你改过二进制文件(比如替换了软链接),那 `-v` 读的就是新文件。想确认当前运行进程的实际版本,还是得走 `/proc//exe` 那条路。 |