組內需要做一個專案,由於專案規模較小,就選擇了小巧靈活的flask作為框架。此文記錄了flask專案從開發到部署的一些經歷。
flask
flasgger:用於自動生成api文件
mysqlclient:mysql驅動
flask_sqlalchemy:mysql orm封裝
sqlalchemy:mysql orm封裝
flask_cors:跨域
elasticsearch:es驅動
pandas:資料處理,excel處理
requests:網路請求庫
|-- README.md |-- app |-- api api檔案 |-- bin 定時任務、可執行檔案 |-- lib 通用庫 |-- model 模型 |-- run.py api入口檔案 |-- test 測試檔案 |-- bin 啟停指令碼 |-- config nginx配置、uwsgi配置 |-- document 存放生成到文件 |-- log 日誌目錄,包括專案自身日誌、nginx日誌、uwsgi日誌 |-- requirements.txt |-- .gitignore
git
__pycache__/ *.py[cod] *$py.class .idea/ *.log .env .venv .DS_Store config.py
- 請首先建立個人分支
- 每次提交程式碼前請合併master分支的程式碼到當前分支
- 測試請合併到 test分支,合併到test 分支後會自動觸發構建並部署到測試伺服器
- 測試無問題後請合併到master分支進行線上釋出
通過環境變數區分線上環境與測試環境
線上環境配置環境
check_env=$(grep "export FLASK_ENV=production" /etc/profile;echo $?) if [ "$check_env" -eq 0 ];then echo "FLASK_ENV=production exists in /etc/profile" else echo "export FLASK_ENV=production">>/etc/profile fi
通過環境變數選擇不同的配置
CONFIG_OBJECT_MAPPER = { 'development': 'app.config.DevelopConfig', 'production': 'app.config.ProductionConfig', }
配置檔案的樣式,通過類的繼承進行配置複用
class Config(object): DEBUG = False class ProductionConfig(Config): pass class DevelopConfig(Config): DEBUG = True TESTING = True PRESERVE_CONTEXT_ON_EXCEPTION = True ENV = "development" SQLALCHEMY_ECHO = True
nginx+uwsgi
uwsgi配置
[uwsgi] module = app:name_app master = true #protocol = http reload-mercy = 8 max-requests = 1000 touch-reload = /tmp/reload.txt processes = 10 chdir = /xx/xx socket = 0.0.0.0:8000 logto = /xx/xx/uwsgi.log chmod-socket = 660 vacuum = true stats = /var/uwsgi.status pidfile = /var/uwsgi.pid
nginx配置
server { listen 80; server_name xx.com; access_log /xx/log/nginx_access.log main; error_log /xx/log/nginx_err.log; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; } location /document { root /xx/; } }
啟動指令碼,start.sh,湊合可用
#!/bin/bash set -x -u -o pipefail UWSGI_BIN=/xx/uwsgi NGINX_BIN=/xx/nginx NGINX_CONF=/xx/nginx.conf TGW_GOT_NGINX_CONF=/dxx/product_nginx_tgw_got.conf UWSGI_INI=/xx/product_uwsgi.ini DOCUMENT_PATH=/xx/document check_env=$(grep "export FLASK_ENV=production" /etc/profile;echo $?) if [ "$check_env" -eq 0 ];then echo "FLASK_ENV=production exists in /etc/profile" else echo "export FLASK_ENV=production">>/etc/profile fi # 如果uwsgi已經啟動,則只進行過載配置;如果沒有啟動則啟動 if pidof uwsgi then echo "uwsgi has been started, reload the config" touch /tmp/reload.txt else echo "start uwsgi ..." $UWSGI_BIN -d --ini $UWSGI_INI fi sleep 5 $UWSGI_BIN --connect-and-read /var/uwsgi.status ln -s /data/apps/tgwgot/config/product_nginx_tgw_got.conf $TGW_GOT_NGINX_CONF file $TGW_GOT_NGINX_CONF # 如果nginx已經啟動,則只進行過載配置;如果沒有啟動則啟動 if pidof nginx then echo "nginx has been started, reload the config" $NGINX_BIN -s reload -c $NGINX_CONF else echo "start nginx ..." $NGINX_BIN -c $NGINX_CONF fi chmod -R 755 $DOCUMENT_PATH pidof nginx
本作品採用《CC 協議》,轉載必須註明作者和本文連結