
Dies ist meine nginx
Konfiguration (läuft als Docker-Container, falls das wichtig ist):
events {
worker_connections 4096; ## Default: 1024
}
http {
server {
server_name registry.mydomain;
listen 80;
listen 443 ssl;
client_max_body_size 0; # Disables checking, to avoid "request entity too large"
ssl_certificate /etc/nginx/certs/registry.crt;
ssl_certificate_key /etc/nginx/certs/registry.key;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://registry:5000;
}
}
}
Das Problem, das ich habe, ist, dass nginx
diese Site auch für Anfragen an andere Domänen bereitgestellt wird. Das ist zu erwarten:
$ http http://registry.mydomain/v2/_catalog?n=100
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 20
Content-Type: application/json; charset=utf-8
Date: Thu, 05 Apr 2018 12:43:21 GMT
Docker-Distribution-Api-Version: registry/2.0
Server: nginx/1.13.11
X-Content-Type-Options: nosniff
{
"repositories": []
}
Aber das ist nicht zu erwarten:
$ http http://localhost/v2/_catalog?n=100
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 20
Content-Type: application/json; charset=utf-8
Date: Thu, 05 Apr 2018 12:39:57 GMT
Docker-Distribution-Api-Version: registry/2.0
Server: nginx/1.13.11
X-Content-Type-Options: nosniff
{
"repositories": []
}
Warum ist das so? Wie kann ich festlegen, nginx
dass keine Anfragen an undefinierte Server weitergeleitet werden?
Antwort1
nginx
hat immer einen Standardserver. Wenn kein server
explizit als gekennzeichneter Block vorhanden ist default_server
, nginx
wird der erste Server mit einer passenden Anweisung verwendet listen
.
Sie können einen Catch-All- server
Block definieren, um alle Hostnamen zu verarbeiten, die nicht mit Ihrem server_name
Wert übereinstimmen.
Zum Beispiel:
server {
listen 80 default_server;
listen 443 ssl default_server;
ssl_certificate /path/to/some/other/cert.pem;
ssl_certificate_key /path/to/some/other/key.pem;
return 444;
}
Natürlich https
werden Browser, die eine Verbindung herstellen,stetsBeanstanden Sie das Zertifikat, bevor nginx
die Anfrage bearbeitet werden kann.
Sehendieses Dokumentfür mehr.