Nginx+uWSGI+Flask服务部署

本地计算机上的开发服务器(本地计算机开发和运行Flask应用程序)只能在设置了开发环境的计算机上访问,这是一种默认行为,

因为在debug模式下,用户可以在计算机上修改的任意代码服务器都可以重新加载。

如果禁用了debug,则可以通过将主机名设置为’0.0.0.0’,使本地计算机上的开发服务器可供网络上的用户使用。

app.run(host = ’0.0.0.0’),这时操作系统将侦听所有公共IP。

但要从开发环境切换到成熟的生产环境,需要在真实的Web服务器上部署应用程序。

一、网络架构:
在这里插入图片描述
调用流:当客户端发送服务请求时,若使用nginx作为代理服务器的话,先转为nginx服务器处理,然后再转给uwsgi服务器,再由uwsgi来调用项目中的代码处理服务请求并返回。

二、安装yum

1、yum:Shell软件包管理器。

基于RPM包管理,能够从指定的服务器下载并安装软件包,而且可以自动处理依赖性关系,一次安装所有依赖的软件包,无须繁琐地一次次下载、安装

2、yum工具安装

2.1、下载yum安装包并解压

wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz

2.2、解压

tar -zxvf yum-3.2.28.tar.gz

2.3、进入yum-3.2.28文件夹中进行安装,执行安装指令

cd yum-3.2.28
sudo apt install yum

2.4、查看是否安装yum

输入:rpm -qa yum

2.5、更新到新版本

yum check-update
yum update
yum clean all

3、yum常用命令

yum install  安装软件
yum remove   卸载软件
yum upgrade  升级软件
yum info 查看软件信息
yum list installed 查看已安装的软件包

三、安装gcc

yum install gcc  #GNU开发语言编译器

四、安装python(python中已自带pip安装)

  • python中已自带pip安装,若没有带,则需要额外安装
  • Linux也支持pip命令

1、安装依赖

sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

2、下载安装包,如Python3.7.2

wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz

3、解压缩安装包

tar -zxvf Python-3.7.2.tgz 

4、配置安装路径

一般配置的是/usr/local/python3,即将python安装到这个位置

cd Python-3.7.2  #一定要先cd到安装包目录
./configure prefix=/usr/local/python3

5、编译安装python3

python包即Python-3.7.2目录下执行:

make && make install  #注意是在python包即Python-3.7.2目录下执行

6、添加软链接,让python3和pip3这两个命令指向刚刚安装的python3

ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3 #也可能是python/python3,可以进入/usr/local/python3/bin看下
ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3   #也可能是pip/pip3,可以进入/usr/local/python3/bin看下

7、检验python3安装是否ok

python3 -V

8、检查pip3安装是否OK

pip3 -V

9、pip3升级

pip3 install --upgrade pip


附:pip的升级```

```bash
pip install --upgrade pip

五、安装uWSGI

pip install uwsgi   

问题1:若存在报错如Exception: you need a C compiler to build uWSGI等错误信息,则需要yum安装gcc

yum install gcc

或者安装python-devel,注意需要安装对应版本的devl才可以,如:

yum install python36-devel  #如python版本是python 3.6.x,则此处安装对应版本的devel

当然得先安装yum

问题2:问题1解决后,安装仍然存在问题,特别使用的python版本是python2.xx时,则需要使用python3.xx,使用pip3 install uwsgi 或pip install uwsgi

六、安装flask

pip install flask  
#pip命令安装flask时会同步安装jinja2和werkzeug,其它场合如果需要也可以通过pip install单独安装

备注:pip命令安装flask时会同步安装jinja2和werkzeug

七、将项目文件传输到服务器
1、压缩项目工程文件夹,如flask.zip
2、放到某个目录下,如 /usr/或者新建某个文件目录
3、使用unzip命令解压

八、创建和配置 uwsgi 配置文件 uwsgi.ini

