Debian部署python3+flask+uwsgi+Nginx+Supervisor

来源:http://www.cnblogs.com/yangyuexiong/archive/2017/11/13/7825306.html
-Advertisement-
Play Games

Debian部署python3+flask+uwsgi+Nginx+Supervisor 一、安裝編譯用的包 如果在root下就不用輸入 sudo。在子用戶下就在命令前加上 sudo。 $ sudo apt-get install build-essential $ sudo apt-get ins ...


Debian部署python3+flask+uwsgi+Nginx+Supervisor

一、安裝編譯用的包

  • 如果在root下就不用輸入 sudo。在子用戶下就在命令前加上 sudo。
  1. $ sudo apt-get install build-essential
  2. $ sudo apt-get install libncurses5-dev libncursesw5-dev libreadline6-dev
  3. $ sudo apt-get install libdb5.1-dev libgdbm-dev libsqlite3-dev libssl-dev
  4. $ sudo apt-get install libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev

二、下載安裝 python3

  1. 下載python3包

     $ wget --no-check-certificate https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz

    '下載可能會出現證書無效問題,只要安裝個ca-certificates或使用--no-check-certificate下載就可以避免下麵的錯誤'

  2. 進入下載目錄
     $ cd 下載的目錄下/
  3. 解壓包
     $ tar -zxf Python-3.6.3.tgz
  4. 進入python3
     $ cd Python-3.6.3

三、編譯安裝

  1. 解決PIP包管理器所需依賴包
     $ vim Modules/Setup.dist
  2. 將下麵1行取消註釋,大概在文件的361行左右.修改後esc:wq保存並退出
     zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

四、自定義安裝目錄

  1. 創建安裝目錄
     $ mkdir -p /usr/local/python3.6.3
  2. 進入python3目錄
     $ cd Python-3.6.3
  3. 指定到安裝目錄
     $ ./configure --prefix=/usr/local/python3.6.3
     $ ./configure --enable-optimizations
  4. 這裡編譯使用的是make all沒有直接使用make,all參數會編譯所有子模塊。

     $ make all
     $ make install

五、把 python3 添加到PATH里

  1. 打開~/.bashrc 文件
  2. 添加執行路徑
     $ sudo vim ~/.bashrc
     export PATH=$PATH:/usr/local/python3.6.3/bin
    添加新的別名信息來修改預設使用的Python版本
     alias python='/usr/bin/python3.6.3'
  3. 生效配置文件
     $ source .bashrc
  4. 查看版本:
    因為上面已經添加了預設使用python3.6.3,所以直接輸入$ python -V 會出現 (-bash: /usr/bin/python3.6.3: No such file or directory)報錯。
     查看python版本輸入以下:
     $ python2 -V :顯示為系統自帶的python2.7.3
     $ python3 -V :顯示為系統自帶的python3.6.3

六、安裝 Nginx

  1. 安裝
    $ sudo apt-get install nginx
    # 查看版本
    $ nginx -v
  2. 啟動 nginx

     $ sudo /etc/init.d/nginx start

    瀏覽器訪問:你的伺服器ip地址 如:http://45.45.162.162

     


    出現上圖:表示成功

     

  3. 停止 nginx
     $ sudo nginx -s stop

七、安裝 uWSGI

  1. 因為已經安裝python3所以要使用pip3進行安裝
     $ pip3 install uwsgi
  2. 查看版本
     $ uwsgi --version
  3. 安裝方法二:下載:
     $ wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
  4. 解壓:
     $ tar zxvf uwsgi-latest.tar.gz

八、測試

如果:有現成的項目可以把項目上傳到伺服器中,在git 管理項目,只需要 git clone 一下就可以了。

