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
win10安装配置nginx的过程
Mar 31 Servers
Nginx反爬虫策略,防止UA抓取网站
Mar 31 Servers
详解Nginx启动失败的几种错误处理
Apr 01 Servers
nginx的zabbix 5.0安装部署的方法步骤
Jul 16 Servers
使用Nginx搭载rtmp直播服务器的方法
Oct 16 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
docker compose 部署 golang 的 Athens 私有代理问题
Apr 28 Servers
Windows7下FTP搭建图文教程
Aug 05 Servers
Tomcat安装使用及部署Web项目的3种方法汇总
Aug 14 Servers
windows server2012 R2下安装PaddleOCR服务的的详细步骤
Sep 23 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页面缓存ob系列函数介绍
2012/10/18 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
Joomla开启SEF的方法
2016/05/04 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
JS模块与命名空间的介绍
2013/03/22 Javascript
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
Javascript setInterval的两种调用方法(实例讲解)
2013/11/29 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
python字符串的方法与操作大全
2018/01/30 Python
Python Flask基础教程示例代码
2018/02/07 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
中科创达面试题
2016/12/28 面试题
教育局长自荐信范文
2013/12/22 职场文书
教师学习培训邀请函
2014/02/04 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
东京审判观后感
2015/06/01 职场文书
工作证明书
2015/06/15 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
python中使用redis用法详解
2022/12/24 Redis