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應用,并保存在"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復制到/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é)議停团,并提供了豐富的應用程序供測是或其它目的的使用掏熬。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的配置應該合理欺缘,太小會使得處理性能不好而太大則會給服務(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之前作為代理的話應該配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??//導入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的話苇本,就會導致雖然啟動順利,但是發(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配置就應該得是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會查到兩條

(分別對應的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會查到兩條

(分別對應的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)系作者
  • 序言:七十年代末尿贫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匾乓,更是在濱河造成了極大的恐慌又谋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剩愧,居然都是意外死亡娇斩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門锦积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉嗓,“玉大人,你說我怎么就攤上這事鉴分。” “怎么了橙垢?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵伦糯,是天一觀的道長敛纲。 經(jīng)常有香客問我,道長淤翔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任辞做,我火速辦了婚禮,結(jié)果婚禮上稚补,老公的妹妹穿的比我還像新娘框喳。我一直安慰自己,他們只是感情好五垮,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布放仗。 她就那樣靜靜地躺著,像睡著了一般莉撇。 火紅的嫁衣襯著肌膚如雪惶傻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天银室,我揣著相機與錄音,去河邊找鬼巡李。 笑死扶认,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的狱从。 我是一名探鬼主播叠纹,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼与涡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驼卖,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酌畜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桥胞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贩虾,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年伊群,在試婚紗的時候發(fā)現(xiàn)自己被綠了屁使。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奔则。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖酬蹋,靈堂內(nèi)的尸體忽然破棺而出抽莱,到底是詐尸還是另有隱情,我是刑警寧澤食铐,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布虐呻,位于F島的核電站,受9級特大地震影響斟叼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忽孽,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厘线。 院中可真熱鬧瘾腰,春花似錦、人聲如沸蹋盆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽析藕。三九已至,卻和暖如春竞慢,著一層夾襖步出監(jiān)牢的瞬間治泥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工败潦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留准脂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓沟饥,卻偏偏與公主長得像湾戳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子院塞,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容