nginx+uwsgi+flask

為什么要使用nginx+uwsgi+flask

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

安裝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中運行它,執行命令:

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

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

或者使用curl -v?

tip:uwsig可以配置參數

(使用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

執行yum install python-devel.x86_64進行安裝

安裝成功后,python.h出現了

再次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環境

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包的內容進行gzip。

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

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

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

2.下載nginx源碼包

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

? ? 可根據不同版本下載不同的nginx

3.解壓源碼包

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

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

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

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

5.編譯并安裝

先使用./configure

? ? 然后進行編譯安裝:

1.make

2.make install

6.查找安裝路徑并將安裝路徑添加到環境變量:

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.查找安裝路徑并將安裝路徑添加到環境變量:

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處理任務完畢后進行停止。

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

查看nginx是否開啟:netstat -nutlp

如果出現了一個名為nginx:master監聽80端口就證明已經開啟

或者使用ps aux | grep nginx

如果出現nginx:worker process &?nginx: master process /usr/local/nginx/sbin/nginx

實現nginx開機自啟動

1、在系統服務目錄里創建nginx.service文件

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

添加內容入下:

[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]:服務的說明

Description:描述服務

After:描述服務類別

[Service]:服務運行參數的設置

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

ExesStart為服務的具體運行命令

ExesReload??為重啟命令

ExesStop??為停止命令

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

注意:

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

[Install]? ? 運行級別下服務安裝的相關設置,可以設置成多用戶,即系統運行級別為3

保存退出

2、設置開機啟動

systemctl enable nginx.service

3、其他命令

啟動nginx服務

systemctl start nginx.service

查看服務當前狀態

systemctl status nginx.service

重新啟動服務

systemctl restart nginx.service

查看所有已經啟動的服務

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,用來設置uwsgi相關的參數:

[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服務器的接口

pythonpath:指出項目的目錄

module:指出項目啟動模塊

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

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

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

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

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

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

ps:關于socket和http的差別。從概念上來說,socket本身不是協議,而是一種具體的tcp/ip實現方式,而http是一種協議且基于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參數

使用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??//服務器名

access_log?//服務器接受的請求日志

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

include? uwsgi_params??//導入uwsgi配置

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

uwsgi_param UWSGI_CHDIR?//項目根目錄

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

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

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

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

配置nginx.conf完成后重啟nginx

然后使用netstat -nutlp查看

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

最后訪問項目

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

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

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/"中最后的斜杠"/"都是不能去掉的,否則會出現問題。

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

查看狀態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

查看狀態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掉

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容