任務:php
視頻翻譯項目須要在兩個服務器上進行通訊(國內&海外的阿里服務器)。html
由於python是主語言,選用了Django 來快速部署API。python
注:Django中文文檔:https://docs.djangoproject.com/zh-hans/3.0/nginx
囉嗦:git
本地建立項目很輕鬆,但部署到服務器上困難重重。github
將過程記錄下來,一來記錄心得和經驗,二來幫助後來者,少走彎路。web
PS:shell
MobaXterm安裝使用詳細說明:django
http://www.javashuo.com/article/p-sgbstrvj-ce.htmlsegmentfault
防止SSH斷開鏈接:
https://blog.csdn.net/u014636245/article/details/83855860
重要提示:如下代碼均沒有加上sudo
,若是有哪裏由於權限問題失敗了,能夠加上sudo再試一下。
更新一下系統(防止有的包找不到)
$ apt-get update $ apt-get upgrade
安裝依賴庫
$ apt-get install build-essential libtool $ apt-get install libpcre3 libpcre3-dev zlib1g-dev openssl
安裝python3和pip3
$ apt-get install python3.7
$ apt-get install python3-pip
安裝虛擬環境
python3 -m pip install virtualenv
建立存放虛擬環境和項目的文件夾
確保當前目錄是root目錄
cd ~
注意分清 : (當前用戶家目錄)和 / (系統根目錄)的區別。
$ mkdir -p /root/www/project/env $ mkdir -p /root/www/project/【ytb_api】
注: -p 遞歸建立目錄,即便上級目錄不存在,會按目錄層級自動建立目錄
【ytb_api】修改成你的項目名
建立虛擬環境
# virtualenv -p [python3路徑] [項目路徑]
$ cd /root/www/project/env $ virtualenv -p /usr/bin/python3 ENV
注:若是不知道python3路徑,能夠用 which python3
若是不瞭解虛擬環境的使用,看這兩篇文章就夠了:
http://kuanghy.github.io/2015/12/04/virtualenv
https://docs.python.org/zh-cn/3/tutorial/venv.html
啓動虛擬環境
$ source /root/www/project/env/ENV/bin/activate
命令行的最前面出現(
ENV)
即表明處於虛擬環境下。
注:
source: 執行文件並從文件中加載變量及函數到執行環境。
安裝Django
python3 -m pip install django
注意此處pip前 要加python3 -m 的緣由:
直接pip會安裝到python2上,須要經過pip去指定安裝到Python3.x下
詳見文章:https://blog.csdn.net/Cloudox_/article/details/78616378
測試Django項目是否正常
將本地項目文件夾拖拽進www/project/ 目錄下。
runserver 運行一下,看看程序是否正常
$ python3 manage.py runserver
有以下顯示,說明沒問題
Django version 2.2, using settings 'firstpage.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
安裝uWSGI服務器
$ python3 -m pip install uwsgi
開啓阿里雲安全組和防火牆
# 防火牆部分,開啓8000端口訪問權限 sudo ufw status sudo ufw allow 8000
阿里雲用戶須要在控制檯打開入方向的8000端口權限。
測試 uwsgi監聽端口是否成功
在項目根目錄下,建立一個test.py
文件,內容以下
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
運行uWSGI,確保當前工做目錄在你建立並安裝uwsgi的虛擬環境下:
$ uwsgi --http :8000 --wsgi-file test.py
特別注意:阿里雲用戶須要提早打開入方向的8000端口權限。
若是默認80端口開,能夠將下面的8000端口,改爲80端口測試
在地址欄中輸入 你的域名:端口號
,網頁上顯示Hello World則表示uWSGI成功運行
同時表明瞭如下通信是正常進行的
web client < -- > uWSGI < -- > Python App
將Django項目指定給uWSGI
$ uwsgi --http :8000 --wsgi-file /www/project/ytb_api/ytb_api/wsgi.py
若是此處卡住了,看後面的常見問題。
外網瀏覽器訪問端口,若是顯示出小火箭,說明uWSGI<-->Django通了。
業務部分的包安裝:(讀者請跳過)
###------業務部分------ # 一、安裝oss2 python3 -m pip install oss2 # 二、安裝阿里雲sdk python3 -m pip install aliyun-python-sdk-core-v3 # 三、安裝youtube-dl python3 -m pip install youtube-dl # 四、安裝依賴 python3 -m pip install six # 五、安裝ffmpeg sudo apt-get install ffmpeg
若是你斷開鏈接,那麼服務也終止了,因此須要用配置ini文件來啓動uwsgi,這樣uwsgi能夠後臺貯存。
本地建立一個uwsgi.ini文件
內容以下(請必定珍惜,由於參考了不少,摸索了不少,踩坑了不少,總結出來的一份配置):
[uwsgi] ### Django-related settings # socket = :8000 # 若是須要配置nginx,則須要此項 http = :8000 # the base directory (full path) # 項目路徑,項目的根目錄 chdir = /root/www/project/local_api # Django's wsgi file # 配置項目路徑,項目的所在目錄 module = local_api.wsgi # the virtualenv (full path) # 虛擬環境。注意這裏不是env,而是home home = /root/www/project/env/ENV ### process-related settings # maximum number of worker processes # 最大進程個數 # 同時啓動uwsgi進程的個數,這個進程與nginx中的workers是不同的, # uwsgi中的每一個進程每次只能處理一個請求(進程越多能夠同時處理的請求越多), # nginx採用的異步非阻塞的方式來處理請求的,每一個進程能夠接受處理多個請求。 processes = 10 # 每一個進程的線程數 threads = 4 # 啓動一個主進程來管理其餘進程,processes的進程都是這個master進程的子進程,若是kill這個master進程,至關於殺死全部的uwsgi進程 master = true # 容許用內嵌的語言啓動線程。這將容許你在app程序中產生一個子線程 enable-threads=true # clear environment on exit #當服務器退出的時候自動刪除unix socket文件status和pid文件 vacuum = true # 設置日誌目錄 daemonize = /root/www/project/local_api/uwsgi.log # 設置最大日誌文件大小 log-maxsize = 5000000 # 設置用於uwsgi包解析的內部緩存區大小爲64k。默認是4k。 buffer-size = 32768 # 爲每一個工做進程設置請求數的上限。當一個工做進程處理的請求數達到這個值,那麼該工做進程就會被回收重用(重啓)。你可使用這個選項來默默地對抗內存泄漏 max-requests = 5000 # 經過使用POSIX/UNIX的setrlimit()函數來限制每一個uWSGI進程的虛擬內存使用數。這個配置會限制uWSGI的進程佔用虛擬內存不超過256M。若是虛擬內存已經達到256M,並繼續申請虛擬內存則會使程序報內存錯誤,本次的http請求將返回500錯誤。 # limit-as = 256 # 一個請求花費的時間超過了這個harakiri超時時間,那麼這個請求都會被丟棄,而且當前處理這個請求的工做進程會被回收再利用(即重啓) http-timeout = 500 harakiri = 500 # uwsgi.pid文件用來重啓和中止uwsgi服務 pidfile = %(chdir)/uwsgi/uwsgi.pid
在項目根路徑下,新建個uwsgi文件夾(用於存放uwsgi服務的pid文件)
將剛纔本地建立的uwsgi.ini拖拽進項目根路徑下
目錄結構:
### ------ini運行uwsgi------ # 啓動 uwsgi --ini uwsgi.ini # 中止 uwsgi --stop uwsgi/uwsgi.pid
運行成功有此提示:
啓動成功會有個uwsgi.log文件,是記錄請求的文件。
好了,若是順利走到這,那麼恭喜你。
關於不用Nginx:
因爲我只是國內國外各部署一個API用以接收請求,而後之間相互通訊,不涉及靜態頁面,
並且uwsgi服務器性能目前業務就能夠知足,因此不上Nginx,可是之後業務量上來了,
Nginx的負載均衡和大併發的異步非阻塞的處理請求,就可能須要了。
若是須要,之後再弄。
常見問題:
(1) 未在Django中未設置設置被容許的域名
DisallowedHost at / Invalid HTTP_HOST header: ..... You may need to add "你的域名" to ALLOWED_HOSTS
須要在settings.py中設置被容許的域名字
ALLOWED_HOSTS = ['XXX.XXX.XXX.XXX']
(2) 沒有報錯,遠程就是沒法訪問
解決方法:
查看防火牆狀態
sudo ufw status
開啓對應的端口號,如8000端口
sudo ufw allow 8080
其次,查看阿里雲安全組設置,是否開啓相關的端口號。
由於公司把這個視頻翻譯的項目全權交給我,因此一切都是本身摸(踩)索(坑)。
從調研、選技術路徑、MVP(最小單元試錯)、測試對比分析結果、後端功能代碼、部署,
甚至包括運維,一會兒學了不少,賊開心。
下面是此項目的心得:
一、參考文章的方法
跟着一個寫的比較詳細的 靠譜的博客做爲主線,跟着一步步走,
遇到問題再去找別的教程或者去官網查,要多看,博採衆長,畢竟博觀才能約取。
二、進一步思考
每一個步驟的含義,每一個參數的含義,參數不設置成不成,會有哪些影響,
爲何要用uwsgi,需不須要弄Nginx等等等等,都是提高能力的好機會。
三、耐心很重要
必定要有耐心,新接觸一個東西,出各類問題很正常,要耐下心來逐一解決,多請教別人。
謝謝你們,祝各位部署順利。
參考內容:
官方文檔
uwsgi:
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html
https://docs.djangoproject.com/zh-hans/3.0/howto/deployment/wsgi/uwsgi/
https://uwsgi-docs.readthedocs.io/en/latest/Options.html
Django:
https://docs.djangoproject.com/zh-hans/3.0/
文章:
https://blog.csdn.net/Lo_Bamboo/article/details/80141880
https://www.chuangzhidou.com/2019/04/02/django-deploy/
http://www.javashuo.com/article/p-educuzjx-gw.html
https://www.hongweipeng.com/index.php/archives/1814/
https://zhuanlan.zhihu.com/p/51012932
http://www.javashuo.com/article/p-kybrnntv-go.html
https://gaussic.github.io/2016/08/03/django-uwsgi-deploy/
http://www.javashuo.com/article/p-zvgxrelx-ep.html
https://www.jianshu.com/p/0e85cf58e677
https://zhuanlan.zhihu.com/p/29083368