Ich verwende nginx als Reverse-Proxy, der auf Port 80 (http) lauscht. Ich verwende proxy_pass, um Anfragen an Backend-HTTP- und HTTPS-Server weiterzuleiten. Für meinen HTTP-Server funktioniert alles einwandfrei, aber wenn ich versuche, den HTTPS-Server über den Nginx-Reverse-Proxy zu erreichen, wird die IP des HTTPS-Servers im Webbrowser des Clients angezeigt. Ich möchte, dass die URI des Nginx-Servers anstelle der IP des HTTPS-Backend-Servers angezeigt wird (noch einmal, dies funktioniert einwandfrei mit dem HTTP-Server, aber nicht mit dem HTTPS-Server). Siehedieser Beitrag im Forum
Hier ist meine Konfigurationsdatei:
server {
listen 80;
server_name domain1.com;
access_log off;
root /var/www;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
location / {
proxy_pass http://ipOfHttpServer:port/;
}
}
server {
listen 80;
server_name domain2.com;
access_log off;
root /var/www;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
location / {
proxy_pass http://ipOfHttpsServer:port/;
proxy_set_header X_FORWARDED_PROTO https;
#proxy_set_header Host $http_host;
}
}
Wenn ich die Direktive "proxy_set_header Host $http_host" und "proxy_set_header Host $host" versuche, kann die Webseite nicht erreicht werden (Seite nicht gefunden). Aber wenn ich sie kommentiere, wird die IP des https-Servers im Browser angezeigt (was schlecht ist).
Hat jemand eine Idee?
Meine anderen Konfigurationsdateien sind:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_hide_header X-Powered-By;
proxy_intercept_errors on;
proxy_buffering on;
proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;
user www-data;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
server_names_hash_bucket_size 64;
sendfile off;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_comp_level 5;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_types text/plain text/html text/css image/x-icon application/x-javascript;
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Vielen Dank für Ihre Hilfe !
Ich bin Ihrem Rat und Ihrem Beispiel gefolgt und habe meine Cache-Direktiven in externe Serverblöcke und Proxy-Direktiven in Standortblöcke verschoben. Ich habe immer noch genau dasselbe Problem: Wenn proxy_set_header Host $host;
geschrieben wird, ist die https-Website über nginx nicht erreichbar.
Wenn ich es kommentiere, kann ich den https-Server über nginx erreichen, aber die LAN-IP-Adresse des https-Servers wird in der Adressleiste angezeigt, trotz der Proxy_Pass-Direktive und deaktiviertem Proxy_Redirect. Aber es funktioniert immer noch für den HTTP-Server (die IP von nginx wird anstelle der IP des HTTP-Servers angezeigt).
Noch eine Präzisierung: Ich erreiche die https-Webseite nicht, sobald ich auf gehe http://addressOfMyNginx/
. Davor erscheint eine Warnseite, weil das Zertifikat nicht authentifiziert ist. Auf dieser Seite befinde ich mich noch have http://addressOfMyNginx/
in der Adressleiste. Aber wenn ich dem Link „Trotzdem zur Webseite gehen“ folge, werde ich auf die https-Webseite umgeleitet und dann wird die IP-Adresse des https-Servers angezeigt.
Nach dem Lesen der Debug-Protokolle habe ich Folgendes festgestellt:
2012/07/30 17:24:13 [debug] 4412#0: *75 http proxy header:
"GET / HTTP/1.0^M
Host: nameOfMMyNginxServer^M
X-Real-IP: xxx.xxx.xxx.xxx^M
X-Forwarded-For: xxx.xxx.xxx.xxx^M
Connection: close^M
Accept: text/html, application/xhtml+xml, */*^M
Accept-Language: fr-FR^M
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)^M
Accept-Encoding: gzip, deflate^M
Cookie: a_cookie_which_has_nothing_to_do_with_my_nginx_and_mybackend_server^M
Wobei xxx.xxx.xxx.xxx die öffentliche Adresse eines Servers ist, der nichts mit nginx oder meinem Backend-Server zu tun hat (und auch nichts mit dem zuvor erwähnten Cookie zu tun hat).
Ich habe den Cache meines Browsers und den Cache von Nginx seit dem Testen des Servers oft neu geladen/neugestartet und geleert, was mit diesem Cookie zusammenhängen könnte. Aber xxx.xxx.xxx.xxx hat damit wirklich nichts zu tun.
Ich kann den letzten Beitrag nicht kommentieren, da ich ihn mit einem anonymen Konto gepostet und den Cache meines Browsers geleert habe. Daher hat SF mich nicht mehr als Vulpo erkannt ... (dann habe ich ein Konto erstellt).
Antwort1
proxy_redirect off
sollte funktionieren. Ich denke, Sie sollten auch proxy_pass
SSL verwenden, wenn Sie SSL für Ihr Backend verwenden möchten. Ein Unix-Socket wäre allerdings viel besser, um die Sicherheit zu erhöhen und trotzdem eine schnelle Verbindung aufrechtzuerhalten.
Meine empfohlene nginx.conf:
# /etc/nginx/nginx.conf
user www-data;
worker_processes 2; # Do you really have two CPU cores?
events {
multi_accept on;
worker_connections 768;
use epoll;
}
http {
charset utf-8;
client_body_timeout 65;
client_header_timeout 65;
client_max_body_size 10m;
default_type application/octet-stream;
index index.html index.php /index.php;
keepalive_timeout 20;
reset_timedout_connection on;
send_timeout 65;
sendfile on;
server_names_hash_bucket_size 64;
tcp_nodelay off;
tcp_nopush on;
gzip on;
gzip_buffers 32 4k;
gzip_comp_level 2;
gzip_disable "msie6";
gzip_http_version 1.1;
gzip_min_length 1100;
gzip_proxied any;
gzip_static on;
gzip_types
#text/html is always compressed by HttpGzipModule
text/css
text/plain
application/javascript
application/x-javascript
application/json
application/x-json
application/rss+xml
application/xml
application/vnd.ms-fontobject
font/truetype
font/opentype
image/x-icon
image/svg+xml;
gzip_vary on;
include mime.types;
include conf.d/*.conf;
include sites-enabled/*;
}
Meine empfohlene virtuelle Hostkonfiguration:
# /etc/nginx/sites-available/default.conf
proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;
server {
listen 80;
server_name example.com;
access_log off;
root /var/www;
# Consider using a map for this! If is bad!
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;
proxy_buffering on;
proxy_pass http://127.0.0.1:port$request_uri;
}
}
Für fortgeschrittenere Dinge schauen Sie sich meine Nginx-Konfiguration auf GitHub an (noch nicht fertig, muss zuerst mehr Kommentare schreiben):https://github.com/Fleshgrinder/nginx