NGINX: Как мне удалить порт при выполнении обратного прокси? - PullRequest
1 голос
/ 29 мая 2019

У меня настроен обратный прокси-сервер Nginx, который используется в качестве разгрузки SSL для нескольких серверов, таких как слияние. У меня он успешно работает для взятия http://confluence и https://confluence, но когда я пытаюсь перенаправить http://confluence:8090,, он пытается перейти к https://confluence:8090 и не удается.

Как я могу удалить порт из URL?

Конфигурация ниже немного урезана, но может быть полезна? Бит $ server_port в заголовках вызывает проблему?

server {
    listen      8090;
    server_name confluence;

    return 301 https://confluence$request_uri;
}

server {
    listen      443 ssl http2;
    server_name confluence;
    location / {
        proxy_http_version 1.1;
        proxy_pass http://confbackend:8091
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $server_name:$server_port;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Upgrade $http_upgrade; #WebSocket Support
        proxy_set_header Connection $connection_upgrade; #WebSocket Support
   }
}

Похоже, многие ответы здесь включают http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect, но я не нахожу утешения в этом запутанном беспорядке.

Я бы тоже подумал, что у вас будет один сервер, но я пытался получить совет от https://serverfault.com/questions/815797/nginx-rewrite-to-new-protocol-and-port

Я пытался связываться с опцией port_in_redirect off;, но, возможно, я использовал ее неправильно?


РЕДАКТИРОВАТЬ 1: Добавить файлы conf

Приведенные ниже файлы являются модификациями настройки Artifactory nginx . Сначала я использовал их настройку и добавил дополнительные файлы conf (в ./conf.d/) для других конечных точек RP.

Confluence.conf

server {
  listen 8090 ssl http2;
  server_name confluence.domain.com confluence;
  ## return 301 https://confluence.domain.com$request_uri;
  proxy_redirect https://confluence.domain.com:8090 https://confluence.domain.com;
}

server {

  ## add ssl entries when https has been set in config
  ssl_certificate  /data/rpssl/confluence.pem;
  ssl_certificate_key  /data/rpssl/confluence_unencrypted.key;

  ## server configuration
  listen 443 ssl http2;
  server_name confluence.domain.com confluence;

  add_header Strict-Transport-Security max-age=31536000;

  if ($http_x_forwarded_proto = '') {
    set $http_x_forwarded_proto  $scheme;
  }
  ## Application specific logs
  access_log /var/log/nginx/confluence-access.log timing;
  error_log /var/log/nginx/confluence-error.log;
  client_max_body_size 0;

  proxy_read_timeout    1200;
  proxy_connect_timeout 240;

  location / {
    proxy_http_version  1.1;
    proxy_pass          http://backendconfluence.domain.com:8091;

    proxy_set_header    X-Forwarded-Host  $http_host;
    proxy_set_header    X-Forwarded-Proto $scheme;
    proxy_set_header    Host              $server_name:$server_port;
    proxy_set_header    X-Forwarded-For   $remote_addr;
    proxy_set_header    Upgrade           $http_upgrade; # WebSocket Support
    proxy_set_header    Connection        $connection_upgrade; # WebSocket support
  }
}

nginx.conf

# Main Nginx configuration file
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

worker_rlimit_nofile  4096;

events {
  worker_connections  2048;
}


http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  variables_hash_max_size 1024;
  variables_hash_bucket_size 64;
  server_names_hash_max_size 4096;
  server_names_hash_bucket_size 128;
  types_hash_max_size 2048;
  types_hash_bucket_size 64;
  proxy_read_timeout 2400s;
  client_header_timeout 2400s;
  client_body_timeout 2400s;
  proxy_connect_timeout 75s;
  proxy_send_timeout 2400s;
  proxy_buffer_size 32k;
  proxy_buffers 40 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 250m;
  proxy_http_version 1.1;
  client_body_buffer_size 128k;

  map $http_upgrade $connection_upgrade { #WebSocket support
    default upgrade;
    '' '';
  }

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  '$status $body_bytes_sent "$http_referer" '
  '"$http_user_agent" "$http_x_forwarded_for"';

  log_format timing 'ip = $remote_addr '
  'user = \"$remote_user\" '
  'local_time = \"$time_local\" '
  'host = $host '
  'request = \"$request\" '
  'status = $status '
  'bytes = $body_bytes_sent '
  'upstream = \"$upstream_addr\" '
  'upstream_time = $upstream_response_time '
  'request_time = $request_time '
  'referer = \"$http_referer\" '
  'UA = \"$http_user_agent\"';

  access_log  /var/log/nginx/access.log  timing;

  sendfile        on;
  #tcp_nopush     on;

  keepalive_timeout  65;

  #gzip  on;

  include /etc/nginx/conf.d/*.conf;
}

1 Ответ

1 голос
/ 21 июня 2019

Ваша проблема - заголовок STS

add_header Strict-Transport-Security max-age=31536000;

При добавлении заголовка STS. Первый запрос к http://example.com:8090 генерирует перенаправление на https://example.com

Этот https://example.com затем возвращает заголовок STS в ответе, и браузер запоминает, что example.com всегда нужно подавать на https, несмотря ни на что. Порт не имеет значения

Теперь, когда вы делаете еще один запрос к http://example.com:8090, STS запускает и затем преобразует его в https://example.com:8090, что является вашей проблемой здесь

Поскольку порт может обслуживать только http или https, вы не можете использовать 8090 для перенаправления http на https И перенаправления https 8090 на https 443

...