nginx: backend https, proxy_pass muestra ip

nginx: backend https, proxy_pass muestra ip

Estoy usando nginx como proxy inverso escuchando en el puerto 80 (http). Estoy usando proxy_pass para reenviar solicitudes a los servidores backend http y https. Todo funciona bien para mi servidor http, pero cuando intento llegar al servidor https a través del proxy inverso nginx, la IP del servidor https se muestra en el navegador web del cliente. Quiero que se muestre el uri del servidor nginx en lugar de la IP del servidor backend https (una vez más, esto funciona bien con el servidor http pero no para el servidor https). Veresta publicación en el foro

Aquí está mi archivo de configuración:

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;
}
}

Cuando pruebo la directiva "proxy_set_header Host $http_host" y "proxy_set_header Host $host", no se puede acceder a la página web (página no encontrada). Pero cuando lo comento se muestra en el navegador la ip del servidor https (lo cual es malo).

Alguien tiene alguna idea ?

Mis otros archivos de configuración son:

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/*;
}

Gracias por tu ayuda !


Seguí su consejo y su ejemplo, y moví mis directivas de caché a bloques de servidor externos y directivas de proxy dentro de bloques de ubicación. Sigo teniendo exactamente el mismo problema: cuando proxy_set_header Host $host;está escrito, no se puede acceder al sitio web https a través de nginx.

Cuando lo comento, puedo acceder al servidor https a través de nginx, pero la dirección IP LAN del servidor https se muestra en la barra de direcciones, a pesar de la directiva proxy_pass y proxy_redirect desactivados. Pero todavía funciona para el servidor http (se muestra la IP de nginx en lugar de la IP del servidor http).

Una precisión más: no llego a la página web https tan pronto como entro a http://addressOfMyNginx/. Hay una página de advertencia antes porque el certificado no está autenticado. En esta página sigo have http://addressOfMyNginx/en la barra de direcciones. Pero cuando sigo el enlace "continuar en el sitio web de todos modos", se me redirige al sitio web https y luego se muestra la dirección IP del servidor https.

Después de leer los registros de depuración, encontré:

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

Donde xxx.xxx.xxx.xxx es la dirección pública de un servidor que no tiene nada que ver con nginx o mi servidor backend (y tampoco tiene nada que ver con la cookie mencionada anteriormente).

Recargué/reinicié y borré el caché de mi navegador y el caché de nginx durante mucho tiempo desde que probé el servidor que podría haber afectado a esta cookie. Pero xxx.xxx.xxx.xxx realmente no tiene nada que ver con todo esto.


No puedo comentar la última publicación porque publiqué con una cuenta anónima y borré el caché de mi navegador. Entonces SF ya no me reconoció como Vulpo... (luego creé una cuenta).

Respuesta1

proxy_redirect offdebería funcionar. Creo que también deberías cambiar tu proxy_passpara usar SSL si quieres usar SSL para tu backend. Aunque un socket Unix sería mucho mejor para reforzar la seguridad y mantener una conexión rápida.


Mi nginx.conf recomendado:

# /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/*;
}

Mi configuración de host virtual recomendada:

# /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;
  }
}

Eche un vistazo a mi configuración de nginx en GitHub para obtener información más avanzada (aún no está terminada, primero tengo que escribir más comentarios):https://github.com/Fleshgrinder/nginx

información relacionada