前后端联调接口时,经常会用到nginx反向代理来解决跨域问题。部署时,同一份前端代码有时候会根据开发环境不同,需要切换不同的后端接口地址进行代理。 传统方式是为每个环境都独立部署一份nginx配置,但是多数情况下,这些配置里的内容大体上相同,只有少数部分内容需要修改,这时候我们就希望nginx配置能够从docker中获取环境变量,动态设置有差异的那部分配置。本文将以代理接口地址为例,介绍下解决方案,我们先从配置一份静态的nginx环境开始。,上一步我们使用静态配置运行了nginx服务,现在我们来试试通过环境变量,动态注入nginx配置。,2.同时Dockerfile
也有修改一下,这里实现环境变量注入的核心原理是利用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 run -e xxxx=xxx
先往容器注入环境变量,然后进一步通过envsubst
指令将环境变量写入到具体的文件当中,实现动态配置文件内容。 当然这个方案依然有一些缺陷,例如当需要替换的变量有成百上千时,命令会很长,那时可能需要找一些其他方案进行优化。此外这里envsubst
只是实现变量替换的其中一种方式, 其实实现类似的功能的方式有很多,例如利用nodejs
配合ejs
动态写入也是可以的,本文仅是提供一下大体的思路,具体实现可以结合自身项目灵活变通。