注:每個機器,軟體版本可能不一樣,雖然網上有很多類似的帖子,但是我在搭建的時候遇到了不少的坑,此文僅供參考。
請求流程:
1、安裝uwsgi
uwsgi是一個應用伺服器,非靜態檔案的網路請求就必須通過他完成,他也可以充當靜態檔案伺服器,但不是他的強項。uwsgi是使用python編寫的,因此通過`pip install uwsgi`就可以了。(uwsgi必須安裝在系統級別的Python環境中,不要安裝到虛擬環境中)。
pip install uwsgi
測試uwsgi是否安裝正確:建立一個test.py的測試檔案
# test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 #return ["Hello World"] # python2
啟動uwsgi服務:
uwsgi --http :8000 --wsgi-file test.py
訪問頁面可以看到 Hello World ,標識uwsgi安裝成功。
2、安裝nginx
nginx是一個web伺服器。用來載入靜態檔案和接收http請求的。
yum install nginx
預設安裝完nginx是不會自動啟動的:常用命令:
* 啟動nginx:service nginx start
* 關閉nginx:service nginx stop
* 重啟nginx:service nginx restart
nginx預設埠為80埠,瀏覽器訪問地址看到如下顯示則標識nginx安裝成功了。
——修改nginx預設的80埠。
找到default.conf配置檔案
直接修改對於埠就行了,修改完畢之後記得重啟nginx生效。
3、配置uwsgi
在專案根目錄建立***_uwsgi.ini 檔案,基礎配置資訊如下
[uwsgi] chdir=/srv/cms # 專案根目錄 module=manage # 專案啟動指令碼名字 wsgi-file=/srv/cms/manage.py # flask啟動指令碼的具體檔案 callable=app # 程式內的application變數名 home=/root/.virtualenvs/cms-env-py3 # 虛擬環境的具體路徑 socket=127.0.0.1:5001 # socket 協議,用於和nginx通訊 deamonize=/srv/cms/logs/cms-uwsgi.log # 日誌檔案 master=true # 主程式 processes=2 # 最大工作程式 threads=1 # 執行緒數量
關於socket和http的差別。從概念上來說,socket本身不是協議而是一種具體的TCP/IP實現方式,而HTTP是一種協議且基於TCP/IP。具體到這個配置這裡來,如果我只配了socket = 127.0.0.1:5001的話,通過瀏覽器或者其他HTTP手段是無法成功訪問的。而在uwsgi這邊的日誌裡會提示請求包的長度超過了最大固定長度。另一方面,如果配置的是http = 127.0.0.1:5001的話,那麼就可以直接通過一般的http手段來訪問到目標。但這會引起nginx無法正常工作。
正確的做法應該是:
如果有nginx在uwsgi之前作為代理的話應該配socket 如: socket=127.0.0.1:5001
而如果想讓請求直接甩給uwsgi的話那麼就要配http。 如: http=127.0.0.1:5001
4、配置nginx
進入nginx的conf.d路徑新建一個**.conf的配置檔案。
配置資訊如下:
server { # 監聽埠 listen 5000; # 允許訪問的域名或IP,本機IP server_name 10.0.36.112; charset utf-8; access_log /srv/cms/logs/access.log; # 日誌檔案 error_log /srv/cms/logs/error.log; # 錯誤日誌檔案 # 最大上傳檔案大小 client_max_body_size 75M; # 靜態檔案URL location /static { # 檔案路徑 alias /srv/cms/static; } # 非靜態檔案伺服器 location / { include uwsgi_params; # 引入uwsgi配置 uwsgi_pass 127.0.0.1:5001; # uwsgi的配置檔案裡的socket對應 uwsgi_param UWSGI_CHDIR /srv/cms; # 專案根路徑 uwsgi_param UWSGI_SCRIPT manage:app; # 啟動的主程式 } }
檢查配置檔案是否正常
# ervice nginx configtest
5、啟動nginx服務
# service nginx start
6、啟動uwsgi服務
# uwsgi --ini cms_uwsgi.ini
到這裡,伺服器搭建完成。
備註:
uwsgi 常用命令:
uwsgi --ini cms_uwsgi.ini //啟動 uwsgi cms_uwsgi.ini --deamonize //後臺執行啟動 uwsgi --stop uwsgi.pid //停止服務 uwsgi --reload uwsgi.pid //可以無縫重啟服務
nginx+uwsgi+flask成功執行了。