1. 程式人生 > >uWSGI+Nginx+Flask在CentOS 7下的安裝使用

uWSGI+Nginx+Flask在CentOS 7下的安裝使用

流程

一、建立虛擬環境

Python 3 內建了用於建立虛擬環境的 venv 模組。

  1. mkdir一個喜歡的路徑python_project資料夾,然後建立並激活py3,處於py3字首下

  2. 建立虛擬環境py3:python3 -m venv py3

  3. 進入py3 : source py3/bin/activate (py3) ➜ python -V

Python 3.6.1句首會一直顯示(py3)…代表已經處於py3環境了> Python 3.6.1句首會一直顯示(py3)…代表已經處於py3環境了

  1. 想退出,輸入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.pyrun.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的中間資訊)

  1. 啟動一下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