本文大體說下一個網站從開發到部署的流程,裏面會說起用到的或者可能會被用到的技術,這些東西在平時用到的也比較多,因此應該能給後端學習提供一些具體的參考。python
這裏我創建一個簡單的 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。
涉及技術:
後續開發可能用到的
爲了解決多人協做、版本回溯等問題,咱們須要一個代碼管理工具,這裏咱們使用 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
複製代碼
涉及的技術
後續開發可能用到的
這裏我使用 Flask + Gunicorn(獨角獸) + Nginx 的方式進行部署。
有的人可能會疑惑,Gunicorn 裸跑就能提供服務了,爲何還要加一層 Nginx 呢?個人考慮主要有負載均衡、靜態文件緩存、IP 訪問頻率控制等,相對來講,Nginx 做爲服務器支持得更全面一些。
注意:當前服務器系統爲新裝的 Ubuntu 16.04,有些須要使用的軟件會安裝一次,因此記錄得稍細一點
因爲系統已經有了 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,至此安裝完成。
使用 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 了。
克隆項目代碼到服務器
# 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
複製代碼
這裏我不打算將 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
複製代碼
回車後沒有報錯,說明啓動成功。
安裝 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 服務器,須要在控制檯中去設置安全規則才能訪問指定端口。
涉及技術:
後續開發可能用到的
https://jiayi.space/post/flask-gunicorn-nginx-bu-shu
複製代碼
本文首發於公衆號「小小後端」。