寫在開始
背景:生產環境是客戶提供的華爲虛擬機,經常出現莫名崩潰,而且還TM在內網,所以本文是爲了給現場工程師參照部署環境和應用程序使用。
環境:CentOS 6.5 【別問我爲啥會這麼老,這得問客戶】
python 3.7.4
WSGI容器:Gunicorn
反向代理服務器:Nginx
1. 準備工作
此處參考了centos離線安裝python3/pip3和項目所需模塊
也記錄下我們處理的過程
1.1 修改yum配置文件
通過修改聯網機yum配置,在使用yum install xxx 的時候直接將這些依賴保存在指定目錄中,而不是直接刪除,便於後面將這些依賴包拷貝到離線服務器中。具體操作如下:
vim /etc/yum.conf
cachedir=/var/cache/yum # yum install xxx中xxx依賴的存儲位置
keepcache=1 # 改爲keepcache=1這樣yum install xxx下載的rpm包就不會刪除
1.2 下載yum 依賴
在聯網的服務器上,使用yum install 安裝相關依賴
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y
yum install libffi-devel -y
1.3 下載python3 離線安裝包
到Python官網下載離線安裝包
1.4 打包下載python 應用程序需要的包
在開發環境的 Terminal 中運行
pip3 freeze >requirements.txt
工具會自動生成應用程序所需要的依賴文件及版本
然後將需要的依賴安裝包下載到你本地的目錄中
pip download -r requirements.txt -d yourprojectdir\whls
pip download virtualenv -d yourprojectdir\whls
離線下載虛擬環境安裝工具
2.離線服務器上生產環境安裝
2.1 安裝yum 依賴
將聯網機中緩存在/var/cache/yum目錄下的所有rpm包都拷貝至離線服務器。
運行 rpm 安裝
rpm -Uvh ./*.rpm --nodeps --force
2.2 安裝python3
注意,yum 依賴一定要在本步驟前安裝,否則會導致pip3 安裝失敗
將下載好的python3 安裝包拷貝到離線服務器
tar -zxvf Python-3.7.4.tgz # 解壓python3安裝包
cd Python-3.7.4 # 進入python3安裝包目錄
./configure --prefix=/usr/local/python3 --with-ssl # 將python3 安裝在該目錄,-ssl 是爲了防止pip3 出問題
make # 編譯源碼
make install # 安裝
安裝成功後,設置軟鏈接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 # 創建python3軟連接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 # 創建pip3的軟連接
2.3 安裝應用程序需要的依賴
將離線下載的虛擬環境安裝工具和其他安裝whl文件拷貝到離線服務器
先安裝虛擬環境工具
pip3 install --no-index --find-links= yourprojectdir\whls virtualenv
安裝完成後,創建一個乾淨的虛擬環境
virtualenv --no-site-packages --python=python3 myenv
激活虛擬環境
source myenv/bin/activate
之後會看到你的命令行前面全部都有
(myenv) 前綴,就表示激活成功
然後在激活的虛擬環境中安裝其他依賴包
pip3 install --no-index --find-links= yourprojectdir\whls -r requirements.txt
安裝完成後,生產環境就部署完成了。
3. 部署Flask 應用
3.1 編寫應用啓動腳本wsgi.py
from app.app import create_app
application = create_app()
if __name__ == '__main__':
application.run(debug=False)
這個啓動腳本替換原有的項目啓動腳本即可
3.2 編寫gunicorn.conf.py 配置文件
在項目根目錄處增加gunicorn.conf.py 配置文件
bind = "127.0.0.1:5000"
# 監聽隊列
backlog = 512
worker_class = 'gevent'
loglevel = "error"
# 設置gunicorn訪問日誌格式,錯誤日誌無法設置
access_log_format = (
'%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"')
accesslog = '/var/log/gunicorn/gunicorn.access.log'
errorlog = "/var/log/gunicorn/gunicorn.error.log"
3.3 啓動 gunicorn
gunicorn -c gunicorn.conf.py wsgi:application
運行腳本後,應用就已經按照配置運行起來了
3.4 配置Nginx
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name _;
location /yourproject-prefix/ {
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-Forwared-Proto $scheme;
proxy_pass http://127.0.0.1:5000/;
}
}
}
啓動nginx後,就完成應用程序部署了。