我們寫程式碼時,通常會先在自己電腦上進行開發,然後把程式碼部署到伺服器上。如果一段程式碼涉及讀寫資料庫,或存取某些其他的線上服務接口,那麼在開發時,為了不影響線上環境,我們一般會把測試環境的資料庫和線上環境的資料庫分開。
例如,我們的程式需要存取 MongoDB 和 Redis,所以,在程式碼裡面,我們可能會這樣寫:
import pymongo import redis handler = pymongo.MongoClient('mongodb://username:password@127.0.0.1:27017').db.col client = redis.Redis(host='127.0.0.1', port=6379, password='xxxx')
等你要把程式部署到線上環境的時候,你手動把程式碼裡面的MongoDB 連線參數、Redis連線參數修改成線上環境的參數。然後把程式碼提交到 Git上,並在伺服器拉下最新程式碼並部署。
然而,當你想要修改一個新功能並重新進行測試時,你需要將這些連接參數修改為測試環境的參數,並在自己的電腦上進行操作。如果你忘記修改直接就運行,可能會把髒數據寫入線上環境。
於是,可能有人會使用環境變數來控制讀取的參數,例如:
import os import redis import pymongo if os.getenv('env', 'prod'): # 线上环境 MONGODB_URI = 'mongodb://username:password@xx.xx.xx.xx:27017' REDIS_PARAMS = {'host': 'xx.xx.xx.xx', 'port': 6379, 'password': 'xxxx'} else: # 测试环境 MONGODB_URI = 'mongodb://username:password@127.0.0.1:27017' REDIS_PARAMS = {'host': '127.0.0.1', 'port': 6379, 'password': 'xxxx'} handler = pymongo.MongoClient(MONGODB_URI).db.col client = redis.Redis(**REDIS_PARAMS)
這樣一來,你不需要手動修改資料庫的連線參數,只要把線上環境的環境變數env
#設定為prod
,那麼程式部署到線上環境,它自動就會使用線上資料庫的參數。只要 其他地方,例如你電腦上,環境變數env
不為prod
或乾脆不存在這個環境變量,那麼自動就會使用開發環境的參數。
這樣做,確實避免了忘記修改參數所導致的問題,但還有另一個問題:如果其他人也有這個 Git 來源的存取權限,那麼他們就會知道怎麼連接線上環境的資料庫。甚至擅自操作線上環境的數據,造成安全隱患或隱私外洩。
為了更安全,可以採用使用專門的檔案存放組態參數,程式從該檔案讀取參數的方法。線上環境這個檔案放線上參數,開發環境,這個檔案寫開發參數。這個設定檔不上傳到 Git中。
例如,我們建立一個 config.json 文件,它的內容為:
{ "MONGODB_URI": "mongodb://username:password@127.0.0.1:27017", "REDIS_PARAMS": {"host": "127.0.0.1", "port": 6379, "password": "xxxx"} }
然後我們的程式碼這樣修改:
import os import json import redis import pymongo CONFIG_PATH = '/etc/config/config.json' if not os.path.exists(CONFIG_PATH): print('配置文件不存在,自动使用测试环境参数!') MONGODB_URI = 'mongodb://username:password@127.0.0.1:27017' REDIS_PARAMS = {'host': '127.0.0.1', 'port': 6379, 'password': 'xxxx'} else: with open(CONFIG_PATH, encoding='utf-8') as f: config = json.load(f) MONGODB_URI = config['MONGODB_URI'] REDIS_PARAMS = config["REDIS_PARAMS"] handler = pymongo.MongoClient(MONGODB_URI).db.col client = redis.Redis(**REDIS_PARAMS)
以上是怎麼正確設定mongodb和redis開發環境與生產環境的設定參數的詳細內容。更多資訊請關注PHP中文網其他相關文章!