nginx: Backend https, proxy_pass zeigt IP

nginx: Backend https, proxy_pass zeigt IP

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 offsollte funktionieren. Ich denke, Sie sollten auch proxy_passSSL 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

verwandte Informationen