如果:你需要從本地上傳項目文件,可以用scp命令,這裡就不啰嗦用法了。總之我們將項目文件放到伺服器,然後就可以用virtualenv管理Python環境
virtualenv就不多說了。這裡直接用flask demo進行。

  1. 安裝虛擬環境

     $ pip3 install virtualenv
  2. 創建一個包

     $ mkdir myproject
     $ cd myproject
  3. 創建虛擬環境
     $ virtualenv env
    (1)激活虛擬環境
     $ source env/bin/activate
    (2)在虛環境中安裝flask
     $ pip3 install flask
    (3)退出虛環境
     $ deactivate
    (4)創建啟動文件
     $ vim run.py
    (5)寫入一個flask,埠自己進行設置。我這裡用的80埠。
     from flask import Flask
     app = Flask(__name__)
     @app.route("/")
     def hello():
         return "Hello World!"
     if __name__ == "__main__":
         app.run(host='0.0.0.0', port=80)
    (6)esc+wq保存並且退出
  4. 運行這個run.py文件
    (1)先停止Nginx
     $ nginx -s stop
    (2)打開你設置的埠(埠預設全部是關閉狀態)埠自行設置。
     $ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
     # 如果想關閉打開的埠:
     $ iptables -A INPUT -p tcp --dport 80 -j DROP
    (3)啟動flask程式
     $ cd myproject
     $ python3 run.py
  5. 用其他電腦和手機4G訪問你的伺服器ip地址+上埠。
     如:http://45.32.122.555:80/
     出現:Hello World! 那就成功了。

九、配置 Nginx

  1. *
    (1)進入
     $ cd /etc/nginx/sites-enabled/
    (2)編輯default
     $ vim default
    —————————————————————————————————
     # 或者直接配置 $ cd /etc/nginx 
     $ vim nginx.conf
     # 不過要根據其語法來配置其實最後nginx.conf還是會調用/etc/nginx/sites-enabled/default的配置。
    (3)在最後寫入後 :wq保存並且退出
     server {
     listen  80;
     server_name 45.32.162.255; 
     charset      utf-8;
     client_max_body_size 75M;
     location / {
         include      uwsgi_params;
         uwsgi_pass   127.0.0.1:8000;  
         uwsgi_param UWSGI_PYHOME /root/myproject/venv;
         uwsgi_param UWSGI_CHDIR  /root/myproject; 
         uwsgi_param UWSGI_SCRIPT run:app; 
         }
     }
    解析
    listen 80; # 伺服器監聽埠
    server_name 45.32.162.255; # 這裡寫你的功能變數名稱或者公網IP
    charset utf-8; # 編碼
    client_max_body_size 75M; # 之前寫的關於GET和POST的區別
    include uwsgi_params; # 導入uwsgi配置
    uwsgi_pass 127.0.0.1:8000; # 轉髮端口,需要和uwsgi配置當中的監聽埠一致 (下麵會配置uwsgi)
    uwsgi_param UWSGI_PYTHON /root/myproject/venv; # Python解釋器所在的路徑(這裡為虛擬環境)【路徑按照自己具體的路徑填寫】
    uwsgi_param UWSGI_CHDIR /root/myproject; # 項目根目錄
    uwsgi_param UWSGI_SCRIPT run:app; # 項目的主程式,即Flask app所在的位置【run是運行文件run.py文件(根據自己創建的文件名)app是falsk實例】

(4)測試一下配置文件是否正確,若檢測配置文件失敗,再好好檢查下配置文件有沒有疏漏。

    $ nginx -t

 

# 表示測試成功

 

(5)此時訪問Nginx伺服器應該會得到502 Bad Gateway的提示,因為請求被Nginx轉發了,但是並沒有轉發伺服器來處理請求(還沒有配置好uwsgi)。

    $ service nginx start

 

 

