• Ngnix 动态读取环境变量实现


    背景

    在企业应用中,为保证产品质量,因此我们希望产线运行的系统和我们测试通过的系统为相同的代码,但是实际情况是开发环境,测试环境,产线环境配置变量不尽相同,给程序可靠发布带来一定的风险。为此我们寻求一种简单的方式实现各环境发布包为同一个包。本文主要介绍前端发布过程中如何解决Nginx通过动态获取环境变量实现版本可靠发布。

    前置条件

    本demo 基于docker实现,请自行安装docker 环境。

    方案

    通过根据环境不同,启动不同的首页,实现加载不同内容。

    实现过程

    一,创建Ngix配置模板文件

    1.首先创建文件夹demo.

    2.在demo文件夹中创建文件夹nginx.

    3.在nginx文件夹中创建文件 default.template

    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;
        error_log  /var/log/nginx/error.log  error;
    
        location / {
            if ($request_filename ~* .*\.(?:index.htm|index.html)$)  ## 配置页面不缓存index.html和index.htm结尾的文件
            {
                add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
            }
            root   /usr/share/nginx/html;
            index  $envname.index.html $envname.index.htm;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    } 

    我们在默认启动首页前面设置变量$envname,docker 启动的时候动态替换该变量实现不同首页加载需求

    二,创建dockerfile

    #拉取nginx镜像
    FROM nginx
    #把本地的dist文件夹下所有内容复制到/usr/share/nginx/html下
    COPY dist/ /usr/share/nginx/html/
    ##将nginx配置模板复制过去到指定目录
    COPY nginx/default.template /etc/nginx/conf.d/
    #将docker环境下的命令行路径切换到/etc/nginx/conf.d下执行
    WORKDIR /etc/nginx/conf.d
    #添加环境变量的写入
    ENTRYPOINT envsubst '$envname'  < default.template > default.conf && cat default.conf && nginx -g 'daemon off;'

    三,把html 文件夹拷贝到demo文件夹

    dev.index.html 内容为dev

    gqc.index.html 内容为gqc

    prd.index.html 内容为prd

    以实现根据配置读取默认启动首页的效果

    四,打包镜像

    在根目录demo文件夹内执行docker build . -t nginxdemo命令将本地资源打包成镜像,镜像名为 nginxdemo

     五,运行镜像

    执行命令: docker run --name nginxdemo -d -p 8080:80 -e envname=dev nginxdemo 启动镜像

     访问端口 localhost:8080 可以看到输出内容为dev

     再次执行命令: docker run --name nginxdemo-prd -d -p 8081:80 -e envname=prd nginxdemo 启动镜像

     访问 localhost:8081 可以看到输出内容为prd

    以上就是本次功能实现的整体效果,主要依赖 envsubst 命令实现环境变量写入到nginx config文件

     全部代码:https://files.cnblogs.com/files/mnps/demo.zip?t=1654784525

  • 相关阅读:
    docker 安装redis监控redis-stat
    maven 项目依赖打包 提示 package com.。。。。。 does not exist
    docker 建立跨主机网络
    docker-compose 安装mongodb集群==多台服务器
    docker 安装mongodb集群==多台服务器
    博客将近一年半没有更新了
    elasticsearch 使用同义词
    《SpringBoot第一篇:HelloWorld启蒙》
    go学习路线资料
    docker和k8s的概念-IaaS、PaaS、SaaS 的区别
  • 原文地址:https://www.cnblogs.com/mnps/p/16361423.html
Copyright © 2020-2023  润新知