uWSGI+Nginx+Flask在CentOS 7下的安裝使用
一、建立虛擬環境
Python 3 內建了用於建立虛擬環境的 venv 模組。
-
mkdir一個喜歡的路徑python_project資料夾,然後建立並激活py3,處於py3字首下
-
建立虛擬環境py3:
python3 -m venv py3
-
進入py3 : source py3/bin/activate (py3) ➜ python -V
Python 3.6.1句首會一直顯示(py3)…代表已經處於py3環境了> Python 3.6.1句首會一直顯示(py3)…代表已經處於py3環境了
- 想退出,輸入
deactivate
二、flask
1. 安裝flask
pip3 install flask
pip3 list一下,list結果中一定要有flask等好幾個依賴包才行!檢查虛擬環境裡可能沒有真正裝入!
2. 首先要有一個flask應用
參考文獻:Ubuntu安裝配置uWSGI Nginx部署Flask專案
https://www.centos.bz/2017/08/ubuntu-install-uwsgi-nginx-flask/
在python_project裡寫一個hello.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000,debug=True)
再寫一個啟動檔案run.py
(其實也可以不寫。。)
from hello import app
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000,debug=True)
3. 直接執行一下看看(因為Flask內建了伺服器)
cd到run.py的目錄,再執行 python3 run.py即可啟動Flask內建伺服器,然後在Linux中火狐輸入0.0.0.0:5000 ,即可訪問!
或者在Mac宿主機訪問10.211.55.4:5000
然後就可以ctrl+c給暫停了。。我們繼續下面的步驟。。
X. 中間出的一點小問題:
發現在Linux的火狐中訪問localhost:5000可以成功顯示
但在宿主機Mac中用Chrome訪問 10.211.55.4:5000,無法訪問此網站
Google一下解決了:
說要關閉centos的防火牆:
systemctl stop firewalld.service
Mac的防火牆也要在“隱私與安全性”裡關閉,不過預設就是關著的。
但還是不行。於是我在Mac上開了tomcat,訪問mac的8080埠可顯示內容。
這個過程是雙向伺服器測試,哈哈哈哈。
發現Linux可訪問Mac的tomcat,10.211.55.2:8080
蛋疼,繼續google,
找到了一個python自帶的伺服器測試程式碼:
python -m SimpleHTTPServer 8080
在Linux上開啟了一個伺服器,用8080可訪問。
然後再Mac上可以成功訪問 10.211.55.4:8080 !!賊幾把激動,這說明mac還是可以訪問通Linux的
這時候主要矛盾就轉化為:可以訪問虛擬機器的8080等埠,唯獨5000訪問不了。大概率是Flask出了問題
最終發現問題:
hello.py
和run.py
都要改一下,不能設定為空app.run(),而是要寫0.0.0.0,給寫死!:
app.run(host='0.0.0.0',port=5000,debug=True)
然後Mac終於可以訪問Linux上的flask,用10.211.55.4:5000!!嗨的一匹。
Y. 還有一招,用外網通過NAT埠對映,訪問Linux的Web伺服器
開啟PD虛擬機器偏好設定的NAT後,使得宿主機Mac的65531埠直接對應Linux虛擬機器的5000埠,對齊!
這樣外網任何一臺手機電腦用瀏覽器輸入 192.168.31.106:65531 (訪問的是宿主機的公網IP,查一下WiFi就可得到),即轉換為Linux的5000埠,即可訪問Flask伺服器!實現全網通用伺服器!!!
三、uwsgi
1. 安裝uwsgi
Uwsgi 需要一些其他環境的支援,因此在安裝 Uwsgi 前要把先行條件準備好:
yum -y install gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel GeoIP gd libXpm libxslt sqlite-devel
完成之後,再使用下面語句安裝 Uwsgi。
pip3 install uwsgi
2. 先小用一下uwsgi玩玩:
安裝後執行:
uwsgi --socket 0.0.0.0:5000 --protocol=http -w run:app
protocol說明使用 http 協議,-w指明瞭要啟動的模組,run就是專案啟動檔案run.py去掉副檔名,app是run.py檔案中的變數app,即Falsk 例項
然後訪問 10.211.55.4:5000,同樣會執行成功!說明uwsgi正常。(剛才是用python3啟動,這次是用uwsgi啟動)
3. 配置uwsgi
但是這樣的話每次都從命令列啟動太麻煩,可以在 /myproject目錄下建立一個配置檔案 uwsgi.ini
:
[uwsgi]
socket = 0.0.0.0:5000
chdir = /home/zhang/my_project/python_project
wsgi-file = run.py
callable = app
processes = 4
threads = 2
buffer-size=32768
stats = 127.0.0.1:9191
Uwsgi可以正常開啟,但一用Chrome訪問,就會出現:
invalid request block size: 21573 (max 4096)…skip
大概意思就請求block是超過最大值了唄,果斷Google,得到如下方法:
在uWSGI.ini 裡,加入一行:
buffer-size=32768
X. 兩個沒有試過的sock, log
(第一次配置沒有用下面兩個檔案,以後可以試試:
建立Log,socket的檔案路徑:
1、建立log/logofzjz.log檔案。
2、不過,socket只建立到sock資料夾即可,myproject.sock檔案會自動建立,sock檔案用來傳遞uwsgi和nginx的中間資訊)
- 啟動一下uwsgi試試
啟動uwsgi :
uwsgi uwsgi.ini
沒有什麼作用,看著正常就可以Ctrl+C中斷了
四、nginx
1. 安裝nginx
參考文章:CentOS 7 用 yum 安裝 Nginx
https://chaishiwei.com/blog/1281.html
步驟如下:
1、在 CentOS 7 中,直接使用 yum 安裝 Nignx 會提示無下載源。因此需要新增 Nginx 的下載源:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2、指定了下載源後,就可以使用 yum 命令來安裝 Nginx 了:
sudo yum install -y nginx
3、輸入開啟命令:
sudo nginx
即可在Linux的火狐中執行localhost,得到官方歡迎介面!!!
或者在Mac瀏覽器中輸入10.211.55.4,也可得到官方歡迎介面!!!
(因為nginx預設使用80埠,HTTP協議埠~ 所以任何單一輸入IP(例如只輸入 192.168.31.106,不輸入埠號)的,都會轉接至80埠)
2. 配置Nginx
參考文章:在伺服器上簡單配置flask+uwsgi+nginx(只是可工作~嘿)
https://blog.csdn.net/werewolf_st/article/details/49206051
其中這個階段總共就三個檔案:
1、uwsgi.ini
(前面已經編輯過了)
2、nginx.conf
(原裝檔案,nginx資料夾內)
3、nginx.conf
(自建的python_project資料夾內,然後生成了個快捷方式在vhost中)
在自己python_project資料夾下,vi一個nginx.conf
檔案,作為與uwsgi連線的配置:
server{
listen 80;
server_name 0.0.0.0;
location /{
include uwsgi_params;
uwsgi_pass 0.0.0.0:5000;
uwsgi_param UWSGI_CHDIR /home/zhang/my_project/python_project;
uwsgi_param UWSGI_SCRIPT run:app;
}
}
在/etc/nginx/
目錄中,新建目錄:conf/vhost/
vi一下系統原有的etc/nginx/nginx.conf
檔案,然後http{}大括號裡面的最後一行新增
include /etc/nginx/conf/vhost/*.conf;
同時刪掉原來的 include /etc/nginx/conf.d/*.conf; 指令
(即棄置原裝conf.d/default.conf的配置資訊了)
接下來,把自己python_project中的nginx.conf
生成一個快捷方式,加到 vhost中,即執行:
sudo ln -s /home/zhang/my_project/python_project/nginx.conf /etc/nginx/conf/vhost
搞完就會發現。/etc/nginx/conf/vhost資料夾內會新增一個nginx.conf
,這個就是快捷方式啦。
X. 中間的一些小問題:
配置時,sock用sock檔案,老出問題。。。比如說埠已被佔用,還查不出來是哪個程序。([emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use))
所以我Google了一些方案:
檢視某埠的佔用
netstat -lnp|grep 5000
殺死程序號6640
kill -9 6640
sudo fuser -k 80/tcp
殺死佔用80埠的沒有程序號的空程序~
當然,這個80佔用問題。。。我最後是通過解除安裝重灌nginx的玄學方法搞得。。然後就不會出現這個了。
完全解除安裝nginx的流程:
sudo rm -rf /etc/nginx/
sudo rm -rf /usr/sbin/nginx
sudo rm /usr/share/man/man8/nginx.8.gz
yum remove nginx
五、全部給老子跑起來!!
1. 啟動uwsgi
uwsgi uwsgi.ini
2. 啟動 sudo nginx
sudo nginx
然後會沒有任何反應…即代表成功。
這個時候訪問虛擬機器ip地址 10.211.55.4即可
3. 開啟關閉命令
開啟
sudo nginx
關閉
sudo pkill -9 nginx
開啟
uwsgi uwsgi.ini
關閉
sudo pkill -9 uwsgi