十、配置 uwsgi

  1. # 在項目文件根目錄新建配置文件uwsgi.ini(uwsgi支持多種配置文件格式: xml, ini, json等)
    (1)進入項目根目錄

     $ cd myproject

    (2)創建uwsgi文件

     $ vim uwsgi.ini

    (3)寫入以下內容後 :wq保存並退出

     [uwsgi]                                                     
     socket = 127.0.0.1:8000                         
     plugins = python                                        
     chidir = /root/myproject                                    
     wsgi-file = run.py                                       
     callable = app                  

    # uwsgi的監聽埠【要跟上面nginx配置里的埠一樣】
    # 這行一定要加上,不然請求時會出現-- unavailable modifier requested: 0 --錯誤提示
    # 項目根目錄【路徑按照自己具體的路徑填寫】
    # flask程式的啟動文件【這裡我命名為run.py】
    # 程式變數名 【app是falsk實例變數】

  2. 啟動測試
    (1)啟動 Nginx

     $ service nginx restart

    (2)啟動 uwsgi #註意要回到項目根目錄下執行

     $ cd ~
     $ cd myproject
     $ uwsgi uwsgi.ini
     若一切正常的話就可以在終端上看到uwsgi的啟動信息了

    (3)打開瀏覽器

     訪問你的ip加上埠
     例:http://45.32.162.255:80
     頁面出現:Hello World!

    # 說明Nginx和uwsgi配置成功了

    # 但離真正項目上線還差一段,因為uwsgi是直接在前臺啟動的,當我們的連接終端跟伺服器斷開的時候uwsgi進程也被關閉了,所以我們需要uwsgi在後臺運行。

    解釋一下上面這段話:我們在連接伺服器啟動項目後可以用瀏覽器訪問成功。但是我們一但關閉與伺服器的連接後再用瀏覽器訪問就不行了.項目是運行在前臺的也就是說.在關閉與伺服器連接的同時也關閉了伺服器的命令窗.運行在前臺的項目也同時關閉。所以我們需要把項目運行在後臺。

  3. 後臺啟動項目
    (1)用nohup啟動:不掛斷運行命令,用"&"可以讓你的命令在後臺執行
    (nohup詳細的命名參數請到官網查詢)註意:別漏了&號。
     $ nohup uwsgi uwsgi.ini &
    (2)關閉與伺服器的連接,然後用瀏覽器訪問你的ip地址:
     顯示:Hello World! 表示ok了!
    (3)可以通過命令把這個項目從後臺停止,查詢uwsgi的進程(linux命令不詳細說了)
     $ ps -ef|grep uwsgi
    找到uwsgi進程uwsgi.ini:
    root 7950 1 0 14:57 ? 00:00:00 uwsgi uwsgi.ini
    進程id每個人都不一樣 這裡的id是7950。
    (4)殺掉後臺的uwsgi進程kill -9 後面加上進程的id 或者 killall uwsgi殺掉全部同名為uwsgi的進程。
     $ kill -9 7950
     $ killall uwsgi
    (5)再用瀏覽器去訪問ip
     瀏覽器頁面顯示:502 Bad Gateway 表示停止掉uwsgi程式的運行
    (6)項目根目錄下會生成 nohup.out 記錄日誌

十一、使用Supervisor進程監控

# Supervisor是python2寫就的一款強大的運維工具。
目前Supervisor還不支持python3。可以通過以下方法解決。

