• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

350
Views
pase de proxy condicional nginx basado en la variable de entorno

Me gustaría pasar proxy_pass al servicio relacionado condicionalmente en función de la variable de entorno. Lo que quiero decir es que la dirección prox_pass debe cambiarse en función de la variable NODE_ENV.

¿Cuál es el mejor enfoque para hacer esto? ¿Puedo usar una declaración if como la siguiente para proxy_pass? Si es así, ¿cómo debo hacer esto? Aparte de esto, traté de crear un bash como se muestra a continuación para pasar la variable de entorno a nginx pero no pude establecer y pasar $NGINX_BACKEND_ADDRESS a nginx conf de alguna manera. Cualquier ayuda será apreciada

 if ($NODE_ENV == "development) { proxy_pass http://myservice-dev; }

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"; }

punto de entrada.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 "$@"

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;"]
almost 3 years ago · Santiago Trujillo
3 answers
Answer question

0

La imagen nginx de Docker Hub (a partir de nginx:1.19 ) tiene una función para realizar el reemplazo de variables de entorno en los archivos de configuración:

[...] esta imagen tiene una función que extraerá las variables de entorno antes de que se inicie nginx. [...] esta función lee archivos de plantilla en /etc/nginx/templates/*.template y envía el resultado de ejecutar envsubst a /etc/nginx/conf.d .

Entonces, su primer paso es cambiar el nombre de su archivo de configuración tal como está (incluido proxy_pass ${NGINX_BACKEND_ADDRESS}/... ) a algo como default.conf.template y colocarlo en el directorio requerido.

Pasaría directamente esa dirección en su configuración de tiempo de implementación. No lo incluiría en la imagen de ninguna manera. (Imagínese configuraciones como "un desarrollador está tratando de ejecutar esta pila en su sistema de escritorio local" donde ninguna de las URL en el script de punto de entrada es correcta). Eso también le permite deshacerse de casi todo el código aquí; solo tendrías

 # Dockerfile FROM ... AS builder ... FROM nginx:1.21-alpine COPY nginx/nginx.conf.template /etc/nginx/conf.d/default.conf.template COPY --from=builder /usr/src/app/dist /usr/share/nginx/html # Permissions, filesystem layout, _etc._ are fine in the base image # Use the base image's ENTRYPOINT/CMD
 # docker-compose.yml version: '3.8' services: proxy: build: . ports: ['8000:80'] environment: - NGINX_BACKEND_ADDRESS=https://backend-prod.example.com

Si de hecho está utilizando Compose, puede usar varios archivos docker-compose.yml para proporcionar configuraciones para entornos específicos.

 # docker-compose.local.yml # Run the backend service locally too in development mode version: '3.8' services: backend: # not in docker-compose.yml build: backend # and other settings as required nginx: # overrides docker-compose.yml settings environment: - NGINX_BACKEND_ADDRESS=http://backend # no other settings
 docker-compose -f docker-compose.yml -f docker-compose.local.yml up
almost 3 years ago · Santiago Trujillo Report

0

si desea ejecutar una instrucción if en su dockerfile, puede usar el comando EJECUTAR en el archivo docker, por ejemplo, usando bash, RUN if [[ -z "$arg" ]] ; then echo Argument not provided ; else echo Argument is $arg ; fi

almost 3 years ago · Santiago Trujillo Report

0

La forma en que normalmente hago esto es que tengo un proxy nginx genérico y luego solo paso la URL y el protocolo como env vars

 ubuntu@vps-f116ed9f:/opt/docker_projects/docker_examples/load_balancer$ cat proxy.conf server { listen 80 default_server; resolver 127.0.0.11 valid=1s; set $protocol $PROXY_PROTOCOL; set $upstream $PROXY_UPSTREAM; location / { proxy_pass $protocol://$upstream$request_uri; proxy_pass_header Authorization; proxy_http_version 1.1; proxy_ssl_server_name on; proxy_set_header Host $upstream; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ""; proxy_buffering off; proxy_read_timeout 5s; proxy_redirect off; proxy_ssl_verify off; client_max_body_size 0; } }
 ubuntu@vps-f116ed9f:/opt/docker_projects/docker_examples/load_balancer$ cat Dockerfile FROM nginx:1.13.8 ENV PROXY_PROTOCOL=http PROXY_UPSTREAM=example.com COPY proxy.conf /etc/nginx/conf.d/default.template COPY start.sh / CMD ["/start.sh"]

Luego tengo un script de inicio que sustituirá las variables env en mi proxy_config.

 ubuntu@vps-f116ed9f:/opt/docker_projects/docker_examples/load_balancer$ cat start.sh #!/usr/bin/env bash envsubst '$PROXY_PROTOCOL,$PROXY_UPSTREAM' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf exec nginx -g 'daemon off;'
almost 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error