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 off
debería funcionar. Creo que también deberías cambiar tu proxy_pass
para 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