#docker #nginx #ssl #nginx-reverse-proxy #nginx-config
#docker #nginx #ssl #nginx-reverse-proxy #nginx-config
Вопрос:
Существует ли «правильная» структура для директив обратного прокси-сервера NGINX? Я увидел 2 основных отличия при поиске примеров обратного прокси-сервера NGINX.
http
директива используется для размещения всехserver
директив. Серверы с данными перечислены в пуле вupstream
директиве.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. Отлично, спасибо за разъяснение! Хотел бы я видеть, где / почему это происходит в документации