Необязательный параметр tls образа Docker nginx

Мне нужно создать образ докера nginx, который можно использовать для настройки дополнительных сертификатов TLS/SSL.

Когда сертификат не предоставлен, nginx должен работать как обратный прокси на порту 80 и выполнять свою работу. Если сертификат установлен, nginx должен прослушивать порт 80, перенаправлять на https/порт 443 и выполнять свою работу в качестве обратного прокси.

Есть ли для этого какое-то «нестандартное» решение?

Материал парсинга/шаблона переменных среды очень прост и не допускает никакой логики, такой как блоки «если».

Я подумал о чем-то вроде механизма шаблонов/синтаксиса, такого как «усы» или что-то подобное для создания серверных блоков.

Конфигурация nginx по умолчанию:

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {

    listen 80 default_server;
    server_name 127.0.0.1 localhost ${NGINX_HOSTNAME};

    # remove server version
    server_tokens off;

    root /usr/share/nginx/html;

    autoindex off;    
    access_log off;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    location ~ /(api|auth)/(.*)$ {
        resolver ${RESOLVER};
        proxy_pass ${BACKEND_PROTOCOL}://${BACKEND_HOST}:${BACKEND_PORT}/$1/$2;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        try_files $uri $uri/ =404;
        index index.html;
    }

}

Докерфайл:

FROM nginx:1.23.2-alpine

ENV NODE_ENV=production
ENV NGINX_HOSTNAME="example.com"
ENV BACKEND_PROTOCOL="http"
ENV BACKEND_HOST="127.0.0.1"
ENV BACKEND_PORT="8080"
ENV RESOLVER="127.0.0.11"

ARG version=unknown
LABEL version=$version

ARG buildDate=unknown
LABEL buildDate=$buildDate

COPY nginx.conf /etc/nginx/templates/default.conf.template
COPY build /usr/share/nginx/html

RUN apk --no-cache add openssl

Я мог бы делать шаблоны при создании образа, проблема в том, что я не знаю, кто использует образ и нужен ли этот материал TLS или нет. Поэтому, когда сертификат не предоставлен, nginx не запускается, потому что не может найти этот файл.

Динамическую конфигурацию необходимо создавать при запуске контейнера.

У кого-нибудь есть идея/решение для этого? Я не могу поверить, что я единственный с этой проблемой.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *