預設設定下經由 nginx 回傳的 HTTP 封包其 header 都會加上 server 欄位,由 nginx + 版本號組成。
那麼有甚麼方法可以隱藏伺服器資訊呢?這裡要先來介紹 server_tokens 這個功能(官方說明)。
初階方法
server_tokens 共有四種方法可以設定 on、off、build 和 stirng。
使用情形
on (預設)
預設值,沒有特別設定即使用此選項。
server_tokens on;
server : nginx/1.18.0
off
可以隱藏版本資訊,但還是會顯示出 nginx。
server_tokens off;
server : nginx
build
在我的環境中和 on 的結果一樣。
server_tokens build;
server : nginx/1.18.0
string 要訂閱商業版才能使用,其功能可以自訂訊息,輸入空字串可以禁用 server 欄位。
如果沒有訂閱商業版,卻也想要有自訂 server 標頭的功能該怎麼做呢?
進階方法
那就只能靠第三方模組啦,這次要來介紹 openresty 所開發的 headers-more-nginx-module,它可以用來設置和清除 header,拿來實現我們的需求綽綽有餘。
安裝
畢竟是第三方模組要拿來使用只能自己編譯,所幸它可以編成動態庫讓我們使用,接下來講解編譯方法。
安裝需求套件
以 Ubuntu 20.04 為例
sudo apt install build-essential libpcre3-dev zlib1g-dev
下載 nginx 原始碼
這裡需要下載和你使用的 nginx 同版本的原始碼
查看版本命令
nginx -v
知道版本後就可以進行下載了(以下用版本 1.18.0 作為範例)
下載
curl -O http://nginx.org/download/nginx-1.18.0.tar.gz
解壓縮
tar -xzf nginx-1.18.0.tar.gz
下載 headers-more-nginx-module 原始碼
git clone https://github.com/openresty/headers-more-nginx-module
開始編譯
切換到原始碼目錄
cd nginx-1.18.0
設定編譯選項
./configure --add-dynamic-module=../headers-more-nginx-module --with-compat
編譯模組
make modules
複製動態庫到模組目錄
nginx 的模組目錄可以用以下指令查看
nginx -V 2>&1 | grep modules-path
接在 modules-path= 後面的就是我們要的路徑,我的環境下為 /usr/lib/nginx/modules/。
複製
sudo cp objs/ngx_http_headers_more_filter_module.so /usr/lib/nginx/modules/
隱藏伺服器資訊
headers-more-nginx-module 有很多實用的功能,不過這裡只著重如何設定 server 標頭。
以下操作修改 nginx 的設定,可以在在 /etc/nginx/modules-enabled/ 新增 .conf 檔或是直接在 /etc/nginx/nginx.conf 寫入
載入模組
# 載入 ngx_http_headers_more_filter_module.so 自訂標頭
load_module modules/ngx_http_headers_more_filter_module.so;
禁用 server 標頭
more_clear_headers "server";
more_clear_headers 後面接的字串即為要拿掉的標頭。
自訂 server 標頭
當然我們也可以打造專屬自己的酷炫 server 標頭
more_set_headers "server: super web server";
修改後伺服器回傳的 HTTP 標頭 server 欄位變成了 super web server