1. 程式人生 > >Python3 flask nginx uwsgi 環境搭建

Python3 flask nginx uwsgi 環境搭建

配置專案的時候一般使用虛擬環境,是各個專案的環境獨立起來,更多方便管理。至於如何使用搜索即可,並不難 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; } }