在預生產環境跑了一年多,在此記錄和分享一下。php
當咱們須要在多臺服務器部署多個不一樣的項目時,咱們須要一個集中的配置信息管理和同步的工具。考慮過的方案有:html
.env
文件:多個項目的配置略繁瑣,要ssh到服務器修改再同步下面看一下Consul + Consul Template的方案。git
Consul和Consul Template都提供了預編譯的可執行文件,下載解壓便可。github
啓動Consul:json
consul agent -server -bootstrap -ui -bind <ip>
其餘服務節點能夠經過consul agent -join <ip>
加入到集羣。bootstrap
啓動以後經過consul命令、RESTful API、Web UI管理Consul。服務器
Consul提供了一個分佈式的鍵值對存儲,能夠用來存儲應用的動態配置信息,基本操做:app
# put 設置一個KV對 consul kv put APP_DEBUG false # get 獲取 consul kv get APP_DEBUG # exprot 導出JSON consul kv export > data.json # import 導入JSON consul kv import @data.json # delete 刪除 consul kv delete APP_DEBUG
Consul KV支持目錄,能夠經過/
分隔key實現,例如咱們使用configs/<app_name>/
這樣的目錄來存放一個項目的全部配置。ssh
配置集中管理了,怎樣傳給Laravel呢?一個方法是在Laravel裏用Consul的API獲取配置信息,第二個發放是在外部監聽KV變化而後寫入到.env
文件,Consul Template就是這樣的一個外部工具。分佈式
咱們用的配置模板(.env.tpl
):
{{ range ls "configs/crm" }} {{ .Key }}={{ .Value }}{{ end }}
意思是遍歷config/crm
這個KV目錄,生成key=value
格式。
運行:
## 格式: 模板文件:目標文件:更新後執行的命令 consul-template --template \ /path/to/.env.tpl:/path/to/.env:'php /path/to/artisan config:cache'
就能夠生成.env文件,而且持續監聽變化,一個consul-template實例能夠有多個--template多個參數,能夠爲一臺服務器上多個項目生成配置文件。