云服务器下如何部署Flask项目详细操作步骤

news2024/11/13 9:04:48

参考网上各种方案,再结合之前学过的Django部署方案,最后确定Flask总体部署是基于:centos7+nginx+uwsgi+python3+Flask之上做的。

本地windows开发测试好了我的OCR项目,现在要部署我的OCR项目到云服务器上验证下。

第一步:打包上传Flask项目代码到服务器指定目录下

如图:

第二步:安装 Flask,PaddleOCR 等相关依赖包

手工启动myapp.py,查看缺少哪些包,就下载缺少的包即可。

第三步:安装Linux版本 paddlepaddle 百度飞浆

进入百度飞浆官网安装地址:

https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/windows-pip.html

 到服务器上执行下载命令:

python -m pip install paddlepaddle==2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

第四步:验证PaddleOCR 安装

执行要部署的 myapp.py 启动程序,其他验证方法也可以。

注意事项:

一般在服务器上第一次安装 PaddleOCR 都会出现一个libstdc++.so.6问题

 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found问题解决方法:

1,查看验证是否缺少缺少GLIBCXX_3.4.20

[root@localhost]# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

发现少了GLIBCXX_3.4.20,解决方法是升级libstdc++.

然后我在网上找了很多关于升级libstdc++方法,尝试了10几种方法都没实现,可能跟服务器版本有关吧。
最后通过直接搜索,linux 下载 libstdc++.so.6.0.25
找到 libstdc++.so.6.0.25 下载链接:
https://download.csdn.net/download/qq_39466755/87812280?utm_source=bbsseo
花点积分下载到 libstdc++.so.6.0.25 文件。
然后上传文件到服务器, /usr/lib64 目录下

然后执行下列步骤:
0、进入当前目录:
[root@localhost]# cd /usr/lib64

1、删除 旧的libstdc++.so.6软连接
[root@localhost]# rm -rf libstdc++.so.6

2、创建新的软连接指向6.0.25版本的库
[root@localhost]# ln -s libstdc++.so.6.0.25 libstdc++.so.6

3、查看libstdc++.so文件
[root@localhost]# ls -lrt libstdc++.so*
-rwxr-xr-x 1 root root 995840 9月 30 2020 libstdc++.so.6.0.19
-rwxrwxr-x 1 root root 12129824 8月 19 17:01 libstdc++.so.6.0.25
lrwxrwxrwx 1 root root 19 8月 19 17:18 libstdc++.so.6 -> libstdc++.so.6.0.25

3、再运行检查GLIBCXX版本
[root@localhost]# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX

第五步:配置uwsgi.ini文件

[uwsgi]
# 这里是你的项目根目录路径
chdir = /home/py_workspace/flask_pro/MyOCR
# 模块名,这里用myapp; myapp:app是指定一个Python的可执行文件,它包括Flask的代码from myapp.app import app
module = myapp:app
# 因为app是启动整个服务的入口,所以是app
callable = app
# 是否启动主进程来管理其他进程
master = true
# 设置进程数
processes = 5
# 每个进程的线程个数
threads = 10
# 这里的sock文件不是某个现成的文件,也不需要事先创建,运行时会自动创建,文件名也是自己定
# socket = /tmp/myapp.sock
# 套接字方式的 IP地址:端口号,搭配 nginx使用socket
socket = 127.0.0.1:8000
# chmod-socket = 660
# 当服务器退出时自动清理环境
vacuum = true
# 超时时间,单位秒
harakiri = 60
# 服务的pid记录文件
pidfile = uwsgi.pid
# 服务的日志文件位置
daemonize = uwsgi.log

配置完成后,我们就可以使用下面的命令启动 uWSGI 了:

#启动 uwsgi 命令
$ cd ./flask_pro/MyOCR  # 项目文件夹,uwsgi.ini 配置文件 下执行
$ uwsgi --ini uwsgi.ini
#停止 uwsgi 命令
$ uwsgi --stop uwsgi.pid

