全斷網環境下部署python3 生產環境和Flask應用程序-CentOS6.5

寫在開始

背景:生產環境是客戶提供的華爲虛擬機,經常出現莫名崩潰,而且還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後,就完成應用程序部署了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章