最近嘗試進行一些python web生產環境部署的任務。主要是使用django框架進行web開發。本地使用windows + python3.7可是上到服務器之後是ubuntu系統。ubuntu默認是python2和python3.5兩者都不符合現在的python開發版本。筆者嘗試進行了部署。一般來說,部署一個django web項目需要部署,數據庫,nginx, gunicorn和supervisor這幾個東西。其中數據庫不必說,nginx可以用來做反向代理,靜態文件服務器等等(當然用django搭配whitenoise也可以),gunicorn作爲python的http server,supervisor作爲進程監控工具,一旦django項目崩潰無法運行,supervisor可以自動嘗試進行重啓項目。
Docker部署
隨着虛擬化容器的發展,直接使用docker進行部署是一種不錯的方案。編寫一份Dockerfile,指定需要的python版本甚至只是簡單指定需要的django版本即可。配合一些其他組件如mysql, nginx的容器進行編排,可以輕鬆地進行部署。[1]
除此之外使用docker還有一些優勢,有了docker的restart: always屬性,可以替代掉一些進程監控工具比如supervisor的作用。gunicorn這個庫在windows無法運行,使用docker也可以解決這個問題。搭配k8s也可以方便地進行集羣部署管理。
pyenv + pipenv
pyenv[2] 是一款python版本管理的工具,類似於nodejs的nvm。可以方便地進行python的版本指定。ubuntu默認安裝着python2.7和3.5的版本,但是有時候我們並不想使用這兩個版本,想要安裝新的python版本比如3.7。這時我們可以使用e.g. pyenv install 3.7.2
進行安裝,國內用戶使用時會有安裝非常耗時的情況,只需要將python對應版本的源碼放到~/.pyenv/cache
目錄下即可進行免下載直接安裝。安裝完成後,可以使用兩條非常通用的指令:
pyenv local python version
e.g.python local 3.7.2
指定當前目錄下的python版本。pyenv global python version
指定全局python版本
pipenv 是一款包管理工具,集合了pip和virtualenv的功能。使用起來也非常簡單,pipenv install
, pipenv shell
兩條指令行天下,第一條是安裝第三方依賴,第二條是進入安裝依賴後的命令行。
在部署時,僅需要先使用pyenv指定python環境,再用pipenv建立虛擬環境進行包管理即可。