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
Nginx访问日志及错误日志参数说明
Mar 31 Servers
apache基于端口创建虚拟主机的示例
Apr 22 Servers
uwsgi+nginx代理Django无法访问静态资源的解决
May 10 Servers
详解Nginx 被动检查服务器的存活状态
Oct 16 Servers
Rhit高效可视化Nginx日志查看工具
Nov 01 Servers
Nginx配置https的实现
Nov 27 Servers
idea下配置tomcat避坑详解
Apr 12 Servers
Windows Server 2012 修改远程默认端口3389的方法
Apr 28 Servers
Nginx 匹配方式
May 15 Servers
源码安装apache脚本部署过程详解
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
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
获取DOM对象的几种扩展及简写
2006/10/09 Javascript
jQuery 操作XML入门
2008/12/25 Javascript
javascript面向对象之Javascript 继承
2010/05/04 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
Python函数基本使用原理详解
2020/03/19 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
检察机关个人对照检查材料
2014/09/15 职场文书
2015大一新生军训感言
2015/08/01 职场文书
2019同学聚会主持词
2019/05/06 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers