[精]Debian9部署python3:flask+uwsgi+Nginx+supervisor(舊)-請前往主頁查看最新

  • 通過瀏覽網上大量文章與查閱相關文檔和親自測試最終寫下這篇文章。
  • 系統:Debian9 x64
  • python版本:python3.5+
  • 使用root進行安裝配置-能夠省去sudo的麻煩。

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

  • apt-get update
  • apt-get upgrade

2、安裝:pip3(Debian9系統自帶python3.5)

  • apt-get install python3-pip

3、安裝:python虛擬環境 即:virtualenv

  • pip3 install virtualenv

4、安裝:Nginx

  • apt-get install nginx

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

  • pip3 install uwsgi

6、建立一個虛擬環境 即: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

7、建立一個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

8、測試一下Nginx

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

9、使用: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。

10、配置: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

11、啓動項目

  • 進去項目目錄
  • cd /srv/myproject/
  • 啓動項目
  • uwsgi --ini test.ini
  • 打開瀏覽器輸入IP+端口號 例子以下
  • 66.42.100.165:8099
  • 到了這裏咱們的項目部署是完成了。接下來我門使用supervisor來管理它。
  • 先把uwsgi全部進程先中止
  • Ctrl + c

12、supervisor

ps:這個真的是深坑,網上的教程都Tm缺斤少兩各類不通,本人查閱大量文章-文檔與調試,斷斷續續花費近兩週時間-最終得出如下配置方式,但願大夥伴認真閱讀而且跟着操做操做。python


  • 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保存!

十3、建議

  • 先開個虛擬機來操做,跟我步驟操做一次所有跑同再上項目。

若是你們有什麼問題能夠評論附上問題喲!

  • QQ-微信同號:417993207
  • 喜歡的能夠點個贊-打賞一下支持支持~謝謝!

相關文章
相關標籤/搜索