flask项目部署到阿里云ubuntu服务器 uwsgi+nginx

1.为什么需要服务器?

Web服务器都会使用一种叫做Web服务网关接口(Web Server Gateway Interface, WSGI)的协议,这是一种标准化的设计,它让Python应用(不局限于python)跟Web服务器能够轻松地通信。

在用flask开发web项目的时候,程序员一般使用的是由Werkzeug提供的WSGI服务器,即development环境所使用的服务器;而像java EE等并没有提供一个测试服务器,因此需要在一开始时就需要tomcat等。

 

而flask在真正部署的时候,最好不要使用测试服务器,而是使用更强健、性能更高的WSGI服务器来代替测试服务器。主流的选择是Gunicorn和uWSGI。

uWSGI是一个支持包括WSGI在内的多种不同接口的Web服务器。uWSGI可以作为应用的服务器使用,也可以处理在不同进程和线程之间进行负载均衡之类的任务。


在进行网络通信时,一般有以下两种选择以供我们选择:

直接使用socket。socket通常也称作套接字,在七层网络协议中基于传输层(TCP/UDP)通信的两端都使用一个特定的端口传输数据,传输面向的是字节流或者数据包。socket是一种“长连接”,它在传输开始前会建立连接,之后传输数据,最后关闭数据。

使用HTTP传输。HTTP基于应用层,它是一种“短连接”。客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。直接用数据包的形式将数据提交到服务器特定URL中,服务器同样用数据包的形式返回响应数据。HTTP作为非对等、主从式的传输,需要建立对应的服务器。

 

那么为什么需要一个服务器呢?

对于socket来说,服务器和客户端都是需要自己手动进行开发的,我在SDL2_net TCP服务器端和客户端的通信就是使用SDL_Net开发的服务器和客户端。

对于HTTP来说,开发一个网站,那么在运行的时候就是一个进程;如果使用的是flask,它内部使用了Werkzeug提供的测试服务器。它会监听IP:Port发来的请求,并把请求发送给路由函数,在处理之后会原路返回,所以按道理讲flask是不需要服务器就可以完成部署的;不过测试服务器毕竟只是测试使用,它在性能上有些欠缺。

使用测试服务器部署flask

而对于没有提供测试服务器的就必须要使用web服务器了,比如java ee就无法单独作为一个进程来运行,它是需要一个web服务器的。

总而言之,web服务器的作用就是监听IP:Port,然后发送请求并返回响应结果,至于负载均衡、反向代理之类的,针对的也是服务器。

 

2.登陆到远程服务器

首先,需要登陆到远程服务器。

这里推荐使用ssh,ssh的端口是22;如果ssh失败,则可能是这个端口未开启。这里使用的ssh是linux带的命令,若对此不熟悉可以使用xshell。

ssh root@IP地址

root表示以root用户登陆,IP地址改为阿里云所提供的公网IP地址,然后就会让你输入云服务器的root用户密码,若登陆成功则输出:

注意:此时是以root登陆的,操作请小心谨慎。 

3.安装Nginx

其次,需要安装nginx。

对于ubuntu来说,安装软件倒显得简单得多了:

sudo apt install nginx

 Nginx在安装成功后会默认开启服务器,此时稍微修改/etc/nginx/sites-available/default文件就可以访问Nginx所提供的网页了。

初始的server_name的值为 下划线_,把它的值改为阿里云公网的IP地址即可。

接着就可以在浏览器输入IP地址来测试Nginx所提供的默认网页了。如果无法访问,则可能是阿里云没有开启端口。

开启端口操作如下:

1.点击更多

2.选择安全组配置

3.点击配置规则

4.点击添加安全组规则

5.接着输入要开放的端口和允许的IP地址规则即可。

授权对象牵涉到IP地址和掩码的相关知识。 

4.uWSGI代替测试环境

Nginx和uWSGI算是相辅相成,如下图:

 使用Web服务器Nginx作为前端,为WSGI服务器uWSGI提供反向代理服务。反向代理服务器是这样的程序:他们接受客户端的请求,并从真正的服务器那里取得响应内容,再返回客户端,就好像数据是由代理服务器提供给客户端的一样。

总得来说,Nginx负责监听端口(默认为80)发来的请求,并把该请求转到对应端口的WSGI应用,之后在处理之后又经由Nginx返回给客户端。也就是说,uWSGI还需要和Nginx进行通信。

创建配置文件uwsgi.ini保存配置环境:

[uwsgi]
#uwsgi启动时所使用的地址与端口,端口可以使用其他端口
socket=127.0.0.1:8080

# 指向网站的项目根目录
chdir=/home/ren/ScholarDiscovery/SchoolSearch/MicroFlask

#python启动程序文件
wsgi-file=app.py

#python程序内用以启动application变量名,app = Flask(__name__)
callable=app
master=true

#处理器数目
processes=4

#线程数
threads=2

接着运行即可:

uwsgi uwsgi.ini

运行成功时输出如下:

 

此时如果提示端口已经被占用,则可以尝试换个端口或者使用kill命令杀死占用该端口的进程。

ps -aux | grep uwsgi

会列出和uwsgi相关的进程,然后使用:

kill -9 [PID]

 来杀死进程。
先使用Ctrl+c停止uWSGI的运行。

接着是nginx配置文件的修改,修改/etc/nginx/sites-available/default:

Nginx监听80端口,root为项目根目录;location则保存着uWSGI的相关配置,用以方便Nginx和uWSGI的通信。

location中用到了UWSGI_PYHOME来表示虚拟环境的路径,如果没有用到虚拟环境则可以注释掉这一句。

另外就是uwsgi_pass中的IP:port和uwsgi.ini的socket的IP:port是相同的。

然后重新启动Nginx服务:

service nginx restart

 接着需要运行uWSGI:

uwsgi uwsgi.ini

 如果需要后台运行的话,则可以使用:

uwsgi -d --ini uwsgi.ini

注:

根据uwsgi的配置文件,uwsgi会开启了四个进程,和一个父进程,所以总共会有5个和uwsgi相关的进程。

这里需要杀死的就是父进程,即:

kill -9 13489

 

5.其他问题

在实际使用中使用到了微服务nameko。

flask请求的数据由微服务来提供,所以当发送请求的时候,需要开启对应的微服务。假设我有一个微服务叫做 school,那么我需要这个微服务能脱机运行,如果使用的远程服务器的话,单纯地使用:

nameko run school &

是不行的,当你脱机的时候,这个进程就会被终止掉。解决办法是使用nohup命令:

nohup nameko run school &

 

 项目部署完成。

参考书目:《深入理解Flask》《制作自己的捕鱼达人》

参考链接:https://blog.csdn.net/weixin_39212776/article/details/81318553

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值