1. 程式人生 > >ubuntu部署python專案(virtualenv + flask + uwsgi + nginx)(附:部署過程中遇到的問題及解決方法)

ubuntu部署python專案(virtualenv + flask + uwsgi + nginx)(附:部署過程中遇到的問題及解決方法)

以下為我部署pthon flask + virtualenv + uwsgi + nginx的艱苦之路(我使用的是ubuntu 及python3.6)
安裝好python3.6後(上一編文章有講啦):

建立python虛擬環境:VirtualEnv(非常牛逼及非常重要,在這裡你可以do evertything
首先先安裝virtualenv模組(要多敲命令,就只貼圖了)
在這裡插入圖片描述

建立虛擬環境:假如我的專案目錄在/home/python_project/test,進入到這個目錄下,執行如下命令(virtualenv venv):venv是虛擬環境名稱,隨便你寫
在這裡插入圖片描述

看到這樣子就是建立成功了:
在這裡插入圖片描述


這時當前目錄下就會生成venv資料夾(這個就是你的虛擬環境檔案)
啟用虛擬環境:
在這裡插入圖片描述

啟用虛擬環境後,你就可以為所欲為了。
下面開始安裝專案依賴(注意:虛擬環境不要使用sudo 命令,否則也會安裝到正式的python環境中
專案依賴比較多,一般建議引用清單安裝:requirements.txt(這個檔案使用命令:
pip freeze > requirements.txt獲得)
如下為清單:
在這裡插入圖片描述

安裝清單檔案:
在這裡插入圖片描述

注意:在虛擬環境中安裝依賴遇到個大坑(對我來說)
就是安裝的時候凡是有報:沒有許可權的,一律給相應檔案加上寫的許可權就行了。千萬不要使用sudo去安裝(我前面已經說過了)
經過親身體驗,只需要加上這幾個資料夾的許可權就行了(虛擬環境)


sudo chmod 777 venv/lib/python3.6/site-packages/pycache
sudo chmod 777 venv/lib/python3.6/site-packages
udo chmod 777 venv/bin

安裝好依賴後,你可以上傳專案檔案到當前資料夾下了:
可使用命令:sudo rz上傳(這個不是自帶的,需要安裝 sudo apt-get install lrzsz)
上傳後,目錄結構如下(網上隨便截圖來的不用在意一些細節):
在這裡插入圖片描述
這裡我貼下我 manage.py 的程式碼:

from flask import request
from flask_script import Manager, Command
 
from comm import create_app
from comm.k_error import KFlaskErr
from comm.result import R
 
 
#初始化,__name__代表主模組名或者包
app = create_app()
manager = Manager(app=app)
 
 
#@manager.command
class Hello(Command):
    def run(self):
        print("hello world")
 
 
manager.add_command('hello', Hello())
 
if __name__ == '__main__':
    manager.run()
 
create_app程式碼:
import os
 
from flask import Flask
from . import app
 
 
def create_app():
    print('create app...')
    base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    templates_dir = os.path.join(base_dir, 'templates')
    static_dir = os.path.join(base_dir, 'static')
    # app = Flask(__name__)
    app = Flask(__name__, static_folder=static_dir, template_folder=templates_dir)
    app.register_blueprint(app, url_prefix='/kapi')     # 將app交由blue管理
 
    return app

安裝uwsgi:
在這裡插入圖片描述

配置uwsgi:
在當前目錄建立config.ini配置檔案,內容如下

[uwsgi]
 
# uwsgi 啟動時所使用的地址與埠
socket = 127.0.0.1:5000
# 指向網站的目錄
chdir = /home/python_project/kapi
# python 啟動程式檔案
#wsgi-file = manager.py
module = manager
# python 程式內用以啟動的application變數名(app是manager.py程式檔案內的一個變數,這個變數是Flask的application類)
callable = app
# 處理器數
processes = 4
# 執行緒數
threads = 2
# 狀態檢測地址
#stats = 127.0.0.1:9191
# url地址長度
buffer-size = 32168
# 允許主執行緒存在(true)
master = true
plugins = python
#daemonize = %(chdir)/log/uwsgi.log
stats = %(chdir)/uwsgi/uwsgi.status
pidfile = %(chdir)/uwsgi/uwsgi.pid
disable-loggin = true
#logto = %(chdir)/log/uwsgi.log

測試執行:
在這裡插入圖片描述

按ctrl + C就可退出。

將uwsgi新增為系統服務
在我們執行或者除錯uwsgi的時候:
在這裡插入圖片描述
如果Ctrl+C或者退出ssh連結,都會導致uwsgin程序關閉。
這時,我們需要程序管理軟體管理 uwsgi 程序的運行了。Ubuntu 自帶的 systemd 是最簡單的方法,可以將我們的專案變為系統服務。首先建立 myproject.service 檔案
sudo vim /etc/systemd/system/myproject.service

[Unit]
Description=uWSGI instance to serve myproject
After=network.target
 
[Service]
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
 
[Service]
WorkingDirectory=/home/python_project/kapi
ExecStart=/home/python_project/kapi/venv/bin/uwsgi --ini /home/python_project/kapi/config.ini
ExecStop=/home/python_project/kapi/venv/bin/uwsgi --stop /home/python_project/kapi/uwsgi/uwsgi.pid
ExecReload=/home/python_project/kapi/venv/bin/uwsgi --reload /home/python_project/kapi/uwsgi/uwsgi.pid
 
[Install]
WantedBy=multi-user.target

o [Unit]部分主要是對這個服務的說明,內容包括Description和After,Description用於描述服務,After用於描述服務類別
o [Service]部分是服務的關鍵,是服務的一些具體執行引數的設定
• WorkingDirectory: 你的專案目錄。
• ExecStart:服務啟動的程式碼
• ExecReload:重啟命令
• ExecStop:停止命令
• WantedBy=multi-user.target:指明會跟隨系統啟動而啟動該服務。
o 注意以上所有路徑為絕對路徑。

配置完畢需要reload systemdctl(命令:systemctl daemon-reload
接下來可以愉快的啟動了(kapi 就是 kapi.service 檔名去掉副檔名)
啟用:systemctl start kapi.service
停止:systemctl stop kapi.service
過載:systemctl reload kapi.service

在這裡插入圖片描述

使用命令 ps aux | grep uwsgi 檢視程序
在這裡插入圖片描述

配置nginx:
在這裡插入圖片描述

遇到的還有一些問題(集合所有網友的力量,有的直接copy過來的):
一、uwsgi啟用後,訪問專案:invalid request block size: 4161 (max 4096)…skip問題

之前一個沒有去詳細搜尋過,也沒有具體去看錯誤產生的原因,因為只是偶爾出現,並且有時候重試的時候是可以登陸的,所以沒有太多的去關注,今天因為在會議演示的過程中又出現這個問題,所以不得不重視了。
搜尋一下,其實問題很簡單:url地址長度超過了4096個字元,而4096就是uwsgi配置中buffer-size的預設值,所以只需要將buffer-size改大一點即可。
我是使用uwsgi -x 指定uwsgi配置檔案來啟動伺服器的,所以只需要修改成以下方式啟動即可:
uwsgi -x platform.uwsgi.xml --buffer-size 32768
或在config.ini配置檔案加buffer-size = 32168(前面的配置檔案我已經加上去了)
二、uwsgi-- unavailable modifier requested: 80 –

這個問題好像只有我出現了也,其實問題是這樣的:因為我這個專案提供介面給其它專案去呼叫,另一個專案也部署到本伺服器上。所以我呼叫介面的時候我直接使用127.0.0.1:5000/這個地址粗暴的呼叫導致的,後面配置了nginx,使用了域名呼叫就毛問題啦

三、專案啟動時(只有用到opencv-python才可能會出這個錯):ImportError: libSM.so.6: cannot open shared object file: No such file or directory
在這裡插入圖片描述

解決:
sudo apt-get install -y python-qt4

垮過很多坑(好像也不是很多也~~!),終於把專案部署並啟用起來。
好了,搬磚時間又到了。你們耍。