用Consul管理Laravel項目配置

在預生產環境跑了一年多,在此記錄和分享一下。php

圖片描述

問題 & 其餘方案

當咱們須要在多臺服務器部署多個不一樣的項目時,咱們須要一個集中的配置信息管理和同步的工具。考慮過的方案有:html

  1. 用rsync同步.env文件:多個項目的配置略繁瑣,要ssh到服務器修改再同步
  2. 用Docker:集羣部署比較方便,能夠用圖形界面修改環境變量,可是更新環境變量要重啓容器,大部分項目沒遷移到Docker

下面看一下Consul + Consul Template的方案。git

安裝

ConsulConsul Template都提供了預編譯的可執行文件,下載解壓便可。github

啓動Consul:json

consul agent -server -bootstrap -ui -bind <ip>

其餘服務節點能夠經過consul agent -join <ip>加入到集羣。bootstrap

啓動以後經過consul命令、RESTful API、Web UI管理Consul。服務器

Consul KV

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

Consul Template

配置集中管理了,怎樣傳給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多個參數,能夠爲一臺服務器上多個項目生成配置文件。

相關文章
相關標籤/搜索