Структура конфигурации обратного прокси-сервера NGINX

#docker #nginx #ssl #nginx-reverse-proxy #nginx-config

#docker #nginx #ssl #nginx-reverse-proxy #nginx-config

Вопрос:

Существует ли «правильная» структура для директив обратного прокси-сервера NGINX? Я увидел 2 основных отличия при поиске примеров обратного прокси-сервера NGINX.

  1. http директива используется для размещения всех server директив. Серверы с данными перечислены в пуле в upstream директиве.
  2. server директивы перечислены непосредственно в main директиве.

Есть ли какая-либо причина для этого или это просто синтаксическая разница в сахаре?

Пример #1 в файле ./nginx.conf:

 upstream docker-registry {
  server registry:5000;
}

http {
  server {
    listen 80;
    listen [::]:80;

    return 301 https://$host#request_uri;
  }

  server {
    listen 443 default_server;
    ssl on;
    ssl_certificate external/cert.pem;
    ssl_certificate_key external/key.pem;
    
    # set HSTS-Header because we only allow https traffic
    add_header Strict-Transport-Security "max-age=31536000;";

    proxy_set_header Host       $http_host;   # required for Docker client sake
    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
      auth_basic "Restricted"
      auth_basic_user_file    external/docker-registry.htpasswd;
      
      proxy_pass http://docker-registry; # the docker container is the domain name
    }
    
    location /v1/_ping {
      auth_basic off;
      proxy_pass http://docker-registry; 
    }
  }
}
 

Пример # 2 в файле ./nginx.conf:

 server {
  listen 80;
  listen [::]:80;
  
  return 301 https://$host#request_uri;
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  
  error_log  /var/log/nginx/error.log  info;
  access_log /var/log/nginx/access.log main;

  ssl_certificate     /etc/ssl/private/{SSL_CERT_FILENAME};
  ssl_certificate_key /etc/ssl/private/{SSL_CERT_KEY_FILENAME};

  location / {
    proxy_pass http://app1
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr; # could also be `$proxy_add_x_forwarded_for`
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
}
 

Ответ №1:

Я не совсем понимаю ваш вопрос, но мне кажется, что во втором примере отсутствует http {}, я не думаю, что nginx запустится без него. если только ваш файл example2 не включен каким-либо образом в nginx.conf, который имеет http{}

Комментарии:

1. Да, точно, я видел оба стиля в различных статьях, посвященных учебникам, и в различных репозиториях GitHub. Включение http директивы или ее отсутствие для обратного прокси-сервера — это то, что мне кажется странным. NGINX будет начинаться с любой структуры. Возможно ли это из-за того, что nginx.conf правила добавляются к правилам по умолчанию, изложенным в /etc/nginx/conf.d/ или что-то в этом роде?

2. это точно. nginx не разрешает такие директивы за пределами http{}. и, конечно, не имеет ничего общего с проксированием, обратным проксированием или чем-либо еще в этом роде. директива сервера разрешена только внутри http

3. Отлично, спасибо за разъяснение! Хотел бы я видеть, где / почему это происходит в документации