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
扩展多台相同的Web服务器
Apr 01 Servers
教你快速开启Apache SkyWalking的自监控
Apr 25 Servers
Nginx+Tomcat负载均衡集群的实现示例
Oct 24 Servers
Nginx实现会话保持的两种方式
Mar 18 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
docker compose 部署 golang 的 Athens 私有代理问题
Apr 28 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
vscode远程免密登入Linux服务器的配置方法
Jun 28 Servers
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
Jul 15 Servers
ubuntu20.04虚拟机无法上网的问题及解决
Dec 24 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+javascript实现二级级联菜单的制作
2008/05/06 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
javascript引用对象的方法
2007/01/11 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
详解Python中的条件判断语句
2015/05/14 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
儿童学习python的一些小技巧
2018/05/27 Python
Python之用户输入的实例
2018/06/22 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
详解python-图像处理(映射变换)
2019/03/22 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
python实现三壶谜题的示例详解
2020/11/02 Python
ASP.NET Core中的配置详解
2021/02/05 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
人民教师求职自荐信
2014/03/12 职场文书
家教广告词
2014/03/19 职场文书
承诺书怎么写
2014/03/26 职场文书
义和团口号
2014/06/17 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
大学生毕业评语
2014/12/31 职场文书
继承权公证书范本
2015/01/23 职场文书
保送生自荐信范文
2015/03/26 职场文书