- 經過瀏覽網上大量文章與查閱相關文件和親自測試最終寫下這篇文章。
- 系統:Debian9 x64
- python版本:python3.5+
- 使用root進行安裝配置-可以省去sudo的麻煩。
一、獲取最新的軟體包/升級已安裝的所有軟體包
apt-get update
apt-get upgrade
二、安裝:pip3(Debian9系統自帶python3.5)
apt-get install python3-pip
三、安裝:python虛擬環境 即:virtualenv
pip3 install virtualenv
四、安裝:Nginx
apt-get install nginx
五、安裝:uwsgi(注意用的pip3而且不需要安裝在虛擬環境中)
pip3 install uwsgi
六、建立一個虛擬環境 即:virtualenv
- 用於除錯所以先不使用真正專案中的包 requirements.txt
- 在srv下建立一個虛擬環境
cd /srv
- 檢視python3路徑
which python3
- 建立虛擬環境指向查出來的路徑/usr/bin/python3跟上環境名稱(名稱可以隨便取)flask-env
virtualenv -p /usr/bin/python3 flask-env
- 進入虛擬環境安裝flask因為除錯需要用到
. flask-env/bin/activate
pip install flask
(在虛擬環境中無論是py2還是py3用的時候都是用pip)deactivate
(安裝成功後退出)- 在srv下建立一個專案(調通之後用生產的專案替換即可)
mkdir myproject
七、建立一個flask專案做除錯(除錯成功後再從Git或Svn等倉庫拉專案)
cd /myproject
vim 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
八、測試一下Nginx
- 啟動:Nginx
service nginx start
- 在瀏覽器中訪問ip+80埠 如:59.12.32.4:80
- 出現以下頁面表示成功
九、使用:uwsgi啟動專案
- 在專案根目錄建立uwsgi配置檔案.ini:檔名稱隨便取我取名:test.ini
cd /srv/myproject/
vim test.ini
- chdir:專案的路徑
- module:模組:啟動檔案的名稱不需要加上.py
- home:python的虛擬環境路徑
- master:是否啟用mater模式
- processes:程式數(根據你伺服器的配置去設定)
- socket:socket檔案地址用於與Nginx進行通訊(不需要手動建立·只需設定)
- wsgi-file:wsgi檔案(相當於flask的啟動檔案run.py)
- callable:wsgi檔案中的app變數(也就是flask的例項)
- chmod-socket:
- plugins:呼叫python35 外掛
- log-maxsize:以固定的檔案大小(單位KB),切割日誌檔案。 例如:log-maxsize = 50000000 就是50M一個日誌檔案
- disable-logging:不記錄請求資訊的日誌。只記錄錯誤以及uWSGI內部訊息到日誌中。
- pidfile:指定pid檔案的位置,記錄主程式的pid號(此項可以不配置)
- vacuum:當伺服器退出的時候自動清理環境,刪除unix socket檔案和pid檔案(try to remove all of the generated file/sockets)(此項可以不配置)
[uwsgi]
chdir = /srv/myproject
module = run
home = /srv/flask-env
master = true
processes = 10
socket = /srv/myproject/myproject.sock
wsgi-file = /srv/myproject/run.py
callable = app
chmod-socket = 666
plugins = python35
log-maxsize = 50000000
disable-logging = true
pidfile = /tmp/uwsgi.pid
vacuum = true
複製程式碼
- 儲存退出
- 由於需要與Nginx進行通訊才能啟動,接下來我們配置Nginx。
十、配置: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:最大的上傳
- uwsgi_pass:需要與upstream的一致 即 myproject
- include:引數檔案
upstream myproject {
server unix:///srv/myproject/myproject.sock;
}
server {
listen 8099;
server_name 66.42.100.165;
charset utf-8;
client_max_body_size 75M;
location / {
uwsgi_pass myproject;
include /etc/nginx/uwsgi_params;
}
}
複製程式碼
- 儲存並退出
- 驗證配置檔案是否正常使用以下命令
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
十一、啟動專案
- 進去專案目錄
cd /srv/myproject/
- 啟動專案
uwsgi --ini test.ini
- 開啟瀏覽器輸入IP+埠號 例子如下
66.42.100.165:8099
- 到了這裡我們的專案部署是完成了。接下來我門使用supervisor來管理它。
- 先把uwsgi所有程式先停止
Ctrl + c
十二、supervisor
ps:這個真的是深坑,網上的教程都Tm缺斤少兩各種不通,本人查閱大量文章-文件與除錯,斷斷續續花費近兩週時間-最終得出以下配置方式,希望大夥伴認真閱讀並且跟著操作操作。
- supervisor:是一個python2寫的linux下管理程式的工具。
- 分為:服務端:supervisord啟動程式,與客戶端:supervisorctl管理程式。
- 首先安裝pip(雖然說它是python2寫的但是使用起來並沒有什麼關係。因為supervisor還可以管理非python的專案程式)
apt-get install supervisor
cd /etc/supervisor/
- supervisord.conf:是主配置檔案
- conf.d:是存放每一個專案配置檔案的地方(每一個被管理的專案都需要一個配置檔案存在在這裡面)如果想改變配置檔案存放的路徑需要在supervisord.conf的[include]中修改。一般來說不需要修改。
- 建立配置檔案
cd /etc/supervisor/conf.d
vim myproject.conf
名字隨便取- [program:myproject]:應用程式的名字(但是這個不是規定的只是一個標示.當然你也可以隨便取.開心就好)
- command:啟動方式 即 uwsgi --ini myproject.ini
- directory:專案的目錄
- startsecs:開始時候等待多少秒
- stopwaitsecs:停止的時候等待多少秒
- startretries:啟動失敗重複次數
- autostart:自動開始(啟動supervisor時啟動該專案)
- autorestart:程式掛了自動重啟
- stdout_logfile:輸出log
- stderr_logfile:輸出錯誤的log
- user:使用那個使用者啟動
- stdout_logfile_maxbytes:日誌檔案最大大小
- stdout_logfile_backups:日誌檔案備份數
- environment:該子程式的環境變數,和別的子程式是不共享(使用該命令檢視環境變數:which python3)
- redirect_stderr:為true的話,stderr的log會併入stdout的log裡面,預設為false
- stopasgroup:主要用於,supervisord管理的子程式,這個子程式本身還有子程式。那麼我們如果僅僅幹掉supervisord的子程式的話,子程式的子程式有可能會變成孤兒程式。所以我們們可以設定可個選項,把整個該子程式的整個程式組都幹掉。 設定為true的話,一般killasgroup也會被設定為true。需要注意的是,該選項傳送的是stop訊號,預設為false
- killasgroup:和上面的stopasgroup類似,不過傳送的是kill訊號。
[program:myproject]
command = uwsgi --ini /srv/myproject/test.ini
directory = /srv/myproject
startsecs = 0
stopwaitsecs = 0
startretries = 3
autostart = true
autorestart = true
stdout_logfile = /srv/myproject/super_log/supervisord.log
stderr_logfile = /srv/myproject/super_log/supervisord.err
user = root
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
environment=PYTHONPATH = "/usr/bin/python3"
redirect_stderr = false
stopasgroup = false
killasgroup = false
複製程式碼
- 建立supervisord日誌目錄
cd /srv/myproject
mkdir super_log
- 讓配置檔案生效-重啟-檢視狀態。
supervisorctl update
supervisorctl reload
supervisorctl status
- 出現以上~專案已經啟動
- 最後:配置supervisorctl的web視覺化管理程式
cd /etc/supervisor/
vim supervisord.conf
按shift+G 跳至末尾新增
- port:IP和繫結埠
- username:管理員名稱
- password:管理員密碼
- 如果不需要密碼可以註釋在最前面機上;號
- ;username = user
- ;password = 666666
[inet_http_server]
port = IP:9001
username = user
password = 666666
複製程式碼
- 讓配置檔案生效-重啟
supervisorctl update
supervisorctl reload
- 注意:如果出現
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.py line: 228
不要慌重啟一下伺服器繼續執行以上的update和reload - 最後開啟9001埠
iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
- 用瀏覽器啟動ip+9001埠(如果設定了賬號密碼就輸入)
- 如果想在伺服器啟動或重啟讓supervisor(相當於你的專案也一起啟動)啟動
cd /etc/rc.local
- 在這個配置檔案的 exit 0 前面一行加上
service supervisor start
儲存!
十三、建議
- 先開個虛擬機器來操作,跟我步驟操作一次全部跑同再上專案。
如果大家有什麼問題可以評論附上問題喲!
- QQ-微信同號:417993207
- 喜歡的可以點個贊-打賞一下支援支援~謝謝!