Wie kann ich meinen Nginx-Server so konfigurieren, dass er verschiedene Subdomänen und auch Ports akzeptiert?

Wie kann ich meinen Nginx-Server so konfigurieren, dass er verschiedene Subdomänen und auch Ports akzeptiert?

Ich habe einen Server, der auf Ubuntu/Nginx läuft. Ich habe Subdomains, die von verschiedenen internen Ports aus laufen. Ich möchte eine Anwendung der Öffentlichkeit zugänglich machen, sie aber keinem Domänen-/Servernamen zuordnen.

Unten ist meine Konfigurationsdatei:

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; 

}

Das obige funktioniert gut und verweist auf die angegebenen Domänen, d. h. example.com und app.example.com. Jetzt möchte ich einen weiteren virtuellen Server hinzufügen, der unter MY_PUBLIC_IP:8080 ausgeführt wird. Der Port 8080 sollte auf den anderen Domänen nicht zugänglich sein, d. h.beispiel.com:8080/app.beispiel.com:8080sollte nicht verfügbar sein.

Antwort1

Sie können verwenden default_server.

Nginx erklärt diesen Server zum Standardserver. Danach verwendet Nginx den Standardserver zur Bearbeitung der Anfragen, wenn deren HTTP-Host-Header mit keinem anderen Serverblock übereinstimmt.

Was ist default_server in Nginx

Beispiel:

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


Ich verwende es, um Scanner-Bots zu Honeypoten und ihnen ein paar Kacka-Emojis zu streamen, wenn sie nach phpAdmin oder etwas Ähnlichem suchen :)

Antwort2

Ich glaube nicht, dass die Antwort von @Klamberext die Frage wirklich beantwortet. Das heißt, der Nginx-Webserver hat eineStandardserverKonzept. Die offizielle Dokumentationsseite zum Thema finden Sie hier:Wie nginx eine Anfrage verarbeitet. Allerdings wird immer einer der Serverblöcke, der auf einer bestimmten Netzwerkschnittstellen-/Port-Kombination lauscht, als Standardblock fungieren. Wenn Sie diesen Serverblock nicht explizit angeben, wird er der allererste Serverblock in Ihrer Konfiguration sein. Das bedeutet, dass Ihr Serverblock mit der server_name app.example.com www.app.example.com;Zeile der Standardserverblock für alle Anfragen ist, die über TCP-Port 443 eingehen, und alle Anfragen bedient, bei denen ein HTTP- HostHeader nicht übereinstimmt example.com( oder bei denen überhaupt www.example.comkein Header vorhanden ist ).Host

Wie bereits von @Klamberext gesagt, besteht eine gängige Praxis darin, einen Stub-Serverblock zu definieren, um alle Anfragen abzufangen, deren HostHTTP-Header nicht mit einer der von Ihnen bedienten Domänen übereinstimmt. Ein Beispiel finden Sie unterDasSO antworte. Normalerweise enthält ein solcher Serverblock die return 444;Anweisung, die ein spezieller Nginx-Rückgabecode ist, um die Verbindung sofort zu schließen. Es scheint jedoch, dass Sie etwas Gegenteiliges benötigen, und Sie benötigen zwei Serverblöcke, um dies zu erreichen, da, wie bereits gesagt, ein einzelner Serverblock, der auf TCP-Port 8080 lauscht, als Standard fungiert, unabhängig davon, auf was der HostHeader eingestellt ist:

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
}

Alternativ können Sie den HostHeader-Wert in Ihrem Serverblock prüfen, um beispielsweise eine example.comDomäne und alle ihre Subdomänen zu blockieren:

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

verwandte Informationen