如何修改Nginx服务内部默认名称为任意名字

提醒:本文最后更新于 2234 天前,文中所描述的信息可能已发生改变,请仔细核实。

无论是作为Web服务器或其他类型程序的反向代理服务器,Nginx("engine x")都有着高性能且轻量级的优势。其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。

这也使得Nginx在如今不管是存放在高配独立服务器上的大型的门户,还是存放在迷你64M内存VPS上的小型的个人博客,Nginx都在被广泛使用着。

国内淘宝、新浪、网易、腾讯等都在使用。其中淘宝正是基于原作者的BSD-like协议,在其源代码基础上开发了Tengine,这暂且不表。

今天我们来说说,如何修改Nginx其内部默认名称。这对安全或者装逼都是非常实用的。

我们都知道一般Nginx有哪些内部名称展示,如有通过HTTP Response Header中的Server、错误页的footer、FPM-FastCGI等。

Nginx目前仅能通过修改安装包来实现重命名。

一般来说修改3个位置,一个是nginx.h、另一个是ngx_http_header_filter_module.c、还有一个ngx_http_special_response.c。

我写了个简单的Shell命令,包括下载package和自动rename:

#首先定义新的Nginx名称:
NGINX_BANNER="kn007's Server"
#下载目前最新版本1.7.10的安装包
wget -c http://nginx.org/download/nginx-1.7.10.tar.gz
#解压并进入目录
tar zxvf nginx-1.7.10.tar.gz && cd nginx-1.7.10/
#执行更名操作
sed -i "s#\"NGINX\"#\"$NGINX_BANNER\"#" src/core/nginx.h
sed -i "s#\"nginx/\"#\"$NGINX_BANNER/\"#" src/core/nginx.h
sed -i "s#Server: nginx#Server: $NGINX_BANNER#" src/http/ngx_http_header_filter_module.c
sed -i "s#\"<hr><center>nginx<\/center>\"#\"<hr><center>$NGINX_BANNER<\/center>\"#" src/http/ngx_http_special_response.c
#开始编译安装
./configure
make -j$[`cat /proc/cpuinfo | grep processor | wc -l`*2]
make install

这样就完成更名和安装。具体效果可以通过访问info.kn007.net查看。

关于sed的第一、二句是修改Nginx内部名称的,第三句是修改HTTP Response Header的,第四句是修改错误页的底部Footer的。

为什么不修改安装后的Nginx Config下的fastcgi.conf呢?

因为现在外部已经是无法了解我们的服务器名称,已经达到我们的目的了。

而且我们常用的一些程序,可能会对你的前端(反向代理服务器)做判断,毕竟Nginx不同于Apache,无法动态规则。

特别是Wordpress的缓存插件,大多会通过判断你是否Nginx,如果是的话,提醒你添加一些规则语句。

这时fastcgi.conf就起作用的,其中的

fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

可以使得PHP与Nginx内部之间的互相了解。

所以我的建议,还是不修改fastcgi.conf,当然你非要改,也可以的。

fastcgi.conf自动修改可以参考第二句sed来实现,这里就不再重复。

最后最后,还要说一句,3·8妇女节快乐,周末愉快。


2017-02-18补充:
如果你使用了http 2.0,还需改一个文件:

sed -i "s#server: nginx#server: $NGINX_BANNER#" src/http/v2/ngx_http_v2_filter_module.c

2017-10-10补充:
如果你使用了http 2.0,除了上面那条补充命令,还需要一条:

sed -i "s#\"server\", \"nginx\"#\"server\", \"$NGINX_BANNER\"#" src/http/v2/ngx_http_v2_filter_module.c

这句已经不再需要了(可能部分patch需要)。 -- 2018-03-22补充

转载请注明转自:kn007的个人博客的《如何修改Nginx服务内部默认名称为任意名字