需求
当我们使用http/https请求时, nginx 会在请求的response里面的header加入Server: nginx:1.18
信息, 如果可以隐藏, 就不会被别人知道, 我用的是哪款web服务器, 或哪个版本.
例如
-
新浪网:
Server: nginx / Server: WeiBo/LB -
开源中国:
Server:Tengine / server: marco/2.13 -
segmentfault
没有返回Server!/ server: Tengine
修改 nginx 源码并编译
准备工作
- 下载 nginx 源码, 本文使用的是 nginx-1.18.0, 下载链接
- 下载
zlib
源码, 下载链接, 这个是与gzip
压缩相关的 - 下载
pcre
, 下载链接 或 下载地址2, 这个是与url正则匹配相关的. 注意此处不能使用pcre2
, 否则可能会报如下错误:
解压
解压如下:
修改源码
主要修改两个部分
-
修改
src/core/nginx.h
将NGINX_VER
修改你想要的. -
修改
src/http/ngx_http_header_filter_module.c
将ngx_http_server_string
修改掉, 如:"Server: nginx" CRLF
直接修改成"Server: haha" CRLF
或者修改成ngx_http_server_full_string
一致也可以, 这样就不会受配置文件里的server_tokens off;
配置影响了. -
修改
./src/http/ngx_http_special_response.c
此文件主要是404等错误页面时响应, 同样可以进行定制.
主要是将ngx_http_error_tail
修改成自己想要的.或者修改成ngx_http_error_full_tail
一致也可以. 这样就不会受配置文件里的server_tokens off;
配置影响了.
配置并编译
./configure \
--prefix=/opt/nginx \
--with-http_ssl_module \
--with-stream \
--with-pcre=/root/dev/nginx/pcre-8.40 \
--with-zlib=/root/dev/nginx/zlib-1.2.11
说明:
--prefix
安装到哪个目录, 默认是安装到/usr/local/nginx
--with-http_ssl_module
支持https
, 要不然证书就无法使用. 影响与https相关的指令ssl_protocols
,ssl_ciphers
--with-pcre
指定pcre
源码目录. 影响url正则相关--with-zlib
指定zlib
源码目录. 影响gzip解压缩相关- 其他配置可以参考
./configure --help
为啥要加 zlib
(与gzip
压缩相关) 或 pcre
(与正则相关), 本次系统使用的是ubuntu20.0
, 必须要有, 否则报错:
-
没有
zlib
报错:
-
没有
pcre
报错:
-
加入之后运行配置检查, 没有报错, 则算是正常, 如下:
-
开始
make
进行编译
可能会遇到的错误:
说明缺少 g++ 编译器相关的. 安装
sudo apt install g++
或直接安装 build-essential, 因为 build-essential 包含 g++
sudo apt install build-essential
如果出现
则安装一下openssl
apt-get install openssl libssl-dev
安装完成后, 断续编译 nginx, 编译的过程可能会比较慢, 等会结果如下, 没有报错, 则编译完成.
再执行安装
./make install
安装结束
启动
/opt/nginx/sbin/nginx
在页面中打开地址, 并查看响应头信息
server 标识已被修改.
定制的错误页面.
如果想要其他的效果, 完全可以修改源码进行定制.