可通過pip安裝.這裡用的是python3的pip.所以會安裝失敗.使用以下.

  1. 首先安裝supervisor (預設由自帶的python2.7驅動)
     $ apt-get install supervisor
  2. 進入預設配置文件(修改配置文件)

     $ cd /etc/supervisor/
     $ vim supervisord.conf 
     按shift+G 跳到末尾
     添加:files = /etc/supervisor/*.conf
     esc:wq 保存

     

     

     這樣方便為每個app單獨設置conf文件而不必全部寫在全局設置裡面
     在啟動supervisorctl須先啟動supervisord。
     否則會出現error: 
     <class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python2.7/socket.py line: 575錯誤
    
     執行:(若不是在root下執行在最前面加上 sudo)
    
     $ supervisord -c /etc/supervisor/supervisord.conf
     $ supervisorctl -c /etc/supervisor/supervisord.conf
     # 這裡補充以一下:每當修改完配置後如果出現
     error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.
     # 請重新執行以上的兩句命令
    
     進入:supervisor shell模式表示成功
     退出:supervisor shell
     supervisor> exit
  3. 創建腳本文件,生成預設配置文件.

     $ cd /etc/supervisor/conf.d/
     新建app.conf文件(文件名自己定義)
     $ vim app.conf
  4. 進入編輯模式添加配置

     [program:myproject]
     directory = /root/myproject/
     command= uwsgi --ini /root/myproject/uwsgi.ini
     autostart = true
     startsecs = 5
     autorestart = true
     startretries = 3
     user = root
     redirect_stderr = true
     stdout_logfile_maxbytes = 20MB
     stdout_logfile_backups = 20
     stdout_logfile = /tmp/app.log
     stopasgroup=false
     killasgroup=false 

    esc:wq 保存並退出

    # 解析
    [program:myproject]:# 項目的包名字(我的是myproject)

    directory = /root/myproject/:# 程式的啟動目錄路徑

    command= uwsgi --ini /root/myproject/uwsgi.ini:#啟動命令
    (相當於直接啟動 uwsgi uwsgi.ini一樣只是加上了路徑)

    autostart = true:# 在 supervisord 啟動的時候也自動啟動
    startsecs = 5: # 啟動 5 秒後沒有異常退出,就當作已經正常啟動了
    autorestart = true:# 程式異常退出後自動重啟
    startretries = 3:# 啟動失敗自動重試次數,預設是 3
    user = root: # 使用哪個用戶啟動(我這裡用的root)

    redirect_stderr = true:# 把 stderr 重定向到 stdout,預設 false
    stdout_logfile_maxbytes = 20MB:# stdout 日誌文件大小,預設 50MB
    stdout_logfile_backups = 20:# stdout 日誌文件備份數

    註意:stdout 日誌文件,需要註意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord會自動創建日誌文件)別忘了配置之後創建下麵繼續。

    stdout_logfile = /tmp/app.log

    說下這兩個有用的配置項stopasgroup和killasgroup,如果我們用Flask等Rest服務,通常其會開啟幾個進程,那麼如果stopasgroup不啟用的話,supervisor無法重啟此服務(關閉主進程時其子進程沒有關閉,再開啟主進程時會提示埠被占用等錯誤信息)。

    stopasgroup=false:
    預設為 false,如果設置為 true,當進程收到 stop 信號時,會自動將該信號發給該進程的子進程。如果這個配置項為 true,那麼也隱含 killasgroup 為 true。例如在 Debug 模式使用 Flask 時,Flask 不會將接收到的 stop 信號也傳遞給它的子進程,因此就需要設置這個配置項。

    killasgroup=false:
    預設為 false,如果設置為 true,當進程收到 kill 信號時,會自動將該信號發給該進程的子進程。如果這個程式使用了 python 的 multiprocessing 時,就能自動停止它的子線程。

         # 創建日誌的文件夾
         $ cd ~
         $ cd /myproject/
         $ mkdir tmp

    配置完成

    # 還有更多的配置參數請查閱官網

    #這裡我們可以看出,雖然supervisor是python2寫的,但只要我們指定運行的python3解釋器去運行程式就行了。

  5. 使配置生效(每當修改主配置文件或增改子配置文件都需要執行使它生效)
    需要先進入$ cd /etc/supervisor目錄或者項目的目錄cd myproject/才可以運行相關的命令如:supervisorctl reload等相關命令

     $ supervisorctl update # 因為是python3執行該命令可能會報錯
     # 可以使用以下命令:重新載入配置文件
     $ supervisorctl reload
  6. 運行supervisorctl,即可進入shell裡面方便的操作,如start app、restart app等。

     $ cd /etc/supervisor
     $ supervisorctl
     $ start myproject # 你的項目名稱
     # 執行start後可以看到 myproject RUNNING pid 16758, uptime 0:02:58
     $ restart myproject # 重新啟動
     $ stop myproject # 停止
     # 更多相關命令可以到官網上查閱這裡不消息介紹
  7. 以上我們只能在控制台查看運行.我們需要web界面上查看

     # 添加修改配置文件
     $ cd /etc/supervisor/
     $ vim supervisord.conf
     # 如果在vim模式下找到則對應修改
     # 如果沒有 按shift+G 跳至末尾添加
    
     # IP和綁定埠
     # 管理員名稱
     # 管理員密碼
     [inet_http_server]
     port = 45.32.111.111:9001   
     username = user 
     password = 666666
     # 如果不需要密碼可以註釋在最前面機上;號
     # ;username = user 
     # ;password = 666666
     # 重新載入配置文件使它生效
     $ cd /etc/supervisor
     $ supervisorctl reload
     # 最後你需要打開你的這個埠並且重啟supervisorctl
     $ iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
     $ cd /etc/supervisor
     $ supervisorctl
  8. 用瀏覽器啟動

     # 輸入你的ip和埠
     45.32.111.111:9001

     

     

看到上圖界面表示已經成功,之後可以通過打開Supervisor埠去監控管理你的項目一鍵啟動/停止你的項目。

——————————————————————————————————
有什麼遺漏不足的請多多指導!!!

覺得好的~點個贊打賞下咯~謝謝!!!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 package kk; public class circle { private double radius; // 構造方法,有參構造 public circle(double radius) { this.radius = radius; } //方法的重載,參數不同 ... ...
  • 這裡有dao、service和Servlet三個地方 通過配過文件xml生成對象,並註入對象類型的屬性,降低耦合 dao文件代碼: service文件代碼:(提供setter方法,xml文件可通過這種方法配置) xml文件代碼: Servlet類文件可以繞開dao的文件,直接使用service即可 ...
  • 有時候,打開別人的開發環境中導過來的項目的JSP文件,會出現“Failed to create the part's controls”的錯誤! 解決的方法有: 方法1:關閉myeclipse的jsp設計視圖,window -> perferences -> General -> editors - ...
  • ecs_account_log:賬戶變動日誌(註冊用戶充值、支付等記錄信息) ecs_ad:廣告表 ecs_admin_action:管理員許可權表(定義了128項功能操作) ecs_admin_log:管理員操作日誌表 ecs_admin_message:管理員留言表 ecs_admin_user: ...
  • 今天學習的內容我覺得還是很有意思的,當然我主要也是從這個網址學的:http://bbs.fishc.com/thread-46069-1-1.html,大家可以直接看這個網址進行學習,當然也可以看看我的總結,嘻嘻^-^ 這裡就不講解安裝的方法了吧,也比較簡單,大家可以看剛剛那個網址或者百度安裝。 1 ...
  • 配套視頻: static作用 static特點 static記憶體分析 一、引出static 在我們生活當中 , 有些事物不屬於某一個對象,而是屬於整個事物的類型 比如:全世界人口的總數 人的毀滅行為:毀滅的行為應該屬於人類, 不應該屬於某一個人 狀態和行為應該 有 對象 和 類 之分 有的狀態和行為 ...
  • 題目內容: 每個非素數(合數)都可以寫成幾個素數(也可稱為質數)相乘的形式,這幾個素數就都叫做這個合數的質因數。比如,6可以被分解為2x3,而24可以被分解為2x2x2x3。 現在,你的程式要讀入一個[2,100000]範圍內的整數,然後輸出它的質因數分解式;當讀到的就是素數時,輸出它本身。 輸入格 ...
  • redis應用場景:實現計數器-防止刷單 最近由於雙11要來臨,公司需要在介面請求上,做一下併發限制的處理,或者做一個防止刷單的安全攔截:比如:一個介面請求,限制每秒請求總數為200次,超過200次就等待,等下一秒,再次請求,這裡用到一個redis作為一個計數器的模式來實現。 調用redis的方法: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...