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开启Brotli压缩算法实现过程详解
Mar 31 Servers
如何在centos上使用yum安装rabbitmq-server
Mar 31 Servers
扩展多台相同的Web服务器
Apr 01 Servers
Nginx反向代理配置的全过程记录
Jun 22 Servers
学习nginx基础知识
Sep 04 Servers
nginx负载功能+nfs服务器功能解析
Feb 28 Servers
Windows Server 2008 修改远程登录端口以及配置防火墙
Apr 28 Servers
Win10 Anaconda安装python-pcl
Apr 29 Servers
Nginx本地配置SSL访问的实例教程
May 30 Servers
Docker与K8s关系介绍不会Docker也可以使用K8s
Jun 25 Servers
Zabbix对Kafka topic积压数据监控的解决方案
Jul 07 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 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基于array_unique实现二维数组去重
2020/07/14 PHP
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
详解Vue爬坑之vuex初识
2017/06/14 Javascript
react路由配置方式详解
2017/08/07 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
angular动态表单制作
2018/02/23 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
Django 请求Request的具体使用方法
2019/11/11 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
Crabtree & Evelyn英国官网:瑰珀翠护手霜、香水、沐浴和身体护理
2018/04/26 全球购物
中餐厅经理岗位职责
2014/04/11 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
写给同学的新学期寄语
2015/02/27 职场文书