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 09 Servers
如何利用map实现Nginx允许多个域名跨域
Mar 31 Servers
Nginx URL重写rewrite机制原理及使用实例
Apr 01 Servers
Nginx虚拟主机的搭建的实现步骤
Jan 18 Servers
使用kubeadm命令行工具创建kubernetes集群
Mar 31 Servers
Kubernetes部署实例并配置Deployment、网络映射、副本集
Apr 01 Servers
排查Tomcat进程假死的问题
May 06 Servers
Nginx的gzip相关介绍
May 11 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
shell进度条追踪指令执行时间的场景分析
Jun 16 Servers
Windows10安装Apache2.4的方法步骤
Jun 25 Servers
nginx之queue的具体使用
Jun 28 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
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
原生JS实现不断变化的标签
2017/05/22 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
详解Django通用视图中的函数包装
2015/07/21 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
python实现按长宽比缩放图片
2018/06/07 Python
python3个性签名设计实现代码
2018/06/19 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
土木工程毕业生自荐信
2013/09/21 职场文书
酒店餐厅2014重阳节活动策划方案
2014/09/16 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
整改通知书格式
2015/04/22 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang