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如何将http访问的网站改成https访问
Mar 31 Servers
本地通过nginx配置反向代理的全过程记录
Mar 31 Servers
阿里云Nginx配置https实现域名访问项目(图文教程)
Mar 31 Servers
nginx反向代理配置去除前缀案例教程
Jul 26 Servers
Minikube搭建Kubernetes集群
Mar 31 Servers
教你使用Jenkins集成Harbor自动发布镜像
Apr 03 Servers
搭建Yolov5服务器
Apr 30 Servers
Vscode中SSH插件如何远程连接Linux
May 02 Servers
Nginx 配置 HTTPS的详细过程
May 30 Servers
Windows Server 修改远程桌面端口的实现
Jun 25 Servers
windows系统安装配置nginx环境
Jun 28 Servers
Fluentd搭建日志收集服务
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
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
详解Vue 动态添加模板的几种方法
2017/04/25 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
python 日志 logging模块详细解析
2020/03/31 Python
python实现扫雷小游戏
2020/04/24 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
Python连接mysql方法及常用参数
2020/09/01 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
出纳岗位职责
2015/01/31 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
小学数学教学随笔
2015/08/14 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA