nginx+uwsgi+flask

為什么要使用nginx+uwsgi+flask

因為標準python只能是單線程,無法并發(fā),而uwsgi/gunicorn通過多進程池達成了并發(fā)。

安裝uwsgi

安裝uwsgi之前先安裝python-devel(centos下)

使用pip install uwsgi,即可安裝uwsgi

使用命令find / -name uwsgi可以查看uwsgi的地點

使用uwsgi --version可以查看uwsgi的版本

2.0.17.1

uwsgi有多種配置可用:

1.ini

2.xml

3.json

4.yaml

測試uwsgi

首先寫一個hello world的wsgi應(yīng)用,并保存在"server.py"文件中:

def?application(environ, start_response):

?? ?status?=?'200 OK'

?? ?output?=?'Hello World!'

?? ?response_headers?= [('Content-type',?'text/plain'),

?? ?('Content-Length', str(len(output)))]

?? ?start_response(status, response_headers)

?? ?return?[output]

然后在uwsgi中運行它,執(zhí)行命令:

uwsgi --http :9090 --wsgi-file server.py

然后打開瀏覽器,訪問"http://localhost:9090",就可以看到'hello world!'

或者使用curl -v?

tip:uwsig可以配置參數(shù)

(使用pip install uwsgi可能會報錯:

?????#include <Python.h>

????????????????????????^

????compilation terminated.

解決方法:

找不到python.h,這是因為沒有安裝python-dev

使用yum search python | grep devel

找到可用版本:

python-devel.x86_64 : The libraries and header files needed for Python

?? ??? ??? ??? ??? ??? ??? ??? ?? ?: development

執(zhí)行yum install python-devel.x86_64進行安裝

安裝成功后,python.h出現(xiàn)了

再次pip install uwsgi即可

如果pip安裝uwsgi后沒有找到uwsgi(使用不了),使用指令:

find / -name uwsgi

如果只有一個/usr/local/python3/bin/uwsgi

可以把/usr/local/python3/bin/uwsgi復(fù)制到/usr/local/bin/uwsgi

(還有一種方法是,使用pip下載完uwsgi然后再使用yum下載uwsgi,使用find / -name uwsgi,將yum的uwsgi軟連接到pip的uwsgi,之后直接使用uwsgi就可以使用)

刪除uwsgi的方法:

如果是yum刪除uwsgi的話就是:yum remove uwsgi

如果是pip刪除uwsgi的話就是:pip uninstall uwsgi

然后再使用命令fins / -name uwsgi,將找到的uwsgi刪除

安裝nginx(centos)

1.檢查并安裝所需的依賴軟件

? ? 1.gcc: nginx編譯依賴gcc環(huán)境

centos 安裝命令:yum install gcc-c++

? ? 2.pcre: (perl compatible regular expressions)是一個perl庫,包括perl兼容的正則表達式庫。nginx的http模塊使用pcre來解析正則表達式。

centos 安裝命令:yum install -y pcre pcre-devel

? ? 3.zlib:?該庫提供了很多中壓縮和解壓縮的方式,nginx使用zlib對http包的內(nèi)容進行g(shù)zip。

centos 安裝命令:yum install -y zlib zlib-devel

?? ?4.openssl:?一個強大安全套接字層密碼庫,囊括了主要的密碼算法、常用的密鑰和證書封裝管理功能以及SSL協(xié)議,并提供了豐富的應(yīng)用程序供測是或其它目的的使用。nginx不僅支持http協(xié)議,還支持https(即在ssl協(xié)議上傳輸?shù)膆ttp)

centos 安裝命令:yum install -y openssl openssl-devel

2.下載nginx源碼包

????下載命令:wget?http://nginx.org/download/nginx-1.12.0.tar.gz

? ? 可根據(jù)不同版本下載不同的nginx

3.解壓源碼包

????1.解壓:tar -zxvf nginx-1.12.0.tar.gz

????2.進入解壓后的文件夾:cd nginx-1.12.0

4.配置編譯參數(shù)命令:(可以使用./configure --help查詢詳細參數(shù))

安裝之前需要手動創(chuàng)建上面指定的nginx文件即/var/temp、/var/temp/nginx、/var/run/nginx文件夾,否則會啟動時報錯

5.編譯并安裝

先使用./configure

? ? 然后進行編譯安裝:

1.make

2.make install

6.查找安裝路徑并將安裝路徑添加到環(huán)境變量:

1.whereis nginx(查出nginx的安裝路徑)

2.vim ~/.bashrc加上一句export PATH=$PATH:/usr/local/nginx/sbin/

? ??(路徑即為whereis?找到的路徑)

3.source ~/.bashrc(保存退出)

安裝nginx(ubuntu)

