首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在环境中存储配置

如何在环境中存储配置

作者头像
LA0WAN9
发布于 2021-12-14 00:54:27
发布于 2021-12-14 00:54:27
1.5K00
代码可运行
举报
文章被收录于专栏:火丁笔记火丁笔记
运行总次数:0
代码可运行

关于「在环境中存储配置」,是 The Twelve-Factor App 倡导的方法论之一。通常,应用的配置在不同环境(预发布、生产环境、开发环境等等)间会有很大差异,比如说数据库的用户名密码等等配置,通过把配置和代码分离,我们可以保证部署在不同环境的代码完全一致,如何把配置和代码分离呢?最佳实战是把配置存储到环境变量中,它可以非常方便地在不同的部署间做修改,却不动一行代码;与配置文件不同,不小心把它们签入代码库的概率微乎其微;此外环境变量与语言和系统无关。

在实际应用中,现在比较流行的解决方案是 dotenv(Ruby dotenvPHP dotenv):首先创建一个 .env 文件,然后把配置信息都保存在里面,接着把这些信息加载的环境变量里,最后直接使用环境变量。

通过使用此方案,我们可以给不同的环境设置不同的 .env 文件,在一定程度上实现了配置和代码分离,可惜还有一些明显的缺点,比如:

  • 如果有很多台服务器需要同步配置,那么是一件很痛苦的事情。
  • 如果忘了把 .env 加入到 .gitignore,那么很有可能泄露敏感信息。
  • 如果部署不当,那么很可能泄露敏感信息,比如这里

通过引入服务发现机制可以解决多台服务器同步配置的问题,主流方案如下:

它们的实现机制类似,都是把配置保存在服务发现的存储里,一旦发生变化,可以自动通过模板技术静态化保存成本地文件,从而解决多台服务器同步配置的问题。

不过这些方案归根到底还是要需要静态化保存成本地文件的,有没有直接使用环境变量保存配置的解决方案呢?答案就是 envconsul,其工作原理如下:在 consul 中保存配置,然后 envconsul 启动后会加载配置,并通过环境变量的方式传递给子进程,此外 envconsul 还会通过 consul 的 http 接口以 long polling 的方式监听,一旦发现配置出现了变动,就会发送信号给子进程,从而完成配置的更新。

如果你已经安装好了 consul 和 envconsul,那么让我们来试一试(未考虑权限控制):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shell> consul kv put app/db/username root
shell> consul kv put app/db/password 123456

shell> envconsul \
    -pristine \
    -sanitize \
    -upcase \
    -prefix app \
    env

DB_USERNAME=root
DB_PASSWORD=123456

如上,我使用 env 命令作为 envconsul 的子进程来显示环境变量,实际使用中,你可以把 ruby,php 之类的应用作为 envconsul 的子进程,下面我用一个 shell 脚本来展示配置发生变化的时候 envconsul 是如何应对的,shell 脚本名为 test.sh,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#! /bin/bash

signals=(HUP INT QUIT TERM USR1 USR2)

for signal in "${signals[@]}"
do
    trap "echo $signal; exit" "$signal"
done

for i in {1..1000}
do
    echo $i: PASSWORD: $DB_PASSWORD
    sleep 1
done

其作用就是监听信号,并且显示 DB_PASSWORD 环境变量,这次我们开启两个命令行窗口,一个运行 envconsul,另一个运行 consul kv put app/db/password … 来修改配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shell> envconsul \
    -pristine \
    -sanitize \
    -upcase \
    -prefix app \
    /path/to/test.sh

1: PASSWORD: <OLD VALUE>
2: PASSWORD: <OLD VALUE>
INT
1: PASSWORD: <NEW VALUE>
2: PASSWORD: <NEW VALUE>

我们能看到,当 envconsul 发现配置改变了之后,缺省情况下会发送 INT 信号(可配置)给子进程,使子进程完成重启,从而加载到新的配置。

此外还有一些细节问题需要考虑,比如:假设有一百台应用服务器,都是通过 envconsul 运行的,那么当配置发生变化的时候,如果这一百台应用服务器同时重启进程的话,无疑是一场灾难,实际上 envconsul 已经考虑到了此类情况,你可以通过配置 splay 选项把重启的时间随机化,避免「Thundering herd problem」;再假设配置发生变化的时候,如果子进程一直没有完成重启怎么办,envconsul 有一个 kill_timeout 选项,重启超时的话被直接强杀子进程。其它更多配置参见文档说明,篇幅所限,恕不赘述。

