Python 網站應用從開發到部署

本文大體說下一個網站從開發到部署的流程,裏面會說起用到的或者可能會被用到的技術,這些東西在平時用到的也比較多,因此應該能給後端學習提供一些具體的參考。python

1 網站開發

這裏我創建一個簡單的 Flask 應用,讓它能處理簡單的請求。nginx

新建項目目錄 flask_appgit

$ mkdir flask_app
複製代碼

切到項目目錄github

$ cd flask_app
複製代碼

使用 Pipenv 爲項目初始化一個 Python 3.6 的環境sql

$ pipenv --python 3.6.0
複製代碼

若是報相似下面的錯誤shell

Warning: Python 3.6 was not found on your system...
複製代碼

可參考 3.3 小節的內容解決。數據庫

若是須要查看虛擬環境所在目錄,可使用下面的命令flask

$ pipenv --venv
複製代碼

安裝 Flaskvim

$ pipenv install flask==1.0.2
複製代碼

可能會出現相似下面的問題後端

TypeError: 'module' object is not callable
複製代碼

這是因爲 pip 版本致使,安裝這個版本就好了

$ pipenv run pip install pip==18.0
複製代碼

而後從新裝下 Flask 就 OK 了。

新建文件 app.py

from flask import Flask
app = Flask(__name__)


@app.route('/', defaults={'query_path': 'index'})
@app.route('/<path:query_path>')
def match_path(query_path):
    return f'Query path: {query_path}'
複製代碼

到這裏,應用就創建好了,咱們運行測試一下。

爲了方便,咱們使用下面的命令進入虛擬環境

$ pipenv shell
複製代碼

若是後面須要退出該虛擬環境,能夠這樣

$ exit
複製代碼

而後

$ export FLASK_APP=app.py
$ flask run -h 0.0.0.0 -p 8080
複製代碼

最後在瀏覽器中訪問 http://127.0.0.1:8080/book/1,看到以下內容

Query path: book/1
複製代碼

說明應用已經 OK。

涉及技術:

  • Flask,基於 Werkzeug 和 Jinja 的微框架。
  • Pipenv,整合了 virtualenv 和 pip,爲虛擬環境和包管理提供了極大的方便,入門的話能夠看下我以前的這篇文章《Pipenv 快速上手》。

後續開發可能用到的

  • Requests,網絡資源請求工具。
  • SQLAlchemy,操做數據庫的工具包。
  • Celery,分佈式任務隊列。

2 代碼管理

爲了解決多人協做、版本回溯等問題,咱們須要一個代碼管理工具,這裏咱們使用 Git。

下面演示將本地代碼保存到 GitHub,固然,若是是公司等私有項目的話,你可使用 GitHub 付費服務或者自建託管服務。

首先在項目目錄下初始化一個 Git 倉庫

$ git init
複製代碼

添加忽略文件 .gitignore,將 IDE 配置文件忽略(根據你本身的狀況進行配置)

.idea/
複製代碼

將當前代碼提交到版本庫

$ git add .
$ git commit -m "init"
複製代碼

而後登錄 GitHub 新建一個空的倉庫 flask_app,複製其 SSH 地址,將其添加到本地客戶端中

$ git remote add origin git@github.com:kevinbai-cn/flask_app.git
複製代碼

最後提交代碼到倉庫

$ git push origin master
複製代碼

若是其它項目成員須要使用項目或者要在服務器上進行部署,克隆一份代碼便可

$ git clone git@github.com:kevinbai-cn/flask_app.git
複製代碼

涉及的技術

  • Git,分佈式版本控制軟件。上面的例子只是讓你們有個大體的印象,忽略了很多細節,好比提交代碼到倉庫時,可能會提示你沒有權限,這時你就須要去進行 SSH Key 的配置。若是想將 Git 用得比較順手的話,對版本庫、分支、標籤等概念要有必定理解,這不在本文的說明範圍內,推薦你們去看下廖雪峯的 Git 教程,百度/谷歌相應關鍵字就能找到。

後續開發可能用到的

  • Git 工做流程,其實就是對 Git 的使用作了一些規範建議,能讓開發者更好的協同工做。目前有三種流程使用的比較多:Git flow、Github flow、Gitlab flow,有須要的能夠看下阮一峯的 Git 工做流程相關的文章,一樣,百度/谷歌相應關鍵字就能找到。

3 項目部署

這裏我使用 Flask + Gunicorn(獨角獸) + Nginx 的方式進行部署。

有的人可能會疑惑,Gunicorn 裸跑就能提供服務了,爲何還要加一層 Nginx 呢?個人考慮主要有負載均衡、靜態文件緩存、IP 訪問頻率控制等,相對來講,Nginx 做爲服務器支持得更全面一些。

注意:當前服務器系統爲新裝的 Ubuntu 16.04,有些須要使用的軟件會安裝一次,因此記錄得稍細一點

3.1 Pipenv 安裝

因爲系統已經有了 pip,咱們將 pipenv 安裝至咱們的用戶目錄