第六步:配置 nginx.conf 文件

#user root;
#worker_processes  1;
 
events {
    worker_connections  1024;
}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip on;
    # server被称为虚拟主机,可以有多个
    # 第2个主机
    server {
	    # 监听端口号
        listen  80;
	    # 你的服务器ip
        server_name xx.xx.xx.xx;
        charset     utf-8;
        client_max_body_size 75M;   # adjust to taste

        location / {
            # 将nginx所有请求转到uwsgi
            include uwsgi_params;
            # uwsgi的ip与端口
            uwsgi_pass 127.0.0.1:8000;
        }

        location /static {
            # 静态文件目录
            alias /home/py_workspace/flask_pro/MyOCR/static;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
             root   html;
        }
    }

}

配置完成后,启动nginx.

cd /usr/sbin #进入执行路径

复制代码
#启动 nginx

./nginx

#重启 nginx

./nginx -s reload

#停止 nginx

./nginx -s stop

第七步:打开浏览器验证网址

经过 uwsgi 服务器和  nginx 服务器 部署配置,启动完成后,基本就结束部署了,打开浏览器,查看部署的第一个Flask项目。

xx.xx.xx.xx  代表你的云服务器对外访问IP,因为nginx 配置默认端口为 80 , 云服务器一般开通了80端口访问权限,然后 uwsgi + Flask 配置了 8000端口,需要在云服务器官网,自己添加 8000 端口访问权限,这块自行网上搜索解决,网络端口解决了,直接输入下面网址查看部署结果。

部署完成后可能出现问题二: 打开 http://xx.xx.xx.xx/upload ,报错无法访问:

Not Found
The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

通过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访问的),python代码和html代码里,路由设置时记得加上末尾的斜杠就好了。
因为不同过键盘打到浏览器地址栏这种方式的GET请求(比如页面的一个超链接的href值,或者AJAX发起指向的URL)都是不会自动补齐斜杠的,所以其他那些页面也都不会受影响。

-- 进入我的OCR页面

http://xx.xx.xx.xx/upload/

 --------------------------------end --------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/987802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

调用API接口的一些注意技巧

在实践中我们经常发现,很多同学都是直接请求调用和读取接口数据,而没有做状态码的判断,这在设计角度是非常不合理的。 另外,对于一些实时性要求不高的接口,更合理的做法应该是先把数据拉到本地缓存,再从缓存…

sql server 设置字段自增

1.将字段设置为主键; 2.将“标识规范”设置为是,这里注意切勿将默认值设置为0,否则无法选择“标识规范”

mybatis初体验(细节满满)

