為什么要使用nginx+uwsgi+flask
因為標準python只能是單線程针余,無法并發(fā),而uwsgi/gunicorn通過多進程池達成了并發(fā)主到。
安裝uwsgi之前先安裝python-devel(centos下)
使用pip install uwsgi阴挣,即可安裝uwsgi
使用命令find / -name uwsgi可以查看uwsgi的地點
使用uwsgi --version可以查看uwsgi的版本
2.0.17.1
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/b
能夠訪問
需要這樣操作:
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掉
然后訪問項目的地址即可。