1.檢查并安裝所需的依賴軟件

? ? 1.安裝gcc g++的依賴庫

? ? ????sudo?apt-get?install?gcc

? ? ????sudo apt-get?install?build-essential?-y

? ? ????sudo apt-get install libtool

? ? 2.安裝pcre依賴庫

? ? ????sudo apt-get update

? ? ????sudo?apt-get install?libpcre3 libpcre3-dev

? ??????apt-get?install?libncurses5-dev?libncursesw5-dev?libreadline6-dev?-y

????????apt-get?install?libdb5.3-dev?libgdbm-dev?libsqlite3-dev?libssl-dev?-y

? ? 3.安裝zlib依賴庫

? ? ????sudo apt-get install zliblg-dev

? ? ? ? sudo?apt-get?install?libbz2-dev?libexpat1-dev?liblzma-dev?zlib1g-dev?-y

? ? 4.安裝ssl依賴庫

?????????sudo apt-get install openssl

2.下載nginx源碼包

下載命令:wget?http://nginx.org/download/nginx-1.13.6.tar.gz

3.解壓源碼包

? ? tar -zxvf nginx-1.13.6.tar.gz

? ? cd nginx-1.13.6

4.編譯

?? ?./configure --prefix=/usr/local/nginx

? ? make

? ? sudo make install

5.開啟nginx

? ? sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

? ? 注意:-c指定配置文件的路徑,不加的話,nginx會自動加載默認路徑的配置文件,可以通過-h查看幫助命令。

6.查找安裝路徑并將安裝路徑添加到環(huán)境變量:

1.whereis nginx(查出nginx的安裝路徑)

2.vim ~/.bashrc加上一句export PATH=$PATH:/usr/local/nginx/sbin/

? ??(路徑即為whereis?找到的路徑)

3.source ~/.bashrc(保存退出)

ps:

然后就可以直接使用命令:

啟動/停止nginx

nginx

nginx -s stop

nginx -s quit

nginx -s reload

nginx -s quit:此方法停止步驟是待nginx處理任務(wù)完畢后進行停止。

nginx -s stop:此方法相當于先查出nginx進程id再使用kill命令強制殺掉進程。

查看nginx是否開啟:netstat -nutlp

如果出現(xiàn)了一個名為nginx:master監(jiān)聽80端口就證明已經(jīng)開啟

或者使用ps aux | grep nginx

如果出現(xiàn)nginx:worker process &?nginx: master process /usr/local/nginx/sbin/nginx

實現(xiàn)nginx開機自啟動

1、在系統(tǒng)服務(wù)目錄里創(chuàng)建nginx.service文件

vim?/lib/systemd/system/nginx.service

添加內(nèi)容入下:

[Unit]

Description=nginx

After=network.target


[Service]

Type=forking

ExecStart=/usr/local/nginx/sbin/nginx

ExecReload=/usr/local/nginx/sbin/nginx -s reload

ExecStop=/usr/local/nginx/sbin/nginx -s quit

PrivateTmp=true


[Install]

WantedBy=multi-user.target

tip:添加文件的說明

[Unit]:服務(wù)的說明

Description:描述服務(wù)

After:描述服務(wù)類別

[Service]:服務(wù)運行參數(shù)的設(shè)置

Type:forking? ? 是后臺運行的形式

ExesStart為服務(wù)的具體運行命令

ExesReload??為重啟命令

ExesStop??為停止命令

Private Tmp = True??表示給服務(wù)分配獨立的臨時空間

注意:

[Service]?? ?的啟動、重啟、停止命令全部要求使用絕對路徑

[Install]? ? 運行級別下服務(wù)安裝的相關(guān)設(shè)置,可以設(shè)置成多用戶,即系統(tǒng)運行級別為3

保存退出

2、設(shè)置開機啟動

systemctl enable nginx.service

3、其他命令

啟動nginx服務(wù)

systemctl start nginx.service

查看服務(wù)當前狀態(tài)

systemctl status nginx.service

重新啟動服務(wù)

systemctl restart nginx.service

查看所有已經(jīng)啟動的服務(wù)

systemctl list-units --type=service

停止開機自啟動

systemctl disable nginx.service

nginx啟動或者重啟失敗的原因

1.因為配置文件出錯:

可以使用nginx-t方法查看配置文件出錯的地方

也可以用過查看nginx日志文件定位到nginx重啟失敗的原因,nginx日志文件的路徑一般在:/var/log/nginx下

2.端口被占用

可以通過查看電腦端口的使用情況? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

netstat -aon | findstr ":80"? ?? ??? ??? ??? ?windows下

firewall-cmd --query-port=80/tcp? ? ?linux下

ps:如果使用wget下載的nginx,如果想要刪除直接使用命令:

