在HTTP的世界中,伺服器的位置是由IP Address決定的,網站是由Domain name決定的,因此一台伺服器可以同時處理好幾個不同網站。Nginx伺服器預設任何Domain name都可以指向預設的網站,有時候我們可能不希望任何網域都能連上我們的網站,因此可以新增一個專門對應不明網域的設定檔,返回404或444。

HTTP 狀態碼

HTTP是一種客戶端發起請求(Request),伺服器端回應請求(Response)的協定,Status Code是伺服器回傳給瀏覽器等客戶端的狀態碼,用來代表這次請求的結果。簡單來講200系列的狀態碼代表請求成功;300系列代表請求的位置發生改變,需要轉址;400系列為客戶端的請求有問題,400開頭的狀態碼種類應該是最多種的;最後500代表伺服器端有問題,無法正常回應。

404與444

在HTTP狀態碼中404是找不到指定網頁或資源的意思,當客戶端透過網址需要一份網頁、圖片、文件等資源時,伺服器找不到對應的資源就會回傳404。而444不是HTTP標準的狀態碼,設定444時Nginx伺服器將不回應任何訊息,直接切斷連線。對於節省伺服器資源、網路流量也是有幫助。

Nginx設定教學

自簽SSL預設憑證

目前測試起來,設定443就一定要一個SSL憑證,因此我們可以自己簽證一個憑證給Nginx。在這邊我將憑證放在conf.d/default資料夾內。

sudo mkdir -p /etc/nginx/conf.d/default && cd /etc/nginx/conf.d/default
sudo openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3650

建立設定檔案

在Nginx的設定裡面,我們可以指定某些請求的URL直接返回一個狀態碼,不做更多處理。首先新建一個Nginx設定檔案,如果是使用Debian/Ubuntu等作業系統,可以放在/etc/nginx/sites-available/default_block

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate     /etc/nginx/conf.d/default/cert.pem;
    ssl_certificate_key /etc/nginx/conf.d/default/key.pem;
    return 444;
}

Nginx的sites-available資料夾內存放可以使用的網站設定,但是Nginx不會讀取。sites-enable內存放的是會被Nginx讀取的設定,因此會將sites-available要啟動的設定連結到sites-enable。

sudo ln -s /etc/nginx/sites-available/default_block /etc/nginx/sites-enabled/default_block
sudo rm /etc/nginx/sites-enabled/default  # 取消原本的default設定

檢查設定沒問題後讓Nginx重新讀取設定檔案。如果不是使用Debiean或Ubuntu,或者不是透過systemctl控制Nginx,那記得要換個方式重啟Nginx喔。

sudo nginx -t
sudo systemctl reload nginx

如果設定444的話,重啟Nginx之後透過非指定的Domain連到伺服器上,Nginx就會直接切斷連線囉!