Debian部署python3+flask+uwsgi+Nginx+Supervisor(舊)-請前往主頁查看最新

1、安裝編譯用的包

  • 若是在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

2、下載安裝 python3

  1. 下載python3包 $ wget --no-check-certificate www.python.org/ftp/python/…python

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

  2. 進入下載目錄 $ cd 下載的目錄下/nginx

  3. 解壓包 $ tar -zxf Python-3.6.3.tgzgit

  4. 進入python3 $ cd Python-3.6.3web

3、編譯安裝

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

4、自定義安裝目錄

  1. 建立安裝目錄 $ mkdir -p /usr/local/python3.6.3sql

  2. 進入python3目錄 $ cd Python-3.6.3shell

  3. 指定到安裝目錄 ./configure --prefix=/usr/local/python3.6.3 ./configure --enable-optimizationsjson

  4. 這裏編譯使用的是make all沒有直接使用make,all參數會編譯全部子模塊。flask

    $ make all
     $ make install
    複製代碼

5、把 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

6、安裝 Nginx

  1. 安裝 sudo apt-get install nginx
    # 查看版本 nginx -vvim

  2. 啓動 nginx $ sudo /etc/init.d/nginx start 瀏覽器訪問:你的服務器ip地址 如:http://45.45.162.162

    出現上圖:表示成功

  3. 中止 nginx $ sudo nginx -s stop

7、安裝 uWSGI

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

8、測試

若是:有現成的項目能夠把項目上傳到服務器中,在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! 那就成功了。

9、配置 Nginx

(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
複製代碼

10、配置 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 記錄日誌

11、使用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端口去監控管理你的項目一鍵啓動/中止你的項目。

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

以爲好的~點個贊打賞下咯~謝謝!!!

相關文章
相關標籤/搜索