uwsgi.ini的配置文件放在了项目目录下,跟flask的启动脚本放在同一目录下。

touch uwsgi.ini
vim uwsgi.ini

配置如下:

[uwsgi]
socket=0.0.0.0:5000 #socket协议,用于和nginx通讯,端口可配置成别的端口;如果有nginx在uwsgi之前作为代理的话应该配socket   如:socket=0.0.0.0:5000,
#而如果客户端请求不经过(不搭建)Nginx代理服务器,服务请求直接到uwsgi服务器的话那么就配http。如:http=0.0.0.0:5000;IP和端口与项目启动文件app.py中一致; 127.0.0.1虽然是表示本地IP,但想要在网络上访问必须设置host=0.0.0.0才不受IP限制
chdir=/usr/flask/ #项目目录,定位到项目的第一层,具体配置根据实际目录情况而定,如项目名称为falsk
wsgi-file=/usr/flask/manage.py #项目启动文件,实际也可能不是这个命名(需要带上文件路径,视具体目录情况而定)
callable=app #程序内的application变量名,也即执行run方法的那个实例的名称
master=true #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。
processes=4  #进程数
threads=10 #每个进程中线程数
daemonize=uwsgi.log #使进程在后台运行,并将日志打到指定的日志文件,文件若不存在则会自动创建
disable-logging=true :#不记录请求信息的日志,只记录错误以及uWSGI内部消息到日志中。如果不开启这项,日志中会大量请求记录:
pidfile=uwsgi.pid #进程号存储文件,若不存在则会自动创建,pid里面只记录一个进程号,若存在多个进程processes,则使用uwsgi命令通过uwsgi.pid文件停止、重启uwsgi服务不全
buffer-size=65536#设置用于uwsgi包解析的内部缓存区大小为64k,默认是4k。不设置该关键字,请求超过4k就会报错,
harakiri=60# 超过时间,单位秒
vacuum=True # 当服务器退出的时候自动清理环境

备注:非注释复制文件

[uwsgi]
http=0.0.0.0:443
chdir=/usr/flask/  #视具体目录而定
wsgi-file=/usr/flask/app.py  #视具体目录、文件命名情况而定
callable=app
master=true
processes=1
threads=10
daemonize=uwsgi.log
disable-logging=true
pidfile=uwsgi.pid
buffer-size=65536
harakiri=60
vacuum=True

九、启动服务

若进入项目下(uwsgi.ini所在的文件夹下),执行如下启动命令:

uwsgi --ini uwsgi.ini # 启动uwsgi服务

启动成功信息:
[uWSGI] getting INI configuration from uwsgi.ini

ps -ef |grep uwsgi            查看当前是否开启的uwsgi进程

启动失败可查看uwsgi日志,日志位置在配置文件中我们自己配置的路径 tail -f uwsgi

若不通过配置文件启动uwsgi服务,也可以通过命令启动:

uwsgi --http 0.0.0.0:443 --wsgi-file app.py --callable app --processes 4 --threads 2

常用命令:

uWSGI 通过 xxx.ini 启动后会在相同目录下生成一个 xxx.pid 的文件,里面只有一行内容是 uWSGI 的主进程的进程号。

uwsgi --ini cms_uwsgi.ini    //启动
  
uwsgi  cms_uwsgi.ini   --deamonize //后台运行启动  
  
uwsgi --stop uwsgi.pid  //停止服务  
  
uwsgi --reload uwsgi.pid  //可以无缝重启服务

若不使用nginx,则如上即可完成uwsgi服务部署即OK;若想使用nginx作为服务代理,则在步骤六启动uwsgi服务前需要先执行如下步骤;

Linux启动python程序其它方法:

linux启动python程序还有另外一种方式:python xxx.py

此种方式若要python程序后台运行,则需要后面加上 & ,如python xxx.py &

这种启动就是直接运行python程序服务文件了,而不是使用uwsgi服务器

