У меня есть сервер NGINX, встроенный в образ Docker, который я хочу использовать как в производственной, так и в промежуточной среде.
Проблема в том, что промежуточная среда требует, чтобы была включена базовая проверка подлинности, чтобы защитить сервер от посторонних глаз.
Есть ли способ динамически применить базовую аутентификацию к серверу nginx? Я могу передать переменную среды в nginx или использовать предварительно определенное статическое имя хоста, чтобы отличать производство от развертывания.
Однако я не уверен, как условно использовать эти данные в nginx.
Вот моя конфигурация:
server {
listen 80 default_server;
# IF: %ENVIRONMENT% = 'staging' OR
# IF: $host = 'example.com'
auth_basic "global";
auth_basic_user_file /etc/nginx/.htpasswd;
#
root /var/www;
location /health-check {
auth_basic off;
try_files /health-check.html =404;
}
location / {
try_files $uri $uri/ /index.html;
}
}
Любые предложения будут высоко оценены.
Nginx не поддерживает переменные среды в блоках server, location или http, но вы можете заменить вхождение конкретной переменной в файле конфигурации на значение значения среды на envsubst
до того, как nginx загрузит его.
С таким конфигурационным файлом:
server {
listen 80 default_server;
auth_basic ${BASIC_AUTH_ENABLED};
auth_basic_user_file /etc/nginx/.htpasswd;
root /var/www;
location /health-check {
try_files /health-check.html =404;
}
location / {
try_files $uri $uri/ /index.html;
}
}
вы можете заменить "$ {BASIC_AUTH_ENABLED}" значением переменной env BASIC_AUTH_ENABLED
бегом
envsubst '${BASIC_AUTH_ENABLED}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf
Первый параметр '${BASIC_AUTH_ENABLED}'
указывает envsubst заменять только те вхождения, которые соответствуют этому тексту (обязательно используйте простые кавычки, иначе расширение параметра может произойти до выполнения самого envsubst).
Если значение auth_basic
имеет особую ценность off
, базовая аутентификация отключена (см. nginx документация по auth_basic).
В качестве точки входа вашего контейнера Docker вы можете запустить сценарий bash, например:
if
[ ${BASIC_AUTH_ENABLED} = "true" ] ;
then
htpasswd -cb -B -C 10 /etc/nginx/.htpasswd ${BASIC_AUTH_USER} ${BASIC_AUTH_PASSWORD} ;
else
export BASIC_AUTH_ENABLED=off ;
fi
envsubst '${BASIC_AUTH_ENABLED}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf
Поэтому, если вы включили базовую аутентификацию, зашифруйте пароль для данного пользователя, в противном случае установите значение env var на «off» специально, чтобы nginx отключил базовую аутентификацию.