我有一個在 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 將使用預設伺服器來處理請求。
例子:
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.com
或www.example.com
(或根本沒有Host
標頭)的任何請求提供服務。
正如@Klamberext 已經說過的,一種常見的做法是定義一個存根伺服器區塊來捕獲所有請求,其中Host
HTTP 標頭與您所服務的任何網域都不匹配的所有請求。您可以在以下位置查看範例這所以回答。通常這樣的伺服器區塊包含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
}