nginx配置文件使用环境变量的操作方法


Posted in Servers onJune 02, 2021

前言

Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。

由于现在需要部署nginx的docker,希望nginx配置文件里面有关server_name在启动容器前动态修改。
但是由于nginx的配置文件不支持使用环境变量。网上找了好些方案,最终选择使用envsubst的方式改写nginx配置文件。

工作原理

Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

核心模块:HTTP模块、EVENT模块和MAIL模块
基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

学习envsubst

envsubst就是将环境变量替换文件里面指定标记的值。
例如有如下文件env.conf,内容如下

[test]
ip = ${ip}
port = ${port}
url = http://${ip}:${port}/index.html
phone = ${phone}

当执行export ip=192.168.1.5export port=8081export phone=13522223334写入环境变量。
然后执行envsubst < env.conf > env.new.conf,就可以生成如下的env.new.conf

[test]
ip = 192.168.1.5
port = 8081
url = http://192.168.1.5:8081/index.html
phone = 13522223334

还可以指定只替换部分环境变量,source env.env && envsubst '$ip;$phone' < env.conf,这样只会替换ip和phone这两个变量。
上面只替换部分环境变量,在Linux测试只能用单引号,用双引号无效,分隔符试过, . ; |这四种都可以,我估计还有更多分隔符。

应用nginx配置文件

docker-compose.yml文件如下

version: "3"
 
services:
  nginx:
    image: nginx:1.20.1-alpine
    container_name: nginx
    ports:
      - 80:80
      - 443:443
    environment:
      - NGINX_HOST=www.janbar.com
      - NGINX_PORT=80
    volumes:
      - /root/janbar.temp:/etc/nginx/conf.d/janbar.temp
    command: /bin/sh -c "envsubst < /etc/nginx/conf.d/janbar.temp > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
    network_mode: bridge
    restart: always

/root/janbar.temp文件内容如下

server {
    listen       ${NGINX_PORT};
    listen  [::]:${NGINX_PORT};
    server_name  ${NGINX_HOST};

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

按照上述docker-compose.yml配置文件最终生成docker容器里面的配置文件如下cat /etc/nginx/conf.d/default.conf

server {
    listen       80;
    listen  [::]:80;
    server_name  www.janbar.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

总结

经过上述骚操作,最终可以通过环境变量的方式更新nginx的docker容器内部配置文件。大功告成!

以上就是nginx配置文件使用环境变量的详细内容,更多关于nginx环境变量的资料请关注三水点靠木其它相关文章!

Servers 相关文章推荐
Nginx同一个域名配置多个项目的实现方法
Mar 31 Servers
基于Nginx实现限制某IP短时间访问次数
Mar 31 Servers
nginx里的rewrite跳转的实现
Mar 31 Servers
详解nginx进程锁的实现
Jun 14 Servers
解决使用了nginx获取IP地址都是127.0.0.1 的问题
Sep 25 Servers
Tomcat用户管理的优化配置详解
Mar 31 Servers
CentOS7和8下安装Maven3.8.4
Apr 07 Servers
Docker官方工具docker-registry案例演示
Apr 13 Servers
Windows Server 2019 配置远程控制以及管理方法
Apr 28 Servers
nginx lua 操作 mysql
May 15 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
kubernetes集群搭建Zabbix监控平台的详细过程
Jul 07 Servers
nginx+lua单机上万并发的实现
May 31 #Servers
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
Nginx配置Https安全认证的实现
May 26 #Servers
nginx部署多前端项目的几种方法
Nginx如何配置Http、Https、WS、WSS的方法步骤
May 11 #Servers
windows下快速安装nginx并配置开机自启动的方法
You might like
详解Yii实现分页的两种方法
2017/01/14 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
Python 中pandas.read_excel详细介绍
2017/06/23 Python
简单谈谈python中的语句和语法
2017/08/10 Python
python并发和异步编程实例
2018/11/15 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
python绘制雷达图实例讲解
2021/01/03 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
医学生个人求职信范文
2013/09/24 职场文书
资料员的岗位职责
2013/11/20 职场文书
行政前台岗位职责
2013/12/04 职场文书
单位人事专员介绍信
2014/01/11 职场文书
18岁生日感言
2014/01/12 职场文书
升国旗仪式主持词
2014/03/19 职场文书
承诺书的格式范文
2014/03/28 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书