Debian9部署Python3.7+Pipenv+Flask+Uwsgi+Nginx+Jenkins+Docker+Superivsor

1、獲取最新的軟件包/升級已安裝的全部軟件包

  • apt-get update
  • apt-get upgrade

2、安裝:Python3.7依賴包

  • sudo apt update
  • sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget

3、安裝:python3.7(或更高版本)

  • 任意目錄:
  • cd /srv/
  • 下載方法一:
  • wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
  • 下載方法二:
  • curl -O https://www.python.org/ftp/python/3.7.3/Python-3.7.0.tar.xz
  • 解壓Python-3.7.0.tgz:
  • tar -zxvf Python-3.7.0.tgz
  • 檢查依賴:
  • cd Python-3.7.0
  • 鍵入:
  • ./configure --enable-optimizations
  • 運行make以啓動構建過程(爲了縮短構建時間,請根據處理器修改-j標誌。 若是你不知道處理器的核心數,能夠經過鍵入nproc來找到它。 個人系統有1個內核,因此我使用-j1標誌。)
  • 鍵入:
  • make -j 1
  • 安裝Python二進制文件:
  • sudo make altinstall
  • 檢查:
  • python3.7 --version
  • 建立python與python3和pip軟鏈接(即:鍵入python3獲得python3.7[操做系統默認python3.5])
  • 查看python3.7的路徑:
  • which python3.7
  • 在環境變量中添加該軟鏈接(把which python3.7的路徑寫到配置中):
    vim ~/.bashrc
    alias python='/usr/local/bin/python3.7'
    alias python3='/usr/local/bin/python3.7'
    wq保存並退出
    生效配置文件:
    source ~/.bashrc
    複製代碼
  • 檢查python3.7:
  • 分別鍵入pythonpython3輸出的版本均爲python3.7
    Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) 
    [Clang 6.0 (clang-600.0.57)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 
    複製代碼
  • 在環境變量中添加pip軟鏈接:
    vim ~/.bashrc
    alias pip3='/usr/local/bin/pip3.7'
    wq保存並退出
    生效配置文件:
    source ~/.bashrc
    複製代碼
  • 檢查pip3
  • 鍵入which pip3 (顯示路徑與/usr/local/bin/pip3.7一致)
    root@instance-1:~# which pip3
    /usr/bin/pip3
    root@instance-1:~# 
    複製代碼
  • 鍵入pip3 -V(顯示python3.7表示正確)
    root@instance-1:~# pip3 -V
    pip 10.0.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
    root@instance-1:~# 
    複製代碼

3、安裝Git而且拉取項目

  • apt-get install git -y
  • git --version
  • cd /srv/
  • git clone https://github.com/xxx/xxx.git

4、安裝:Pipenv

  • pip3 install Pipenv
  • 能夠先使用demo進行調試後在使用git拉取的項目
  • 建立一個demo:
    cd /srv/
    mkdir myproject
    cd myproject
    vim run.py
    # run.py文件內容
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def helloWorld():
        return "Hello World"
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    
    按:esc  
    保存並退出:wq
    複製代碼
  • 使用Pipenv
  • 鍵入:pipenv shell建立一個虛擬環境
    root@instance-1:/srv/YangZhiXiaoBlog# pipenv shell
    Launching subshell in virtual environment…
    root@instance-1:/srv/YangZhiXiaoBlog# . /root/.local/share/virtualenvs/YangZhiXiaoBlog-gAVpubB9/bin/activate
    (YangZhiXiaoBlog) root@instance-1:/srv/YangZhiXiaoBlog# 
    複製代碼
  • 查看虛擬環境路徑:pipenv --venv用於Uwsgi配置文件中的home參數
  • 安裝包(例如Flask):pipenv install flask
  • (若是是已經有的項目直接使用:pipenv install安裝項目中的全部包)(Pipenv不做詳細介紹)

5、安裝:Nginx

  • apt-get install nginx

6、安裝:Uwsgi(注意用的pip3並且不須要安裝在虛擬環境中)

  • pip3 install uwsgi

7、測試一下Nginx

  • 啓動:Nginx service nginx start
  • 在瀏覽器中訪問ip+80端口 如:59.12.32.4:80
  • 出現如下頁面表示成功

8、使用:Uwsgi啓動項目

  • 在項目根目錄建立uwsgi配置文件.ini:文件名稱隨便取我取名:test.inihtml

  • cd /srv/myproject/前端

  • vim test.inipython

  • chdir:項目的路徑nginx

  • module:模塊:啓動文件的名稱不須要加上.pygit

  • home:python的虛擬環境路徑github

  • master:是否啓用mater模式web

  • processes:啓動的工做進程-生成指定數目的worker/進程進程數(根據你服務器的配置去設定通常cup數*2)shell

  • threads:線程數(通常processes * 2)flask

  • buffesocket:socket文件地址用於與Nginx進行通信r-size:用於uwsgi包解析的內部緩存區大小爲64k。默認是4k。vim

  • socket:socket文件地址用於與Nginx進行通信(不須要手動建立·只需設置)

  • wsgi-file:wsgi文件(至關於flask的啓動文件run.py)

  • callable:wsgi文件中的app變量(也就是flask的實例)

  • chmod-socket:

  • plugins:調用python3插件(若是使用.ini的配置文件不須要配置這一項否者會報錯:open("./python3_plugin.so"): No such file or directory [core/utils.c line 3724] !!! UNABLE to load uWSGI plugin: ./python3_plugin.so: cannot open shared object file: No such file or directory !!!)

  • enable-threads:容許用內嵌的語言啓動線程。這將容許你在app程序中產生一個子線程

  • vacuum:當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件(try to remove all of the generated file/sockets)(此項能夠不配置)

  • pidfile:指定pid文件的位置,記錄主進程的pid號(此項能夠不配置)

  • reload-mercy:設置在平滑的重啓(直到接收到的請求處理完才重啓)一個工做子進程中,等待這個工做結束的最長秒數。這個配置會使在平滑地重啓工做子進程中,若是工做進程結束時間超過了'reload-mercy'秒就會被強行結束(忽略以前已經接收到的請求而直接結束)

  • harakiri:一個請求花費的時間超過了這個harakiri超時時間,那麼這個請求都會被丟棄,而且當前處理這個請求的工做進程會被回收再利用(即重啓)

  • limit-as:經過使用POSIX/UNIX的setrlimit()函數來限制每一個uWSGI進程的虛擬內存使用數。這個配置會限制uWSGI的進程佔用虛擬內存不超過256M。若是虛擬內存已經達到256M,並繼續申請虛擬內存則會使程序報內存錯誤,本次的http請求將返回500錯誤。

  • max-requests:爲每一個工做進程設置請求數的上限。當一個工做進程處理的請求數達到這個值,那麼該工做進程就會被回收重用(重啓)你可使用這個選項來默默地對抗內存泄漏

  • listen:設置socket的監聽隊列大小(默認:100)

  • daemonize:日誌文件路徑(使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器)

  • disable-logging:不記錄請求信息的日誌。只記錄錯誤以及uWSGI內部消息到日誌中

  • log-maxsize:以固定的文件大小(單位KB),切割日誌文件。 例如:log-maxsize = 50000000 就是50M一個日誌文件

  • 如下我生產環境的配置

    [uwsgi]
    
    # 基本配置
    chdir           = /srv/YangZhiXiaoBlog
    module          = run
    home            = /root/.local/share/virtualenvs/YangZhiXiaoBlog-gAVpubB9
    master          = true
    processes       = 2
    threads         = 4
    buffer-size     = 32768
    socket          = /srv/YangZhiXiaoBlog/YangZhiXiaoBlog.sock
    wsgi-file       = /srv/YangZhiXiaoBlog/run.py
    callable        = create_app()
    chmod-socket    = 666
    # plugins = python3
    enable-threads 	= true
    vacuum          = true
    
    # 處理(超時/請求/進程結束/虛擬內存)
    reload-mercy 	= 8
    harakiri        = 60 
    limit-as        = 256 
    max-requests 	= 5000 
    listen          = 120
    
    # 日誌
    daemonize       = /srv/log/myapp_uwsgi.log
    disable-logging = true
    log-maxsize     = 50000000
    複製代碼
  • 保存退出

  • 建立存放日誌的文件夾mkdir /srv/log

  • 因爲須要與Nginx進行通訊才能啓動,接下來咱們配置Nginx。

9、配置:Nginx

  • 在如下路徑下建立配置文件(名字能夠隨便取)這裏我取名:myproject.conf

  • 若是須要使用Nginx代理多個項目就建立多個配置文件(不同的端口)

  • cd /etc/nginx/conf.d/

  • vim myproject.conf

  • upstream myproject:同一臺服務器之間的請求轉化,使用套接字方式通訊。配置nginx與uwsgi的通訊方式和名稱.名稱爲:myproject 即 項目的名稱

  • server unix:///srv/okc/okc.sock;:nginx使用socket的方式與uwsgi進行通訊,指向項目目錄下的cocket文件 即 上面uwsgi配置的.sock(不須要手動建立·只需設置.運行時自動建立)

  • listen:監聽的端口(配置完以後須要打開該端口不然沒法訪問)

  • server_name:IP地址或者域名

  • charset:編碼

  • client_max_body_size:最大的上傳

  • location /:用於配置服務端,前端,靜態文件等路徑(這裏項目是使用的先後分離,不過並不影像調試)(詳細使用請查看官方文檔)

  • uwsgi_pass:須要與upstream的一致 即 myproject

  • include:參數文件

  • PS:如下這種將先後端一塊兒配置在同一端口下的話要將前端打包的dist文件裏面的全部東西放到flask的static文件裏面(或者將dist重命名爲static覆蓋flask中的static才能經過-> ip:9999/web 訪問到flask,由於會默認訪問static)

    upstream YangZhiXiaoBlog {
            server unix:///srv/YangZhiXiaoBlog/YangZhiXiaoBlog.sock;
    }
    server {
    	listen      9999;
    	server_name 你的ip或者域名;
    	charset     utf-8;
    	client_max_body_size 75M;
    
    	# 服務端
    	location / {
    		uwsgi_pass YangZhiXiaoBlog;
    		include         /etc/nginx/uwsgi_params;
    	}
    
    	# 前端
    	location /web {
    		root /srv/Vue_Projects/dist; # 前端打包完成的文件路徑
    		try_files $uri $uri/ /index.html; # 官網介紹設置這條能夠解決history路由的問題
    		index index.html;
    	}
    }
    複製代碼
  • 第二種、把前端分開另外一個配置文件設置不同的端口:以下(這樣就能夠經過:ip:9977啓動前端)

    後端配置文件以下:

    (其實就是把上面配置前端部分去掉):

    upstream YangZhiXiaoBlog {
            server unix:///srv/YangZhiXiaoBlog/YangZhiXiaoBlog.sock;
        }
        server {
            listen      9999;
            server_name 你的ip或者域名;
            charset     utf-8;
            client_max_body_size 75M;
    
    	# 服務端
    	location / {
    		uwsgi_pass YangZhiXiaoBlog;
    		include         /etc/nginx/uwsgi_params;
            }
        }
    複製代碼

    前端配置文件以下:

    (經過Nginx轉發找到:http://你的ip或者域名/cms/ ,這種方法同時能夠解決options瀏覽器預請求的問題,注意:http://你的ip或者域名/cms/ 要與你前端代碼裏面寫的請求地址url一致 或許你會叫作: http://123.456.789:8080/api/):

    server {
        	listen      9977;
        	server_name 你的ip或者域名;
        	harset     utf-8;
        	client_max_body_size 75M;
    
        	location / {
        		root /srv/YangZhiXiaoBlog-Cms/dist; # 前端打包完成的文件路徑
            	index index.html;
            	try_files $uri $uri/ /index.html; # 官網介紹設置這條能夠解決history路由的問題
           	} 
    
          	location /web/ {
            	proxy_pass http://你的ip或者域名/cms/;
          	} 
        }
    複製代碼
  • 保存並退出

  • 驗證配置文件是否正常使用如下命令

  • nginx -t 或者 service nginx configtest

  • 出現如下提示證實配置已經ok了

  • 打開所配置的端口(若是是阿里雲,騰訊雲,谷歌雲,亞馬遜雲等須要在雲控制檯配置出入口才能生效)

  • iptables -A INPUT -p tcp --dport 8099 -j ACCEPT

  • 若是你想關閉它

  • iptables -A INPUT -p tcp --dport 8099 -j DROP

  • 重啓如下Nginx

  • service nginx restart或者nginx -s reload

10、啓動項目

  • 進去項目目錄

  • cd /srv/myproject/

  • 啓動項目

  • uwsgi --ini test.ini

  • 打開瀏覽器輸入IP+端口號 例子以下

  • 66.42.100.165:8099

  • 最後能夠直接使用git上的項目進行部署

11、使用:Jenknis持續集成項目後續的更新迭代

後續更新...
複製代碼

12、使用:Docker容器化MySQL,Redis等

後續更新...
複製代碼

十3、使用:Superivsor監控項目進程啓停

調試中...
複製代碼
相關文章
相關標籤/搜索