nginx根据环境变量进行条件代理传递

sem*_*ral 5 nginx docker

我想根据环境变量有条件地 proxy_pass 到相关服务。我的意思是,prox_pass 地址应该根据 NODE_ENV 变量进行更改。

这样做的最佳方法是什么?我可以对 proxy_pass 使用如下 if 语句吗?如果是的话我应该怎么做?除此之外,我尝试创建一个如下所示的 bash 将环境变量传递给 nginx,但无法以$NGINX_BACKEND_ADDRESS某种方式设置并传递给 nginx conf。任何帮助将不胜感激

   if ($NODE_ENV == "development) {
       proxy_pass http://myservice-dev;
   }
Run Code Online (Sandbox Code Playgroud)

nginx.conf

server {
    listen  3000;
    location / {
        root /usr/src/app;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    location /csrf/token {
        proxy_pass ${NGINX_BACKEND_ADDRESS}/csrf/token;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    location /export/apis {
        proxy_pass ${NGINX_BACKEND_ADDRESS}/export/apis;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
Run Code Online (Sandbox Code Playgroud)

入口点.sh

#!/usr/bin/env sh
set -eu
export NODE_ENV=development
if ["$NODE_ENV" == "development"]
then
    export NGINX_BACKEND_ADDRESS=http://backend-dev
elif ["$NODE_ENV" == "stage"]
then
    export NGINX_BACKEND_ADDRESS=http://backend-stage
elif ["$NODE_ENV" == "development"
then
    export NGINX_BACKEND_ADDRESS=http://backend-preprod
elif ["$NODE_ENV" == "development"]
then
    export NGINX_BACKEND_ADDRESS=http://backend
else 
    echo "Error in reading environment variable in nginx-conf.sh."
fi
echo "Will proxy requests for  to ${NGINX_BACKEND_ADDRESS}*"
exec /nginx-conf.sh "$@"
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM nginx:alpine AS production-build
WORKDIR /usr/src/app
ARG NODE_ENVIRONMENT=development
ENV NODE_ENV=$NODE_ENVIRONMENT
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/nginx.conf.template /etc/nginx/conf.d/default.conf.template
COPY nginx-conf.sh /
RUN chgrp -R root /var/cache/nginx /var/run /var/log/nginx /var/run/nginx.pid && \
    chmod -R 775 /var/cache/nginx /var/run /var/log/nginx /var/run/nginx.pid
USER nginx
COPY --from=builder /usr/src/app/dist .
ENTRYPOINT ["/nginx-conf.sh", $NODE_ENVIRONMENT]
EXPOSE 3000
CMD ["nginx", "-g", "daemon off;"]
Run Code Online (Sandbox Code Playgroud)

Sha*_*ail 1

如果你想在 dockerfile 中运行 if 语句,那么你可以在 dockerfile 中使用 RUN 命令,例如使用 bash, RUN if [[ -z "$arg" ]] ; then echo Argument not provided ; else echo Argument is $arg ; fi