This is an automated email from the ASF dual-hosted git repository. membphis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-apisix.git
The following commit(s) were added to refs/heads/master by this push: new b210a7b feature: support to load different config file by ENV `APISIX_PROFILE ` profile (#1147) b210a7b is described below commit b210a7b866131b2f4df2d61c2c4fa99048b5074b Author: qiujiayu <153163...@qq.com> AuthorDate: Fri Feb 28 08:46:42 2020 +0800 feature: support to load different config file by ENV `APISIX_PROFILE ` profile (#1147) --- bin/apisix | 7 ++++++- doc/plugins/oauth.md | 2 +- doc/profile-cn.md | 42 ++++++++++++++++++++++++++++++++++++++ lua/apisix/core/config_local.lua | 5 +++-- lua/apisix/core/config_yaml.lua | 11 +++++----- lua/apisix/core/profile.lua | 34 +++++++++++++++++++++++++++++++ lua/apisix/debug.lua | 5 +++-- t/APISIX.pm | 22 +++++++++++++++++--- t/core/profile.t | 44 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 158 insertions(+), 14 deletions(-) diff --git a/bin/apisix b/bin/apisix index 5e68c3f..ff48af7 100755 --- a/bin/apisix +++ b/bin/apisix @@ -100,6 +100,8 @@ working_directory /tmp/apisix_cores/; worker_shutdown_timeout 3; +env APISIX_PROFILE; + {% if stream_proxy then %} stream { lua_package_path "$prefix/deps/share/lua/5.1/?.lua;/usr/share/lua/5.1/apisix/lua/?.lua;]=] @@ -461,7 +463,10 @@ local function exec(command) end local function read_yaml_conf() - local ymal_conf, err = read_file(apisix_home .. "/conf/config.yaml") + local profile = require("apisix.core.profile") + profile.apisix_home = apisix_home .. "/" + local local_conf_path = profile:yaml_path("config") + local ymal_conf, err = read_file(local_conf_path) if not ymal_conf then return nil, err end diff --git a/doc/plugins/oauth.md b/doc/plugins/oauth.md index 4f98c1c..fb893b3 100644 --- a/doc/plugins/oauth.md +++ b/doc/plugins/oauth.md @@ -89,4 +89,4 @@ curl -i -X GET http://127.0.0.1:9080/get -H "Host: httpbin.org" -H "Authorizatio ## Troubleshooting -Check/modify the DNS settings (`conf/config.yml) if APISIX cannot resolve/connect to the identity provider. +Check/modify the DNS settings (`conf/config.yaml) if APISIX cannot resolve/connect to the identity provider. diff --git a/doc/profile-cn.md b/doc/profile-cn.md new file mode 100644 index 0000000..df9a214 --- /dev/null +++ b/doc/profile-cn.md @@ -0,0 +1,42 @@ +<!-- +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--> + +# 基于环境变量进行配置文件切换 + +配置之所以从代码中提取出来,就是为了更好适应变化。通常我们的应用都有开发环境、生产环境等不同运行环境,这些环境下应用的一些配置肯定会有不同,比如:配置中心的地址等。 + +如果把所有环境的配置都放在同一个文件里,非常不好管理,我们接到新需求后,在开发环境进行开发时,需要将配置文件中的参数都改成开发环境的,提交代码时还要改回去,这样改来改去非常容易出错。 + + +上述问题的解决办法就是通过环境变量来区分当前运行环境,并通过环境变量来切换不同配置文件。APISIX 中对应的环境变量就是:`APISIX_PROFILE`。 + + +在没有设置`APISIX_PROFILE` 时,默认使用以下三个配置文件: + +* conf/config.yaml +* conf/apisix.yaml +* conf/debug.yaml + +如果设置了`APISIX_PROFILE`的值为`prod`,则使用以下三个配置文件: + +* conf/config-prod.yaml +* conf/apisix-prod.yaml +* conf/debug-prod.yaml + +通过这种方式虽然会增加配置文件的数量,但可以独立管理,再配置git等版本管理工具,还能更好实现版本管理。 diff --git a/lua/apisix/core/config_local.lua b/lua/apisix/core/config_local.lua index a5d9d5e..bb32efc 100644 --- a/lua/apisix/core/config_local.lua +++ b/lua/apisix/core/config_local.lua @@ -15,11 +15,12 @@ -- limitations under the License. -- local log = require("apisix.core.log") +local profile = require("apisix.core.profile") local yaml = require("tinyyaml") -local ngx = ngx local io_open = io.open local type = type -local local_conf_path = ngx.config.prefix() .. "conf/config.yaml" + +local local_conf_path = profile:yaml_path("config") local config_data diff --git a/lua/apisix/core/config_yaml.lua b/lua/apisix/core/config_yaml.lua index 6955a83..186ed01 100644 --- a/lua/apisix/core/config_yaml.lua +++ b/lua/apisix/core/config_yaml.lua @@ -21,6 +21,7 @@ local json = require("apisix.core.json") local process = require("ngx.process") local new_tab = require("table.new") local check_schema = require("apisix.core.schema").check +local profile = require("apisix.core.profile") local lfs = require("lfs") local exiting = ngx.worker.exiting local insert_tab = table.insert @@ -36,7 +37,7 @@ local pcall = pcall local io = io local ngx = ngx local re_find = ngx.re.find -local apisix_yaml_path = ngx.config.prefix() .. "conf/apisix.yaml" +local apisix_yaml_path = profile:yaml_path("apisix") local created_obj = {} @@ -100,7 +101,7 @@ local function read_apisix_yaml(pre_mtime) local apisix_yaml_new = yaml.parse(yaml_config) if not apisix_yaml_new then - log.error("failed to parse the content of file conf/apisix.yaml") + log.error("failed to parse the content of file " .. apisix_yaml_path) return end @@ -116,7 +117,7 @@ local function sync_data(self) if not apisix_yaml_ctime then log.warn("wait for more time") - return nil, "failed to read local file conf/apisix.yaml" + return nil, "failed to read local file " .. apisix_yaml_path end if self.conf_version == apisix_yaml_ctime then @@ -212,7 +213,7 @@ local function _automatic_fetch(premature, self) local ok, ok2, err = pcall(sync_data, self) if not ok then err = ok2 - log.error("failed to fetch data from local file apisix.yaml: ", + log.error("failed to fetch data from local file " .. apisix_yaml_path .. ": ", err, ", ", tostring(self)) ngx_sleep(3) break @@ -220,7 +221,7 @@ local function _automatic_fetch(premature, self) elseif not ok2 and err then if err ~= "timeout" and err ~= "Key not found" and self.last_err ~= err then - log.error("failed to fetch data from local file apisix.yaml: ", + log.error("failed to fetch data from local file " .. apisix_yaml_path .. ": ", err, ", ", tostring(self)) end diff --git a/lua/apisix/core/profile.lua b/lua/apisix/core/profile.lua new file mode 100644 index 0000000..339b7ea --- /dev/null +++ b/lua/apisix/core/profile.lua @@ -0,0 +1,34 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one or more +-- contributor license agreements. See the NOTICE file distributed with +-- this work for additional information regarding copyright ownership. +-- The ASF licenses this file to You under the Apache License, Version 2.0 +-- (the "License"); you may not use this file except in compliance with +-- the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +local _M = { + version = 0.1, + profile = os.getenv("APISIX_PROFILE"), + apisix_home = (ngx and ngx.config.prefix()) or "" +} + + +function _M.yaml_path(self, file_name) + local file_path = self.apisix_home .. "conf/" .. file_name + if self.profile then + file_path = file_path .. "-" .. self.profile + end + return file_path .. ".yaml" +end + + +return _M diff --git a/lua/apisix/debug.lua b/lua/apisix/debug.lua index 3156d1a..7f458fe 100644 --- a/lua/apisix/debug.lua +++ b/lua/apisix/debug.lua @@ -17,6 +17,7 @@ local yaml = require("tinyyaml") local log = require("apisix.core.log") local json = require("apisix.core.json") +local profile = require("apisix.core.profile") local process = require("ngx.process") local lfs = require("lfs") local io = io @@ -29,7 +30,7 @@ local setmetatable = setmetatable local pcall = pcall local ipairs = ipairs local unpack = unpack -local debug_yaml_path = ngx.config.prefix() .. "conf/debug.yaml" +local debug_yaml_path = profile:yaml_path("debug") local debug_yaml local debug_yaml_ctime @@ -85,7 +86,7 @@ local function read_debug_yaml() local debug_yaml_new = yaml.parse(yaml_config) if not debug_yaml_new then - log.error("failed to parse the content of file conf/debug.yaml") + log.error("failed to parse the content of file " .. debug_yaml_path) return end diff --git a/t/APISIX.pm b/t/APISIX.pm index f15b367..7e8755e 100644 --- a/t/APISIX.pm +++ b/t/APISIX.pm @@ -42,6 +42,21 @@ my $ssl_crt = read_file("conf/cert/apisix.crt"); my $ssl_key = read_file("conf/cert/apisix.key"); $yaml_config =~ s/node_listen: 9080/node_listen: 1984/; $yaml_config =~ s/enable_heartbeat: true/enable_heartbeat: false/; +my $profile = $ENV{"APISIX_PROFILE"}; + + +my $apisix_file; +my $debug_file; +my $config_file; +if ($profile) { + $apisix_file = "apisix-$profile.yaml"; + $debug_file = "debug-$profile.yaml"; + $config_file = "config-$profile.yaml"; +} else { + $apisix_file = "apisix.yaml"; + $debug_file = "debug.yaml"; + $config_file = "config.yaml"; +} add_block_preprocessor(sub { @@ -51,6 +66,7 @@ add_block_preprocessor(sub { my $main_config = $block->main_config // <<_EOC_; worker_rlimit_core 500M; working_directory $apisix_home; +env APISIX_PROFILE; _EOC_ $block->set_value("main_config", $main_config); @@ -305,7 +321,7 @@ _EOC_ my $user_apisix_yaml = $block->apisix_yaml // ""; if ($user_apisix_yaml) { $user_apisix_yaml = <<_EOC_; ->>> ../conf/apisix.yaml +>>> ../conf/$apisix_file $user_apisix_yaml _EOC_ } @@ -315,9 +331,9 @@ _EOC_ my $user_files = $block->user_files; $user_files .= <<_EOC_; ->>> ../conf/debug.yaml +>>> ../conf/$debug_file $user_debug_config ->>> ../conf/config.yaml +>>> ../conf/$config_file $user_yaml_config >>> ../conf/cert/apisix.crt $ssl_crt diff --git a/t/core/profile.t b/t/core/profile.t new file mode 100644 index 0000000..12a1292 --- /dev/null +++ b/t/core/profile.t @@ -0,0 +1,44 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +BEGIN { + $ENV{APISIX_PROFILE} = "dev"; +} + +use t::APISIX 'no_plan'; + +repeat_each(1); +no_long_string(); +no_root_location(); + +run_tests; + +__DATA__ + +=== TEST 1: set env "APISIX_PROFILE" +--- config + location /t { + content_by_lua_block { + local profile = require("apisix.core.profile") + profile.apisix_home = "./test/" + local local_conf_path = profile:yaml_path("config") + ngx.say(local_conf_path) + } + } +--- request +GET /t +--- response_body +./test/conf/config-dev.yaml