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。
- $ sudo apt-get install build-essential
- $ sudo apt-get install libncurses5-dev libncursesw5-dev libreadline6-dev
- $ sudo apt-get install libdb5.1-dev libgdbm-dev libsqlite3-dev libssl-dev
- $ sudo apt-get install libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
二、下載安裝 python3
-
下載python3包
$ wget --no-check-certificate https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
'下載可能會出現證書無效問題,只要安裝個ca-certificates或使用--no-check-certificate下載就可以避免下麵的錯誤'
- 進入下載目錄
$ cd 下載的目錄下/
- 解壓包
$ tar -zxf Python-3.6.3.tgz
- 進入python3
$ cd Python-3.6.3
三、編譯安裝
- 解決PIP包管理器所需依賴包
$ vim Modules/Setup.dist
- 將下麵1行取消註釋,大概在文件的361行左右.修改後esc:wq保存並退出
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
四、自定義安裝目錄
- 創建安裝目錄
$ mkdir -p /usr/local/python3.6.3
- 進入python3目錄
$ cd Python-3.6.3
- 指定到安裝目錄
$ ./configure --prefix=/usr/local/python3.6.3 $ ./configure --enable-optimizations
-
這裡編譯使用的是make all沒有直接使用make,all參數會編譯所有子模塊。
$ make all $ make install
五、把 python3 添加到PATH里
- 打開~/.bashrc 文件
- 添加執行路徑
添加新的別名信息來修改預設使用的Python版本$ sudo vim ~/.bashrc export PATH=$PATH:/usr/local/python3.6.3/bin
alias python='/usr/bin/python3.6.3'
- 生效配置文件
$ source .bashrc
- 查看版本:
因為上面已經添加了預設使用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
- 安裝
$ sudo apt-get install nginx # 查看版本 $ nginx -v
-
啟動 nginx
$ sudo /etc/init.d/nginx start
瀏覽器訪問:你的伺服器ip地址 如:http://45.45.162.162
出現上圖:表示成功 - 停止 nginx
$ sudo nginx -s stop
七、安裝 uWSGI
- 因為已經安裝python3所以要使用pip3進行安裝
$ pip3 install uwsgi
- 查看版本
$ uwsgi --version
- 安裝方法二:下載:
$ wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
- 解壓:
$ tar zxvf uwsgi-latest.tar.gz
八、測試
如果:有現成的項目可以把項目上傳到伺服器中,在git 管理項目,只需要 git clone 一下就可以了。
如果:你需要從本地上傳項目文件,可以用scp命令,這裡就不啰嗦用法了。總之我們將項目文件放到伺服器,然後就可以用virtualenv管理Python環境
virtualenv就不多說了。這裡直接用flask demo進行。
-
安裝虛擬環境
$ pip3 install virtualenv
-
創建一個包
$ mkdir myproject $ cd myproject
- 創建虛擬環境
(1)激活虛擬環境$ virtualenv env
(2)在虛環境中安裝flask$ source env/bin/activate
(3)退出虛環境$ pip3 install flask
(4)創建啟動文件$ deactivate
(5)寫入一個flask,埠自己進行設置。我這裡用的80埠。$ vim run.py
(6)esc+wq保存並且退出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)
- 運行這個run.py文件
(1)先停止Nginx
(2)打開你設置的埠(埠預設全部是關閉狀態)埠自行設置。$ nginx -s stop
(3)啟動flask程式$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 如果想關閉打開的埠: $ iptables -A INPUT -p tcp --dport 80 -j DROP
$ cd myproject $ python3 run.py
- 用其他電腦和手機4G訪問你的伺服器ip地址+上埠。
如:http://45.32.122.555:80/ 出現:Hello World! 那就成功了。
九、配置 Nginx
- *
(1)進入
(2)編輯default$ cd /etc/nginx/sites-enabled/
—————————————————————————————————$ vim default
(3)在最後寫入後 :wq保存並且退出# 或者直接配置 $ cd /etc/nginx $ vim nginx.conf # 不過要根據其語法來配置其實最後nginx.conf還是會調用/etc/nginx/sites-enabled/default的配置。
解析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
-
# 在項目文件根目錄新建配置文件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實例變數】 -
啟動測試
(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在後臺運行。
解釋一下上面這段話:我們在連接伺服器啟動項目後可以用瀏覽器訪問成功。但是我們一但關閉與伺服器的連接後再用瀏覽器訪問就不行了.項目是運行在前臺的也就是說.在關閉與伺服器連接的同時也關閉了伺服器的命令窗.運行在前臺的項目也同時關閉。所以我們需要把項目運行在後臺。
- 後臺啟動項目
(1)用nohup啟動:不掛斷運行命令,用"&"可以讓你的命令在後臺執行
(nohup詳細的命名參數請到官網查詢)註意:別漏了&號。
(2)關閉與伺服器的連接,然後用瀏覽器訪問你的ip地址:$ nohup uwsgi uwsgi.ini &
(3)可以通過命令把這個項目從後臺停止,查詢uwsgi的進程(linux命令不詳細說了)顯示:Hello World! 表示ok了!
找到uwsgi進程uwsgi.ini:$ ps -ef|grep uwsgi
root 7950 1 0 14:57 ? 00:00:00 uwsgi uwsgi.ini
進程id每個人都不一樣 這裡的id是7950。
(4)殺掉後臺的uwsgi進程kill -9 後面加上進程的id 或者 killall uwsgi殺掉全部同名為uwsgi的進程。
(5)再用瀏覽器去訪問ip$ kill -9 7950 $ killall uwsgi
(6)項目根目錄下會生成 nohup.out 記錄日誌瀏覽器頁面顯示:502 Bad Gateway 表示停止掉uwsgi程式的運行
十一、使用Supervisor進程監控
# Supervisor是python2寫就的一款強大的運維工具。
目前Supervisor還不支持python3。可以通過以下方法解決。
可通過pip安裝.這裡用的是python3的pip.所以會安裝失敗.使用以下.
- 首先安裝supervisor (預設由自帶的python2.7驅動)
$ apt-get install supervisor
-
進入預設配置文件(修改配置文件)
$ 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
-
創建腳本文件,生成預設配置文件.
$ cd /etc/supervisor/conf.d/ 新建app.conf文件(文件名自己定義) $ vim app.conf
-
進入編輯模式添加配置
[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解釋器去運行程式就行了。
-
使配置生效(每當修改主配置文件或增改子配置文件都需要執行使它生效)
需要先進入$ cd /etc/supervisor目錄或者項目的目錄cd myproject/才可以運行相關的命令如:supervisorctl reload等相關命令$ supervisorctl update # 因為是python3執行該命令可能會報錯 # 可以使用以下命令:重新載入配置文件 $ supervisorctl reload
-
運行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 # 停止 # 更多相關命令可以到官網上查閱這裡不消息介紹
-
以上我們只能在控制台查看運行.我們需要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
-
用瀏覽器啟動
# 輸入你的ip和埠 45.32.111.111:9001
看到上圖界面表示已經成功,之後可以通過打開Supervisor埠去監控管理你的項目一鍵啟動/停止你的項目。
——————————————————————————————————
有什麼遺漏不足的請多多指導!!!
覺得好的~點個贊打賞下咯~謝謝!!!