Назад | Перейти на главную страницу

Обмен данными аутентификации между серверами в nginx

У меня есть http-сервер, который использует порты 9200 и 9292 (для logstash).

Поскольку сервер не поддерживает аутентификацию, я хотел бы установить обратный прокси-сервер nginx для обработки аутентификации.

Это конфигурация, которую я использовал:

server {
    listen 9292 default_server;
    server_name proxy_host;

    location / {
      proxy_pass http://logstash_server:9292;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/.htpasswd;

    }
}

server {
    listen 9200 default_server;
    server_name proxy_host;

    location / {
      proxy_pass http://logstash_server:9200;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      auth_basic "Restricted";
      auth_basic_user_file /etc/nginx/.htpasswd;

    }
}

и когда я иду в http://proxy_host:9292, браузер запрашивает у меня аутентификацию, но когда я в какой-то момент перенаправляюсь на http://proxy_host:9200, Мне нужно снова пройти аутентификацию.

Есть ли способ каким-либо образом разделить данные аутентификации между обоими прокси, чтобы аутентификация происходила только один раз?

Проблема с аутентификацией исходит не от Nginx, а от ваших браузеров. Веб-браузеры различают домен аутентификации, используя весь кортеж "[scheme]: // [domain]: [port]", поэтому не имеет значения, используют ли ваши серверы один и тот же сервер аутентификации, потому что ваш браузер будет запрашивать и сохранять учетные данные отдельно для каждого домен.

Единственная альтернатива, которую я могу придумать, - проксировать оба сервера приложений за одним и тем же серверным блоком Nginx и различать ваши запросы по URL-пути, например:

server {
  listen 9200 default_server;
  server_name proxy_host;

  location /stash9292 {
    proxy_pass http://logstash_server:9292;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
  }

  location /stash9200 {
    proxy_pass http://logstash_server:9200;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
  }

  location / {
    proxy_pass http://logstash_server:9200;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
  }

}