find / -name nginx

將列出的都刪除掉

部署flask項目

當安裝好uwsgi &?nginx以后就可以使用它們部署flask

1.首先在項目中新建一個配置文件uwsgiconfig.ini,用來設(shè)置uwsgi相關(guān)的參數(shù):

[uwsgi]

socket =?127.0.0.1:5051

pythonpath =?/home/zt/loan_app_indonesia

module =?manage

wsgi-file =?/home/zt/loan_app_indonesia/manage.py

callable =?app

processes =?4

threads =?2

daemonize =?/home/zt/loan_app_indonesia/server.log

tip:配置文件中的各字段的意義

socket:指出了一個套接字,相當于為外界留出一個uwsgi服務(wù)器的接口

pythonpath:指出項目的目錄

module:指出項目啟動模塊

wsgi-file:指出了真正的腳本文件名

callable:指出的是具體執(zhí)行.run方法的那個實體的名字,一般而言都是app = Flask(__name__)

processes:指出啟動uwsgi服務(wù)器之后,服務(wù)器會打開幾個并行的進程

threads:指出每個進程會開幾條線程來等待處理請求

(注意:processes & threads的配置應(yīng)該合理,太小會使得處理性能不好而太大則會給服務(wù)器本身帶來很大困擾)

daemonize:表示把uwsgi服務(wù)器作為后臺進程啟動,其值指向一個文件表明后臺中的所有輸出都重定向到這個日志中。

ps:關(guān)于socket和http的差別。從概念上來說,socket本身不是協(xié)議,而是一種具體的tcp/ip實現(xiàn)方式,而http是一種協(xié)議且基于tcp/ip。具體到配置,如果只配了socket = 127.0.0.1:5051,通過瀏覽器

或者其他http手段是無法訪問成功的。而在uwsgi的日志里面會提示請求包的長度超過了最大固定長度。另一方面,如果配置的是http = 127.0.0.1:5051的話,那么就可以通過一般的http手段來訪問目標。但這樣會引起nginx無法正常工作。正確的做法是:如果有nginx在uwsgi之前作為代理的話應(yīng)該配socket,如果想讓請求直接甩給uwsgi的話就要配http。

使用命令uwsgi uwsgiconfig.ini

[uWSGI] getting INI configuration from uwsgiconfig.ini

然后使用netstat -nutlp查看

tcp????????0??????0 127.0.0.1:5051??????????0.0.0.0:*???????????????LISTEN??????70711/uwsgi

也可以使用ps aux | grep uwsgi查看

root??????70711??0.0??1.3 355740 52280 ?????????Sl???15:51???0:01 uwsgi uwsgiconfig.ini

root??????70713??0.0??1.2 355484 49028 ?????????Sl???15:51???0:00 uwsgi uwsgiconfig.ini

root??????70714??0.0??1.2 355476 48820 ?????????Sl???15:51???0:00 uwsgi uwsgiconfig.ini

root??????70716??0.0??1.2 356176 49516 ?????????Sl???15:51???0:00 uwsgi uwsgiconfig.ini

root??????72114??0.0??0.0 112704???972 pts/7????S+???16:18???0:00 grep --color=auto uwsgi

如果配置了daemonize的話可以查看日志

tip:使用killall -9 uwsgi可以終止守護進程

(注意:在centos下如果沒有killall命令就用yum install psmisc)

2.配置nginx參數(shù)

使用find / -name nginx.conf

/usr/local/bin/nginx-1.12.0/conf/nginx.conf

/usr/local/nginx/conf/nginx.conf

然后vim?/usr/local/nginx/conf/nginx.conf修改配置