1.创建数据表(库名为:mayikt) CREATE TABLE mayikt_user (id int NOT NULL AUTO_INCREMENT,username varchar(20) DEFAULT NULL,userpwd varchar(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT9 DEFAULT CHARSETutf8mb3…

QT for andriod

QT for andriod 开发 apk软件,因为一些特殊的原因,在这里简单的记录一哈自己开发apk的流程和心得。 首先说明我采用的环境有哪些? 1、QT的版本,个人建议5.15.2的版本及以上,我是用的5.15.2。 2、andriod studio 可以…

日期--data与String的相互转换

首先我们要明确 yyyy-MM-dd HH:mm:ss 其中y:年份 MM:月份 dd:天 HH:小时 mm:分 ss:秒 date转String // 获取当前时间LocalDateTime dateLocalDateTime.now(); // 设置日期格式DateTimeFormatter formatterDateTimeFormatter.ofPattern("yyyy-MM-dd…

步进电机选型-根据应用场景

步进电机选型-根据应用场景 在线计算传动机构与步进电机选型问题,这个网站挺好用的 https://www.orientalmotor.com.cn/guide/motorsizingtool/[电机选型]

【C++】C++11新特性 function

包装器function 一、包装器的引入二、包装器的介绍三、bind函数的介绍 一、包装器的引入 在C中我们的可调用对象是很多的,例如函数指针,仿函数,lambda表达式,这多的可调用对象极大的丰富了C的功能,但是也给我们带来了…

Python continue 语句

Python continue 语句跳出本次循环,而break跳出整个循环。 continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。 continue语句用在while和for循环中。 Python 语言 continue 语句语法格式如下: continue 流程图…

PaddleOCR训练部署文档

Cuda安装 wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run sh cuda_11.6.0_510.39.01_linux.run#可能会报错,查看/var/log/nvidia-installer.log ,kill -9 [ID]可以解决vim ~/.bash…

计算机网络 第一章:概述

目录 一.因特网概述 1.1网络、互联网(互连网)和因特网 1.2internet与Internet的区别 1.3因特网服务提供者ISP(Internet Service Provider) 1.4因特网组成 二.三种交换方式 2.1电路交换 2.2分组交换(重点) 2.3报文交换 三.计算机网络的定义和分类 四.计算机网络的性能…

前端居中截取不同形状的图片

开发的时候拿到这样一个需求: 意思就是要居中截取图片,这个功能跟微信朋友圈的九宫格显示功能差不多的效果。 方案一 用样式居中,这种方案适合紧急情况下的临时方案 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8&…

华为云云耀云服务器L实例评测|基于华为云云耀云服务器L实例搭建MySQL集群并开展性能评测

文章目录 华为云云耀云服务器L实例的使用搭建MySQL集群环境搭建安装MySQL数据库 集群搭建安装Galera Cluster配置MySQL启动集群 性能测试安装sysbench创建测试数据库运行性能测试 使用Superset从MySQL数据源中获取数据进行分析准备工作配置MySQL数据源从MySQL数据源中获取数据 …

基于Java+SpringBoot+Vue前后端分离的房屋租赁管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 房屋租赁管理系统是一…

029:vue项目,勾选后今天不再弹窗提示

第029个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

【校招VIP】前端算法考察之字符串

考点介绍 说到字符串算法我们最先想到的就是模式匹配问题&#xff0c;所谓模式匹配就是字符串匹配问题&#xff0c;就是在一个长的主串中寻找子串的过程&#xff0c;如果我们直接暴力匹配那就是最基本的BF算法&#xff1b;KMP算法与BF算法最大的区别区别就是主串不进行回溯。 …

PaddleOCR学习笔记1-初步尝试

尝试使用PaddleOCR方法&#xff0c;如何使用自定义的模型方法&#xff0c;参数怎么配置&#xff0c;图片识别尝试简单提高识别率方法。 目前仅仅只是初步学习下如何使用PaddleOCR的方法。 一&#xff0c;测试识别图片&#xff1a; 1.png : 正确文本内容为“哲学可以帮助辩别现…

向左偏移的云应用容器监控方法

向左偏移是一种在软件开发生命周期的早期强调测试、监控和自动化的软件开发和操作方法。向左偏移方法的目标是通过尽早发现问题并迅速解决&#xff0c;从而预防问题的发生。 当您尽早发现可扩展性问题或错误时&#xff0c;解决它将更加迅速和经济高效。将低效的代码移动到云容…

使用Jsmooth打包JavaFx程序为EXE文件

配置IDEA 第一步&#xff1a; 第二步&#xff1a; MANIFEST.MF的文件路径&#xff0c;必须在resources文件夹中&#xff0c;如果没有&#xff0c;就创建一个。 第三步&#xff1a;配置项目所需jar包的相对路径 最后&#xff1a; 点击确定后&#xff0c;编译Jar 配置Jsmooth …

Docker从认识到实践再到底层原理(四-1)|Docker镜像仓库|超详细详解

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

k8s node环境部署(三)

1、添加node1、node2环境 前面配置master环境的截图最后一段 复制下来 分别在node主机执行 kubeadm join 192.168.37.132:6443 --token p5omh3.cqjqt8ymrwkdn2fc \ --discovery-token-ca-cert-hash sha256:608a1cbadd060cfdeac2fae84c19609061b750ab51bf9a19887ff7ea…