如何設定我的 nginx 伺服器以接受不同的子網域和連接埠?

如何設定我的 nginx 伺服器以接受不同的子網域和連接埠?

我有一個在 Ubuntu/Nginx 上運行的伺服器。我有從不同內部連接埠運行的子網域。我想向公眾公開一個應用程序,但不將其與任何網域/伺服器名稱關聯。

下面是我的設定檔:

server {
    server_name app.example.com www.app.example.com;
    access_log /home/hub-app/logs/app.example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8082;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; 
    }

    listen 443 ssl; 
    ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;


}   

server {
    server_name example.com www.example.com;
    access_log /home/hub-public/logs/example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8081;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; 
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

}

上面的程式碼運作良好,並指向指定的網域,即 example.com 和 app.example.com。現在我想新增另一個虛擬伺服器在 MY_PUBLIC_IP:8080 上運行。連接埠 8080 不應在其他網域上訪問,即example.com:8080/app.example.com:8080不應該可用。

答案1

您可以使用default_server

Nginx 會將該伺服器宣告為預設伺服器。之後,當 HTTP 主機標頭與任何其他伺服器區塊不符時,Nginx 將使用預設伺服器來處理請求。

Nginx中的default_server是什麼

例子:

server {
    listen 8080 default_server;
    
    root /www/default;
        
    location / {
        index index.html;
    }
}


我用它來蜜罐掃描機器人,如果他們正在尋找 phpAdmin 或類似的東西,我會向他們傳輸一些便便表情符號:)

答案2

我認為@Klamberext 的答案並沒有真正回答問題。也就是說,nginx Web伺服器有一個預設伺服器概念。有關該主題的官方文件頁面可以在這裡找到:nginx 如何處理請求。但是,其中一台伺服器阻止偵聽某些網路介面/連接埠組合,並將始終充當預設網路介面/連接埠組合。如果您沒有明確指定該伺服器區塊,它將是您配置中的第一個伺服器區塊。這意味著帶有該server_name app.example.com www.app.example.com;行的伺服器區塊將成為來自 443 TCP 連接埠的任何請求的預設伺服器區塊,為 HTTPHost標頭不匹配example.comwww.example.com(或根本沒有Host標頭)的任何請求提供服務。

正如@Klamberext 已經說過的,一種常見的做法是定義一個存根伺服器區塊來捕獲所有請求,其中HostHTTP 標頭與您所服務的任何網域都不匹配的所有請求。您可以在以下位置查看範例所以回答。通常這樣的伺服器區塊包含return 444;一個特殊的 nginx 回傳代碼的語句,用於立即關閉連線。然而,您似乎需要相反的東西,並且您需要兩個伺服器區塊來完成它,因為正如已經說過的,偵聽 TCP 連接埠 8080 的單一伺服器區塊將充當預設伺服器區塊,無論標頭設定Host為什麼:

server {
    listen 8080;
    server_name example.com www.example.com app.example.com www.app.example.com;
    return 444;
}
server {
    listen 8080 default_server;
    ... your config here
}

作為替代方案,您可以檢查Host伺服器區塊內的標頭值,例如封鎖example.com網域及其任何子網域:

server {
    listen 8080;
    if ($http_host ~ \.?example\.com$) { return 444; }
    ... your config here
}

相關內容