# pip install --user pipenv
複製代碼

查看用戶基礎目錄

# python -m site --user-base
/root/.local
複製代碼

pipenv 安裝後就在 /root/.local/bin 目錄下,將其添加到 Path 中,打開 /root/.bashrc

# vim /root/.bashrc
複製代碼

在最後添加

export PATH=$PATH:/root/.local/bin
複製代碼

讓配置生效

# source /root/.bashrc
複製代碼

測試一下 pipenv 是否能找到

# pipenv --version
pipenv, version 2018.7.1
複製代碼

OK,至此安裝完成。

3.2 Git 安裝與配置

使用 apt 進行安裝

# apt update
# apt install git
複製代碼

Git 配置用戶名與郵箱

# git config --global user.name "kevinbai"
# git config --global user.email "kevinbai.cn@gmail.com"
複製代碼

生成 SSH key,鍵入下面的命令,一路回車就行

# ssh-keygen -t rsa -C "kevinbai.cn@gmail.com"
複製代碼

執行時,你會看到 Key 保存的位置,通常是在 ~/.ssh 目錄下。

而後在 GitHub 上配置 SSH 公鑰:settings -> SSH and GPG keys -> New SSH key,Title 能夠隨意填寫,好比我填的 server-ssh-rsa,Key 填寫 .ssh/id_rsa.pub 中的內容,以後保存就 OK 了。

3.3 克隆項目以及依賴包安裝

克隆項目代碼到服務器

# mkdir -p /data/htdocs
# cd /data/htdocs
# git clone git@github.com:kevinbai-cn/flask_app.git
複製代碼

依賴包安裝

# cd flask_app
# pipenv install
複製代碼

發現報下面的錯誤

Warning: Python 3.6 was not found on your system...
複製代碼

咱們須要先安裝 Python 3.6,爲了方便,咱們使用 pyenv。

安裝 pyenv

# curl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
複製代碼

打開 ~/.bashrc

# vim ~/.bashrc
複製代碼

在最後添加

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
複製代碼

讓配置生效

# source ~/.bashrc
複製代碼

安裝 Python 3.6.0

# pyenv install 3.6.0
複製代碼

若是構建出錯,通常是基礎工具不全的問題,使用下面命令進行安裝,而後再試一次就好了

# apt install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev
複製代碼

從新安裝依賴包

# pipenv install
複製代碼

3.4 Gunicorn 安裝以及啓動

這裏我不打算將 gunicorn 寫入 Pipfile,因此使用下面的命令進行安裝

# pipenv run pip install gunicorn==19.9.0
複製代碼

而不用

# pipenv install gunicorn==19.9.0
複製代碼

測試一下,看能不能正常運行

# pipenv run gunicorn -w 5 -b 0.0.0.0:8080 app:app -D
複製代碼

回車後沒有報錯,說明啓動成功。

3.5 Nginx 安裝以及配置

安裝 Nginx

# apt install nginx
複製代碼

備份默認配置

# cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
複製代碼

打開配置文件

# vim /etc/nginx/sites-available/default
複製代碼

文件內容修改成

server {
    listen 80;
    server_name _;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect     off;
        proxy_set_header   Host                 $http_host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
    }
}
複製代碼

啓動 Nginx

# /etc/init.d/nginx start
複製代碼

若是須要關閉,使用下面的命令

# /etc/init.d/nginx stop
複製代碼

而後瀏覽器訪問 http://your_ip,若是看到下面內容

Query path: index
複製代碼

則部署成功。

須要注意的是,若是是阿里雲的 ECS 服務器,須要在控制檯中去設置安全規則才能訪問指定端口。

涉及技術:

  • Linux 經常使用命令。不論是在服務器上進行操做仍是在本地開發時,掌握一些經常使用的命令或工具是必要的,好比 chown、chmod、grep、find、ps、tar、vim 等。
  • WSGI,爲方便網站應用部署到服務器而定義的規範。我以前寫了一篇相關的文章《說說我對 WSGI 的理解》,有興趣的能夠去看下。
  • Gunicorn,一個 Python WSGI UNIX HTTP服務器。不少團隊都在使用,最好熟悉一下經常使用的配置,若是能深刻源碼學習,那就更厲害了。
  • Nginx,Web 服務器,能夠用做負載均衡和 HTTP 緩存等。熟悉它的經常使用的一些配置是頗有必要的。

後續開發可能用到的

  • Docker,解決了開發和線上環境不統一以及虛擬機佔用資源高的問題。如今基本上都在使用這種方式進行線上部署,對於一個厲害的開發者來講,這個也是須要掌握的。不過,前期的學習重心仍是放在應用開發相關的庫或者框架上較好,這一塊先有一個大體的瞭解,有空再進一步學習。

4 參考

https://jiayi.space/post/flask-gunicorn-nginx-bu-shu
複製代碼

本文首發於公衆號「小小後端」。

相關文章
相關標籤/搜索