结尾再推荐一篇不同的声音:Why you shouldn’t use ENV variables for secret data,其以安全性为由,不建议使用环境变量,而是推荐使用 docker swarm 的密钥机制来管理敏感信息(相关教程),这很酷,如果你使用 docker,不妨一试。

回到 envconsul,环境变量仅针对子进程有效,虽然在一定程度上降低了风险,但是确实有可能泄露敏感信息,比如在 PHP 里,如果能运行 phpinfo 函数的话,那么可以打印出所有的环境变量,但我觉得不能因噎废食,以 PHP 为例,在生产环境中,类似 phpinfo,eval 之类的危险函数,原本就应该通过 disable_functions 禁用,而且数据库密码之类的信息,一般有 ip 访问限制,即便泄露了也影响有限,但这并不意味着可以不假思索的把任何信息都往环境变量里塞,比如银行卡密码,比特币密钥之类高度敏感的信息,如果泄露了就全完了,此时还是用 Vault 比较好,当然,envconsul 也支持 Vault。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux系统中Shell脚本加密字段的处理方法和原理分析
在Linux系统中,Shell脚本被广泛用于自动化任务和系统管理。然而,脚本中可能包含敏感信息,如密码、API密钥等,这些信息需要被安全地处理以防止泄露。本文将探讨Shell脚本中加密字段的处理方法和原理,并提供一些实用的解决方案。
炒香菇的书呆子
2024/12/02
2540
个推基于Consul的配置管理
在微服务架构体系中,由于微服务众多,服务之间又有互相调用关系,因此,一个通用的分布式配置管理是必不可少的。一般来说,配置管理需要解决配置集中管理、在系统运行期间可实现动态配置、配置修改后支持自动刷新等问题。
个推
2019/02/25
1.4K0
个推基于Consul的配置管理
浅谈配置文件
一个常见问题是:如何处理不同环境下不同的配置?传统的解决方案是为每个环境都单独设置一个配置文件,比如 rails 项目里一般会有 development、production、test 等几个配置文件,不过此方法不易扩展:更多部署意味着更多新的环境,随着项目的不断深入,开发人员可能还会添加他们自己的环境,这将导致各种配置组合的激增,从而给管理部署增加了很多不确定因素,此外,直接在文件中保存配置的话,如果有用户名密码等敏感信息,往往意味着它们会一并被保存到版本库中,这可能会诱发安全隐患,类似的案例在 github 上已经数不胜数了。关于此类问题,12factor 给出的解决方案是在环境变量中保存配置,如此一来,代码层面上就不用再关注不同环境下配置的差异了,版本库里也不用保存敏感信息了(都保存到环境变量里面了)。
LA0WAN9
2021/12/14
1K0
浅谈配置文件
Python 开发利器:python-dotenv,让环境变量管理变得轻松又安全!
在 Python 开发过程中,合理地管理配置信息是一项至关重要的任务。尤其是当涉及到敏感数据,如数据库连接信息、API 密钥等,我们不能将它们直接硬编码到代码中,这不仅会带来安全隐患,还会影响代码的可维护性。那么,如何优雅地解决这个问题呢?今天,就让我们来聊聊一个强大的工具——python-dotenv。
小博测试成长之路
2025/05/26
4490
Python 开发利器:python-dotenv,让环境变量管理变得轻松又安全!
Node.js设置环境变量
在使用Node.js进行开发时我们会将敏感的信息分为生产环境和开发环境进行文件形式的保存,那么如何设置环境变量成为了 一个问题。
用户6256742
2022/07/06
6.3K0
Node.js设置环境变量
Linux系统中Shell脚本加密字段的处理方法和原理分析
在Linux系统中,shell脚本被广泛用于自动化任务和系统管理。然而,脚本中可能包含敏感信息,如密码、密钥或令牌等,这些信息需要被保护以防止未授权访问。
炒香菇的书呆子
2024/12/10
3990
[译]Laravel 5.0 之运行环境及环境变量
本文译自 Matt Stauffer 的系列文章. ---- 如果你关注我的博客有段时间了,那你应该曾经见过我在 Laravel 环境检测问题上的各种尝试,特别使用环境变量进行检测这方面。例子 感谢 Laravel 5, 它极大地简化了环境检测环节。在 4.x 版的时候,你要创建多个基于运行环境名称的环境配置文件(比如 .env.php, .env.local.php 等)。老实说,我从来用过这个功能。但我觉得理论上你应该会把所有环境配置文件提交到代码库。但由于我们从来不提交任何环境配置文件,所以这种区分环
小李刀刀
2018/03/02
1.3K0
linux系统编程之进程(三):exec系列函数和system函数
一、exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建 了一个进程之后,通常将子进程替换成新
s1mba
2018/01/03
2.3K0
linux系统编程之进程(三):exec系列函数和system函数
GoLang 环境变量与配置
配置文件是一个 ini 文件。Service 下的 Environment/EnvironmentFile 配置环境变量相关的内容。
闻说社
2024/06/12
2000
GoLang 环境变量与配置
环境变量简介
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
羑悻的小杀马特.
2025/01/23
1390
环境变量简介
Golang生态:使用viper管理配置
通过配置,我们可以动态地改变程序的行为,常用的方式包括配置文件,命令行参数,环境变量等。我原来一直很欣赏ssh的配置管理方式:
王录华
2019/11/19
5.1K1
《Docker极简教程》--Docker在生产环境的应用--Docker在生产环境的优化
在生产环境中,确保使用安全的Docker镜像是至关重要的,因为不安全的镜像可能会导致系统遭受攻击或者数据泄露。以下是一些安全的Docker镜像使用的优化方法,以及相应的例子:
喵叔
2024/05/24
4070
Go几种读取配置文件的方式
如果只希望绑定特定的,可以使用SetEnvPrefix("global.source", "MYAPP_GLOAL_SOURCE"),注意这个函数不会自动加上MYAPP的前缀.
fliter
2023/09/07
8750
Go几种读取配置文件的方式
建立机制的重要性_机制的构成要素
werkzeug使用reloader可以在文件被改变时自动加载更改过的文件,使用方法也很简单,run_simple('localhost', 4000, application,use_reloader=True),ues_reloader=True即可。本文试图去品读一下reloader的实现以及一些小细节。
全栈程序员站长
2022/11/08
3730
express+ts+typeorm入门
express 是node生态中非常优秀的框架,大部分的业务接口,我们都可以通过它来实现。
知了轻语
2024/08/15
3940
express+ts+typeorm入门
【Linux课程学习】:命令行参数,环境变量
3.对于父子进程,对于父进程只读的数据,不会修改的数据,不会拷贝一份,但是子进程可以看到。
用户11396661
2024/12/09
2370
【Linux课程学习】:命令行参数,环境变量
如何在你的 Python 项目中安全高效地管理应用配置信息
今天我要给大家介绍一个非常有用的 Python 库:python-dotenv。这个库的主要功能是让我们可以把应用程序的配置信息,比如数据库凭证、API 密钥等,存储在一个叫做 .env 的文件中,而不是硬编码在代码里。这样做的好处是,我们可以在不修改代码的情况下,轻松更改应用程序的配置信息。而且,由于 .env 文件通常不会被版本控制系统跟踪,我们还可以防止敏感信息泄露。
TechHarmony
2024/04/20
4561
一日一技:如何正确管理项目的环境变量
在之前的公众号文章:开发经验:如何正确设置开发环境与生产环境的配置参数中,我提到了把项目的开发环境与生产环境的配置文件分开管理这种方式。
青南
2021/09/29
1.4K0
Golang 语言怎么使用 Viper 管理配置信息?
Viper 是适用于 Go 应用程序(包括 Twelve-Factor App)的完整配置解决方案。它被设计为在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:
frank.
2021/01/08
6.5K0
Linux环境变量【终】
  上次我们简单了解了一下环境变量这个概念,今天我们继续深入了解。话不多说,开启我们今天的话题!
用户11029129
2024/06/04
1350
Linux环境变量【终】
相关推荐
Linux系统中Shell脚本加密字段的处理方法和原理分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档