nginx: backend https, proxy_pass mostra ip

2

Estou usando o nginx como um proxy reverso ouvindo na porta 80 (http). Estou usando o proxy_pass para encaminhar solicitações para servidores backend http e https. Tudo funciona bem para o meu servidor http, mas quando tento acessar o servidor https através do proxy reverso nginx, o ip do servidor https é mostrado no navegador da web do cliente. Eu quero o uri do servidor nginx a ser mostrado em vez do ip do servidor backend https (mais uma vez, isso funciona bem com o servidor http, mas não para o servidor https). Consulte este postar no fórum

Aqui está o meu arquivo de configuração:

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

Quando eu tento a diretiva "proxy_set_header Host $ http_host" e "proxy_set_header Host $ host" a página da Web não pode ser acessada (página não encontrada). Mas quando eu comento, o ip do servidor https é mostrado no navegador (o que é ruim).

Alguém tem uma ideia?

Meus outros arquivos de configuração são:

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

Obrigado pela sua ajuda!

Eu segui seu conselho e seu exemplo e movi minhas diretivas de cache para blocos de servidores externos e diretivas de proxy dentro de blocos de localização. Eu ainda tenho exatamente o mesmo problema: quando proxy_set_header Host $host; é escrito, o site https é inacessível através do nginx.

Quando eu o comento, posso alcançar o servidor https através do nginx, mas o endereço lan ip do servidor https é exibido na barra de endereço, apesar da diretiva proxy_pass e do proxy_redirect desativados. Mas ainda funciona para o servidor http (o ip do nginx é exibido em vez do ip do servidor http).

Mais uma precisão: não chego à página https da web assim que vou para http://addressOfMyNginx/ . Há uma página de aviso antes porque o certificado não é autenticado. Nesta página ainda estou have http://addressOfMyNginx/ na barra de endereços. Mas quando eu sigo o link "continue para o site de qualquer jeito", sou redirecionado para o site https e, em seguida, o endereço IP do servidor https é exibido.

Depois de ler os registros de depuração, descobri:

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

Onde xxx.xxx.xxx.xxx é o endereço público de um servidor que não tem nada a ver com o nginx ou meu servidor de back-end (e não tem nada a ver com o cookie mencionado antes).

Eu recarreguei / reiniciei e limpei o cache do meu navegador e do cache do nginx muito tempo desde que eu testei o servidor que poderia ter preocupado este cookie. Mas xxx.xxx.xxx.xxx realmente não tem nada a ver com isso tudo.

Não posso comentar o último post porque postei com uma conta anônima e limpei o cache do meu navegador. Então o SF não me reconheceu mais como Vulpo ... (então eu criei uma conta).

    
por Vulpo 23.08.2012 / 17:31

1 resposta

1

proxy_redirect off deve fazer o truque. Acho que você também deve alterar seu proxy_pass para usar SSL se quiser usar o SSL para seu back-end. Embora um soquete Unix seja muito melhor para aumentar a segurança e ainda manter uma conexão rápida.

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

Minha configuração 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;
  }
}

Dê uma olhada na minha configuração nginx no GitHub para informações mais avançadas (ainda não concluídas, primeiro escreva mais comentários): link

    
por 24.08.2012 / 07:07