重新部署时,先查找进程就直接查找python进程:ps -ef|grep python

然后kill -9 进程号 删除服务进程部署文件上传成功后再启动python程序服务文件。

备注不要CTRL+C停止,关闭当前页面即可

在这里插入图片描述
在这里插入图片描述
十、安装nginx

yum install nginx

十一、nginx配置

修改nginx配置文件nginx.conf ,将原来默认内容删掉,添加如下:

server {
    listen       80;
    server_name  localhost;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:5000;
    }
}

说明:

listen监听端口,也就是我们在浏览器要访问的端口,默认80;Nginx在80端口上监听从外部来的请求,并把所有请求转发到监听5000端口的WSGI应用。
server_name外网访问服务器的地址
include uwsgi_params 引入uwsgi配置
proxy_pass就是启动flask项目绑定的host和port,也即应用程序启动文件app.py中配置的host和port,配置与uwsgi的配置文件里的socket一致。

备注:如果有多个项目的话,在一个nginx下部署多个应用, 如果用域名到很简单配置多个nginx server 和uwsgi就可以

# 第一个服务器
server {
    listen      192.168.1.1:80; # 监听此ip的80端口
    server_name example.org www.example.org; # 服务器名
    ...
}

# 第二个服务器
server {
    listen      192.168.1.1:80 default_server; # 监听此ip的80端口
    server_name example.net www.example.net; # 服务器名,为此ip,端口的默认服务器
    ...
}

# 第三个服务器
server {
    listen      192.168.1.2:80 default_server; # 监听此ip的80端口
    server_name example.com www.example.com; # 服务器名,为此ip,端口的默认服务器
    ...
}

十二、启动nginx

service nginx start #启动nginx
service nginx status # 查看nginx状态,是否启动
service nginx restart # 重启nginx
ps -ef |grep nginx # 查看nginx是否已启动
kill -9 nginx  #强制停止
tail -f error.log    #查看nginx日志

十一、可能存在的问题

1、如果遇到问题,先查看nginx是否启动成功,如果没成功,nginx日志

当nginx成功以后再去排uwsgi的错误,看看是不是Flask项目的python环境没对应上,或者是缺少某些模块 查看uwsgi日志,找到日志文件的目录 tail -f uwsgi.log

2、Python3安装后导致yum不能使用,因为执行yum需要python2的版本,修改两个文件

vim /usr/bin/yum
vim /usr/libexec/urlgrabber-ext-down 把#!/usr/bin/python 修改为 #!/usr/bin/python2

3、通过nginx访问时自动加末尾斜杠的问题

配置完nginx之后访问每次都是404,经过原因排查,发现是这么回事:

在后端代码中,我写的是@app.route(‘/info’,methods=[‘GET’,‘POST’])这样的。当不使用uwsgi+nginx部署,而是用flask自带的web服务器进行测试时,我访问xxxx:xx/info,可以访问到界面。但是通过nginx访问时,nginx会把所有末尾不带斜杠的非文件类请求都加上斜杠,并且给出301回应,然后重定向到有斜杠的URL下。这可能是因为其他一些比较经典的WEB开发语言中请求往往是一个文件如.php,.aspx,.html等,而python的框架实际上是把一个“目录”节点作为一个html文件给出了。这就使得末尾要加上一个斜杠,才能让nginx知道这是一个指向目录的请求。

解决的办法也很简单,通过浏览器直接发起GET请求的页面(也就是一定要经过nginx访问的),路由设置时记得加上末尾的斜杠就好了。因为不同过键盘打到浏览器地址栏这种方式的GET请求(比如页面的一个超链接的href值,或者AJAX发起指向的URL)都是不会自动补齐斜杠的,所以其他那些页面也都不会受影响。

4、Linux安装uWSGI失败处理办法Exception: you need a C compiler to build uWSGI

解决方案:yum install gcc
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值