Python3 flask nginx uwsgi 環境搭建
阿新 • • 發佈:2018-12-17
配置專案的時候一般使用虛擬環境,是各個專案的環境獨立起來,更多方便管理。至於如何使用搜索即可,並不難
1、安裝python3
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz
xz -d Python-3.6.4.tar.xz
tar -xvf Python-3.6.4.tar
./configure --prefix=/usr/local/python3.6.4 --enable-shared CFLAGS=-fPIC
加上--enable-shared和-fPIC之後可以將python3的動態連結庫編譯出來,預設情況編譯完lib下面只有python3.xm.a這樣的檔案,python本身可以正常使用,但是如果編譯第三方庫需要python介面的比如caffe等,則會報錯;所以這裡建議按照上面的方式配置,另外如果openssl不使用系統yum安裝的,而是使用自己編譯的比較新的版本可以使用--with-openssl=/usr/local/openssl這種方式指定,後面目錄為openssl實際安裝的目錄,另外編譯完還要將openssl的lib目錄加入ld執行時目錄中即可.
make;make install;
新增軟連線
ln -s /usr/local/python3.6.4/bin/python3 /usr/bin/python3
ln -s /usr/local/python3.6.4/bin/pip3 /usr/bin/pip3
防止執行Python是提示找不到庫
cp libpython3.6m.so.1.0 /usr/lib/ /usr/lib64/
Python3安裝後導致yum不能使用,因為執行yum需要python2的版本,修改兩個檔案
vim /usr/bin/yum vim /usr/libexec/urlgrabber-ext-down 把#!/usr/bin/python 修改為 #!/usr/bin/python2
2、先安裝nginx(https://www.cnblogs.com/fwqblogs/p/10132205.html)。配置uwsgi
pip
install uwsgi
ln -s /usr/local/python3.6.4/bin/uwsgi /usr/bin/uwsgi
vim config.ini
[uwsgi]
chdir=/home/Py
pythonpath= /home/Py
#專案啟動檔案
wsgi-file = /home/Py/run.py
#為你的專案入口檔案
module=run
#例項化flask的變數 application = Flask(__name__)
callable=application
#當修改檔案內容後重啟uwsgi
py-autoreload=1
#開啟一個master程序監控專案執行
master=true
#uwsgi的埠。要與專案執行的埠一致
socket=/home/Py/flask_socket.sock
socket=127.0.0.1:5000
processes=4
#threads=2
buffer-size=65536
#允許用內嵌的語言啟動執行緒。這將允許你在app程式中產生一個子執行緒。
enable-threads=true
pidfile=/tmp/uwsgi-master.pid
uid=nginx
gid=root
#當伺服器退出的時候自動刪除unix socket檔案和pid檔案。
vacuum=true
#皇帝”模式執行。在這種模式下,它將件事uWSGI配置檔案的路徑並且為每一個它找到的檔案生成例項(‘諸侯’)。無論什麼時候一個配置檔案被修改了,皇帝都會自動重啟諸侯
emperor=true
logto=/var/log/nginx/uwsgi.log
後臺啟動
uwsgi --ini config.ini &
● 常用選項:
socket : 地址和埠號,例如:socket = 127.0.0.1:50000
processes : 開啟的程序數量
workers : 開啟的程序數量,等同於processes(官網的說法是spawn the specified number ofworkers / processes)
chdir : 指定執行目錄(chdir to specified directory before apps loading)
wsgi-file : 載入wsgi-file(load .wsgi file)
stats : 在指定的地址上,開啟狀態服務(enable the stats server on the specified address)
threads : 執行執行緒。由於GIL的存在,我覺得這個真心沒啥用。(run each worker in prethreaded mode with the specified number of threads)
master : 允許主程序存在(enable master process)
daemonize : 使程序在後臺執行,並將日誌打到指定的日誌檔案或者udp伺服器(daemonize uWSGI)。實際上最常用的,還是把執行記錄輸出到一個本地檔案上。
pidfile : 指定pid檔案的位置,記錄主程序的pid號。
vacuum : 當伺服器退出的時候自動清理環境,刪除unix socket檔案和pid檔案(try to remove all of the generated file/sockets)
disable-logging : 不記錄請求資訊的日誌。只記錄錯誤以及uWSGI內部訊息到日誌中。如果不開啟這項,那麼你的日誌中會大量出現這種記錄:
[pid: 347|app: 0|req: 106/367] 117.116.122.172 () {52 vars in 961 bytes} [Thu Jul 7 19:20:56 2016] POST /post => generated 65 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)
配置nginx
location /{
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
uwsgi_param UWSGI_PYHOME /usr/bin/python; #也可對應虛擬環境
uwsgi_param UWSGI_CHDIR /home/Py;
uwsgi_param UWSGI_SCRIPT run:application;
}
有一個index路由時,
直接訪問 http://192.168.164.128/index/
有定義路由字首home時
http://192.168.164.128/home/index/
最後如果有多個專案的話 如果用域名到很簡單配置多個nginx server 和uwsgi就可以
下面將配置使用ip訪問不同專案
假如我有兩個專案 分貝在 Py1 和 Py2
匹配該路徑下的專案 重定向到81埠 定義81埠的專案uwsgi配置 一個專案對應一個uwsgi配置
location /Py1/{
proxy_pass http://127.0.0.1:81/;
}
server{
listen 81;
server_name localhost;
location /{
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
uwsgi_param UWSGI_PYHOME /usr/bin/python;
uwsgi_param UWSGI_CHDIR /home/Py1;
uwsgi_param UWSGI_SCRIPT run:application;
}
}
location /Py2/{
proxy_pass http://127.0.0.1:82/;
}
server{
listen 82;
server_name localhost;
location /{
include uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
uwsgi_param UWSGI_PYHOME /usr/bin/python;
uwsgi_param UWSGI_CHDIR /home/Py2;
uwsgi_param UWSGI_SCRIPT run:application;
}
}