????server {

listen7777;

server_namelocalhost;

access_log?/home/zt/loan_app_indonesia/access.log;

error_log?/home/zt/loan_app_indonesia/error.log;

????????#charset koi8-r;

????????#access_log??logs/host.access.log??main;

????????location / {

???????????# root???html;

????????????include uwsgi_params;

uwsgi_pass?127.0.0.1:5051;

uwsgi_param UWSGI_CHDIR?/home/zt/loan_app_indonesia;

uwsgi_param UWSGI_SCRIPT?manage:app;

????????????#index??index.html index.htm;

????????}

配置的解釋:

listen//web訪問的端口

server_name??//服務(wù)器名

access_log?//服務(wù)器接受的請求日志

error_log//錯誤日志(nginx部分中發(fā)生的錯誤)

include? uwsgi_params??//導(dǎo)入uwsgi配置

uwsgi_pass??//需要和uwsgi配置文件中的socket地址相同

uwsgi_param UWSGI_CHDIR?//項目根目錄

uwsgi_param UWSGI_SCRIPT//啟動項目的主程序

這樣配置完,當外部有一個7777端口的請求發(fā)送到本機后,先讓nginx處理。nginx進行一些處理之后轉(zhuǎn)發(fā)給配置的uwsgi_pass地址,傳給uwsgi處理。再由uwsgi來調(diào)用項目中的代碼處理請求返回。

(如果僅僅配置了一個http而沒有配置socket的話,就會導(dǎo)致雖然啟動順利,但是發(fā)請求給7777端口超時)

注意:如果uwsgi直接通過http方式對外提供服務(wù),那么nginx中需要配置proxy_pass,指出http服務(wù)具體套接字,從而實現(xiàn)請求的轉(zhuǎn)發(fā)。而如果將uwsgi配置為socket,通過socket對外提供服務(wù)(由于socket不涉及具體的協(xié)議,外部沒法直接通過uwsgi端口訪問服務(wù)也更加安全一點。比如可以在nginx中配置一些url的拒接防止sql注入之類等等...),那么nginx配置就應(yīng)該得是uwsgi_pass來實現(xiàn)請求的轉(zhuǎn)發(fā)。proxy_pass配置的時候?qū)慼ttp://,即表示是走http協(xié)議的;uwsgi_pass的時候未指出協(xié)議,表示走socket。

配置nginx.conf完成后重啟nginx

然后使用netstat -nutlp查看

tcp????????0??????0 0.0.0.0:7777????????????0.0.0.0:*???????????????LISTEN??????71733/nginx: master

最后訪問項目

ps:在一個nginx服務(wù)器上配置多個訪問站點的方法

當客戶需要使用一個nginx服務(wù)器,訪問多個不同的站點,例如使用:

http://localhost/a

能夠訪問

http://www.baidu.com

使用:

http://localhost/b

能夠訪問

http://www.163.com

需要這樣操作:

server{

?? ?? ? location /a/ {

?? ??? ?? ? proxy_pass http://www.baidu.com/;

?? ??? ?}

?? ?? ? location /b/{

?? ??? ?? ? proxy_pass http://www.163.com/;

?? ?? ? }

?? ?}

需要注意的是:"/a/"、"/b/"中最后的斜杠"/",以及"http://www.baidu.com/"、"http://www.163.com/"中最后的斜杠"/"都是不能去掉的,否則會出現(xiàn)問題。

配置后使用systemctl restart nginx.service & nginx -s reload

查看狀態(tài)systemctl status nginx.service

ps:在nginx上同一域名不同端口部署多個項目

在nginx.conf中配置兩個server

????server {

listen7776;

server_namelocalhost;

access_log?/home/zt/test_app/access.log;

error_log?/home/zt/test_app/error.log;

????????location / {

????????????include uwsgi_params;

uwsgi_pass?127.0.0.1:5053;

uwsgi_param UWSGI_CHDIR?/home/zt/test_app;

uwsgi_param UWSGI_SCRIPT?main:app;

????????}

????????error_page???500 502 503 504??/50x.html;

????????location = /50x.html {

????????????root???html;

????????}

???}


?? ?server {

listen7777;

server_namelocalhost;

access_log?/home/YHJ/creditech_navigation1/access.log;

error_log?/home/YHJ/creditech_navigation1/error.log;

????????location / {

????????????include uwsgi_params;

uwsgi_pass?127.0.0.1:5052;

uwsgi_param UWSGI_CHDIR?/home/YHJ/creditech_navigation1;

uwsgi_param UWSGI_SCRIPT?manage:app;

????????}

????????error_page???500 502 503 504??/50x.html;

????????location = /50x.html {

????????????root???html;

????????}

???}

配置后使用systemctl restart nginx.service & nginx -s reload

查看狀態(tài)systemctl status nginx.service

使用命令netstat -nutlp | grep nginx會查到兩條

(分別對應(yīng)的nginx兩個端口7776&7777)

tcp????????0??????0 0.0.0.0:7776????????????0.0.0.0:*???????????????LISTEN??????11610/nginx: master

tcp????????0??????0 0.0.0.0:7777????????????0.0.0.0:*???????????????LISTEN??????11610/nginx: master

使用命令netstat -nutlp | grep uwsgi會查到兩條

(分別對應(yīng)的uwsgi兩個端口5052&5053)

tcp????????0??????0 127.0.0.1:5052??????????0.0.0.0:*???????????????LISTEN??????19719/uwsgi?????????

tcp????????0??????0 127.0.0.1:5053??????????0.0.0.0:*???????????????LISTEN??????19670/uwsgi????

多個項目也是如出一轍,增加server就可以

注意:

如果使用killall -9 uwsgi就會把所有的uwsgi kill掉

然后訪問項目的地址即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容