Reverse proxy zu https mit nginx
Ich habe folgendes Setup:
Die Server lassen sich aus dem Heimnetzwerk fehlerfrei ansprechen.
Fehler:
Kann mir bitte jemand helfen, die nginx.conf anzupassen?
Meine nginx.conf:
Wenn ich folgendes auskommentiere funktioniert Domain 1, domain 2 aber antworetet nicht:
- Zwei domains, zwei server
- Anfragen gehen von der fritzbox an Server 1 (nginx)
- Server 1 bearbeitet Anfragen für Domain 1 selbst, für Domain 2 leitet er weiter an Server 2
- Server 2 (apache) ist so konfiguriert, dass automatisch auf https umgeleitet wird.
- Auf beiden Servern läuft ein certbot
Die Server lassen sich aus dem Heimnetzwerk fehlerfrei ansprechen.
Fehler:
- Domain 1 meldet End of File Error
- Domain 2 antwortet gar nicht
Kann mir bitte jemand helfen, die nginx.conf anzupassen?
Meine nginx.conf:
root@reverseProxy:~# nano /etc/nginx/nginx.conf
GNU nano 2.9.3 /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
#stream {
# server {
# listen 443;
# proxy_ssl on;
# server_name .bardhome.de;
# location / {
# proxy_pass https:{{comment_single_line_double_slash:0}}
# }
# }
#
#}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javas$
##
# Virtual Host Configs
##
server {
listen 80;
server_name huntworker.ddns.net;
return 301 https://$host$request_uri;
}
server {
listen 80;
server_name .bardhome.de bardhome.spdns.de;
return 301 192.168.178.8;
}
server {
listen 443;
server_name .bardhome.de bardhome.spnds.de;
return 301 192.168.178.8:443;
# location / {
# proxy_pass https://192.168.101/;
# proxy_buffering off;
# proxy_ssl_server_name on;
# proxy_set_header X-Real-IP $remote_addr;
# }
#
# }
server {
listen 80 default_server;
listen 443 ssl;
listen [::]:80 default_server;
ssl_certificate /etc/letsencrypt/live/huntworker.ddns.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/huntworker.ddns.net/privkey.pem;
server_name _;
location / {
proxy_pass http://192.168.178.2:81/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
}
location /pv {
proxy_pass http://192.168.178.7/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
}
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Wenn ich folgendes auskommentiere funktioniert Domain 1, domain 2 aber antworetet nicht:
server {
listen 443;
server_name .bardhome.de bardhome.spnds.de;
return 301 192.168.178.8:443;
# location / {
# proxy_pass https:{{comment_single_line_double_slash:0}}
# proxy_buffering off;
# proxy_ssl_server_name on;
# proxy_set_header X-Real-IP $remote_addr;
# }
#
# }
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 585320
Url: https://administrator.de/contentid/585320
Ausgedruckt am: 19.11.2024 um 07:11 Uhr
3 Kommentare
Neuester Kommentar
Das nützt nicht wenn du dem anfragenden Browser ein
zurück gibst, mit dieser Adresse kann er nichts anfangen, das ist eine IP, die übers Internet nicht erreichbar ist.
Die return 301 sind nur gut um dem Browser zu sagen, der Server ist wo anders erreichbar (nicht hier), das ist also nur gut um auf HTTPS zu wechseln oder der Server ist nun wirklich unter einem anderen DNS Namen oder anderer öffentlicher IP erreichbar). Proxy Anfragen darfst du nicht mit 301 beantworten, sondern der Proxy muss die Anfrage annehmen, sich die Daten holen und es dem Anfragendenen selbst weiter geben.
Dafür gibt es zwei Varianten:
Der Nginx nimmt die Anfragen an, holt sich die Daten vom Server2 und antwortet mit ihnen.
Variante 1: Der Nginx verwendet dafür sein eigenes Zertifikat (das beide Namen beinhalten muss)
Variante 2: Der Host Header wird durchgereicht, also antwortet Nginx mit dem Zertifikat von Server2, wenn die Anfrage für Server2 angedacht war.
Beides müsste Nginx theoretisch können (praktisch habe ich keine Erfahung gesammelt oder die Datenblätter überprüft).
return 301 192.168.178.8
zurück gibst, mit dieser Adresse kann er nichts anfangen, das ist eine IP, die übers Internet nicht erreichbar ist.
Die return 301 sind nur gut um dem Browser zu sagen, der Server ist wo anders erreichbar (nicht hier), das ist also nur gut um auf HTTPS zu wechseln oder der Server ist nun wirklich unter einem anderen DNS Namen oder anderer öffentlicher IP erreichbar). Proxy Anfragen darfst du nicht mit 301 beantworten, sondern der Proxy muss die Anfrage annehmen, sich die Daten holen und es dem Anfragendenen selbst weiter geben.
Dafür gibt es zwei Varianten:
Der Nginx nimmt die Anfragen an, holt sich die Daten vom Server2 und antwortet mit ihnen.
Variante 1: Der Nginx verwendet dafür sein eigenes Zertifikat (das beide Namen beinhalten muss)
Variante 2: Der Host Header wird durchgereicht, also antwortet Nginx mit dem Zertifikat von Server2, wenn die Anfrage für Server2 angedacht war.
Beides müsste Nginx theoretisch können (praktisch habe ich keine Erfahung gesammelt oder die Datenblätter überprüft).
Zitat von @godlich:
Vielen Dank!
ich habs auch mit proxy_pass http://192.168.178.8 versucht, aber das lief auch nicht, gleicher Fehler.
Variante 2: Der Host Header wird durchgereicht, also antwortet Nginx mit dem Zertifikat von Server2, wenn die Anfrage für Server2 angedacht war würde ich präferieren. Ich habe schon einiges gegoogelt, aber ich finde nur Anleitungen, in denen auf http umgeleitet wird oder bei denen eben nur 1 Server im Spiel ist, dessen certbot sich um alle Anfragen kümmert.
Vielen Dank!
ich habs auch mit proxy_pass http://192.168.178.8 versucht, aber das lief auch nicht, gleicher Fehler.
Variante 2: Der Host Header wird durchgereicht, also antwortet Nginx mit dem Zertifikat von Server2, wenn die Anfrage für Server2 angedacht war würde ich präferieren. Ich habe schon einiges gegoogelt, aber ich finde nur Anleitungen, in denen auf http umgeleitet wird oder bei denen eben nur 1 Server im Spiel ist, dessen certbot sich um alle Anfragen kümmert.
Dazu müssten beide Zertifikate auf deinem Reverse Proxy (Server1) vorhanden sein. Ein "Durchreichen" des Zertifikats vom Backend-Server (Server2) ist prinzipbedingt nicht möglich. Wenn das ginge, wäre https ja grundsätzlich per Man-in-the-middle angreifbar.
Erstell dir am besten ein internes Zertifikat für Server2 (welchem Server1 dann vertrauen muss) und handhabe beide öffentlichen (Certbot-)Zertifikate auf deinem Reverse-Proxy.