使用docker环境变量动态配置nginx的问题小结

使用docker环境变量动态配置nginx的问题小结

目录

前言

Docker安装nginx服务

动态配置nginx.conf

总结

前言

前后端联调接口时,经常会用到nginx反向代理来解决跨域问题。部署时,同一份前端代码有时候会根据开发环境不同,需要切换不同的后端接口地址进行代理。 传统方式是为每个环境都独立部署一份nginx配置,但是多数情况下,这些配置里的内容大体上相同,只有少数部分内容需要修改,这时候我们就希望nginx配置能够从docker中获取环境变量,动态设置有差异的那部分配置。本文将以代理接口地址为例,介绍下解决方案

Docker安装nginx服务

我们先从配置一份静态的nginx环境开始。

首先,找一个空文件夹,把前端项目打包后的dist文件夹拷贝到根目录

在根目录下配置nginx.conf如下,代理接口的关键点在于proxy_pass:

server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { #这里假设接口地址为http://127.0.0.1:8081 #前端以/api/开头的接口将被代理到http://127.0.0.1:8081 proxy_pass http://127.0.0.1:8081; } }

同时在根目录下面创建一份Dockerfile文件,写入以下内容

# 拉取nginx镜像 FROM nginx:stable-alpine # 把本地的dist文件夹下所有内容复制到/usr/share/nginx/html下 COPY dist/ /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d # 暴露80端口 EXPOSE 80 # 将docker环境下的命令行路径切换到/etc/nginx/conf.d下执行 WORKDIR /etc/nginx/conf.d # 此时相当于在docker容器里的/etc/nginx/conf.d路径下,运行nginx命令 ENTRYPOINT nginx -g 'daemon off;' 执行docker build . -t my-nginx命令将本地资源打包成镜像,镜像名为my-nginx执行docker run --name nginx-server -d -p 8080:8080 my-nginx运行镜像,--name nginx-server设置docker容器的名称,-p 8080:8080指将容器内8080端口映射到宿主机的8080端口,my-nginx就是之前打包好的镜像这时浏览器打开http://localhost:8080进行访问,接口就被代理到了http://127.0.0.1:8081 动态配置nginx.conf

上一步我们使用静态配置运行了nginx服务,现在我们来试试通过环境变量,动态注入nginx配置。

nginx.conf重命名为nginx.template(名字可以随便起,不重命名也行,这里为了表示这是一个模板),修改内容如下

server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { #使用变量替换具体的地址,或者用${URL_1}也行 proxy_pass $URL_1; } location /login/ { #新增一个代理接口,方便演示注入多个变量,或者用${URL_2}也行 proxy_pass $URL_2; } }

2.同时Dockerfile也有修改一下

FROM nginx:stable-alpine COPY dist/ /usr/share/nginx/html #这里改成将nginx配置模板复制过去 COPY nginx.template /etc/nginx/conf.d EXPOSE 80 WORKDIR /etc/nginx/conf.d #添加环境变量的写入 ENTRYPOINT envsubst '$URL_1 $URL_2' < nginx.template > default.conf && cat default.conf && nginx -g 'daemon off;'

这里实现环境变量注入的核心原理是利用linux自带的envsubst指令。envsubst '$URL_1 $URL_2' < nginx.template作用是取环境的$URL_1$URL_2(此处变量名也可以写成${URL_2},与模板保持一致即可)的值注入到nginx.template模板里对应的位置,然后后半句> default.conf是将替换好变量后的模板内容写入到docker容器下default.conf文件里。cat default.conf这句话方便我们查看nginx的配置内容,下文会提到。

重新执行docker build . -t new-nginx重新打包镜像执行docker run --name new-nginx-server -d -p 8080:8080 -e URL_1=http://127.0.0.1:8081 -e URL_2=http://127.0.0.1:8082 new-nginx运行镜像,这里我们新增了-e URL_1=http://127.0.0.1:8081 -e URL_2=http://127.0.0.1:8082,往容器里注入了环境变量,URL_1的值为http://127.0.0.1:8081URL_2的值为http://127.0.0.1:8082然后我们使用docker logs -f new-nginx-server查看容器里打印的内容,因为之前已经提前写好cat default.conf,所以执行完命令后,可以直接在 控制台看到打印出的nginx配置,之前的变量部分,已经成功的被替换掉: server { listen 80; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8081; } location /login/ { proxy_pass http://127.0.0.1:8082; } } 总结

整个方案,采用的是通过docker run -e xxxx=xxx先往容器注入环境变量,然后进一步通过envsubst指令将环境变量写入到具体的文件当中,实现动态配置文件内容。 当然这个方案依然有一些缺陷,例如当需要替换的变量有成百上千时,命令会很长,那时可能需要找一些其他方案进行优化。此外这里envsubst只是实现变量替换的其中一种方式, 其实实现类似的功能的方式有很多,例如利用nodejs配合ejs动态写入也是可以的,本文仅是提供一下大体的思路,具体实现可以结合自身项目灵活变通。

到此这篇关于使用docker环境变量动态配置nginx的文章就介绍到这了,更多相关docker动态配置nginx内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    酷睿I7 配置

    酷睿I7 配置,配置,玩家国度啦华硕 Rampage II Extreme(3800元)如果米不够,也可以把Extreme改为Gene,不过是小板内存推荐金士顿6G DDR3 2000骇

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    查看配置:酷睿i3530集展示办公平台

    查看配置:酷睿i3530集展示办公平台,,由于时间和精力的关系,我们不可能对所有的配置进行评论,希望我们能理解,我希望我们的评论能在那些需要帮

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    公共CPU接口类型的详细描述

    公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的处理速度直接决定电脑的性能, 那你知道CPU发展到现在, 都那些CPU接口类型吗.

    电脑配置快捷键|查看电脑配置快捷键

    电脑配置快捷键|查看电脑配置快捷键,,查看电脑配置快捷键1.在win10中,快捷键组合win+E已经变成了“快速访问”,不再是以前的“我的电脑了”2