flask_web部署服务器测试

flask_web部署服务器测试

一、代码简介

我的代码是一个基于Flask框架的Web应用,用于对上传的图像进行分类预测。该应用使用了预训练的ResNet50模型来对图像进行分类,并返回分类结果。以下是该代码的功能和作用的详细分析:

  1. 初始化Flask应用

    app = Flask(__name__)
    

    这行代码初始化了一个Flask应用实例,app是Flask应用的核心对象,后续的路由和请求处理都基于这个对象进行。

  2. 设置上传文件夹和允许的文件类型

    UPLOAD_FOLDER = 'uploads'
    ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'bmp'}
    

    指定了上传文件将保存到uploads文件夹中,并限制了允许上传的文件类型为PNG、JPG、JPEG、BMP格式。

  3. 检查并创建上传文件夹

    if not os.path.exists(UPLOAD_FOLDER):
        os.makedirs(UPLOAD_FOLDER)
    

    如果上传文件夹不存在,则创建这个文件夹,以确保上传文件有地方存放。

  4. 设置PyTorch设备

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    

    检查是否有可用的GPU设备,如果有,则使用GPU,否则使用CPU进行模型的推理计算。

  5. 定义并加载ResNet50模型

    model = models.resnet50(pretrained=False)
    num_ftrs = model.fc.in_features
    num_classes = 9
    model.fc = nn.Sequential(
        nn.Linear(num_ftrs, 512),
        nn.ReLU(),
        nn.Dropout(0.2),
        nn.Linear(512, num_classes),
        nn.LogSoftmax(dim=1)
    )
    model = model.to(device)
    model.load_state_dict(torch.load('./7_1_pd_resnet_model_noise.pth', map_location=device))
    model.eval()
    

    这里定义了一个ResNet50模型,并修改了最后的全连接层以适应9类分类任务。模型加载了预训练好的权重,并设置为评估模式。

  6. 定义图像预处理操作

    test_transforms = transforms.Compose([
        transforms.ToTensor(),
    ])
    

    定义了对输入图像的预处理操作,将图像转换为PyTorch的张量形式。

  7. 定义分类标签

    classes = ['发动机干扰', '悬浮电位', '手机干扰', '日光灯干扰', '沿面放电', '绝缘件内部气隙放电', '自由金属颗粒放电', '金属尖端放电', '雷达干扰']
    

    定义了9个分类标签,这些标签代表了模型可以预测的不同类别。

  8. 文件扩展名检查函数

    def allowed_file(filename):
        return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
    

    这个函数用于检查上传的文件是否符合允许的格式。

  9. 图像预测函数

    def predict(filepath):
        # 处理图像并进行预测
        # 返回预测的类别和概率
    

    该函数读取图像文件,进行预处理后通过模型进行预测,返回预测的类别和相应的概率值。

  10. 定义根路由

    @app.route('/')
    def upload_file():
        return render_template('index.html')
    

    该路由定义了应用的主页,返回一个上传文件的页面。

  11. 文件上传处理

    @app.route('/uploadfile/', methods=['POST'])
    def upload_file_post():
        # 处理上传的文件并进行预测,返回结果
    

    该路由处理文件上传请求,检查文件是否合法后保存文件,并调用predict函数进行预测,最后将结果以JSON格式返回。

  12. 提供上传的图像

    @app.route('/uploads/<filename>')
    def uploaded_file(filename):
        return send_from_directory(UPLOAD_FOLDER, filename)
    

    该路由用于在浏览器中访问和下载已上传的图像文件。

  13. 启动Flask应用

    if __name__ == '__main__':
        app.run(debug=True, port=5000)
    

    这段代码用于启动Flask应用,使得应用可以在本地服务器上运行,默认使用5000端口。

总结:该代码的主要作用是通过Flask框架搭建一个简单的Web服务,用户可以通过浏览器上传图像,服务器会使用预训练的ResNet50模型对图像进行分类,并返回预测结果。

二、代码部署

2.1 总体流程

要将这个基于Flask的应用部署上线并对外提供服务,需要配置服务器环境和网络设置。以下是一个简化的步骤指南,帮助你将这个应用部署到生产环境中:

1. 选择服务器

首先,你需要选择一个服务器。常见的选择包括:

  • 云服务器:如阿里云、腾讯云、AWS、Google Cloud等。
  • 本地服务器:如果你有自己的服务器,可以直接在本地配置。

2. 配置服务器环境

在服务器上进行以下配置:

a. 安装Python和相关依赖

首先确保服务器上安装了Python(建议使用Python 3.7或更高版本)。

sudo apt update
sudo apt install python3 python3-pip python3-venv

然后,为你的项目创建一个虚拟环境并激活它:

python3 -m venv venv
source venv/bin/activate

接着,安装Flask、PyTorch和其他依赖库:

pip install flask torch torchvision Pillow
b. 配置Flask环境变量

在生产环境中,建议关闭调试模式并指定运行的IP地址和端口。

在服务器的环境变量中设置以下配置:

export FLASK_APP=cpu_resnet_flask_web.py
export FLASK_ENV=production

3. 配置Gunicorn或其他WSGI服务器

Flask的内置服务器并不适合生产环境。建议使用Gunicorn等WSGI服务器来部署应用。

安装Gunicorn:

pip install gunicorn

使用Gunicorn启动Flask应用:

gunicorn --bind 0.0.0.0:8000 cpu_resnet_flask_web:app

这个命令会将应用绑定到服务器的8000端口,监听所有IP地址的请求。

4. 配置Nginx

为了让你的应用能够通过标准的HTTP/HTTPS端口(80/443)访问,你可以使用Nginx作为反向代理。

首先,安装Nginx:

sudo apt install nginx

然后,配置Nginx:

sudo nano /etc/nginx/sites-available/flask_app

在文件中添加以下配置:

server {
    listen 80;
    server_name your_domain_or_ip;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /uploads/ {
        alias /path_to_your_project/uploads/;
    }
}

保存并退出后,启用这个配置并重启Nginx:

sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled
sudo systemctl restart nginx

5. 配置域名和SSL(可选)

如果你有域名并希望启用HTTPS,可以:

  • 配置域名:将域名的DNS A记录指向服务器的IP地址。
  • 启用SSL:使用Let’s Encrypt免费获取SSL证书并配置Nginx。

安装Certbot(Let’s Encrypt客户端)并获取证书:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain_or_ip

按照提示完成SSL证书的申请和配置。

6. 允许防火墙通过必要的端口

确保你的服务器防火墙允许HTTP(80端口)和HTTPS(443端口)流量:

sudo ufw allow 'Nginx Full'

7. 测试和上线

部署完成后,在浏览器中输入你的域名或IP地址,测试应用是否正常运行。如果一切正常,你的应用已经上线并对外提供服务。

8. 持续集成与监控(可选)

为了保证服务的稳定性和可维护性,可以考虑:

  • 使用Supervisor或systemd管理Gunicorn:确保Gunicorn在服务器重启后自动启动。
  • 设置日志记录和监控工具:如Prometheus、Grafana,用于实时监控应用状态。

这样,你的Flask应用就可以在生产环境中稳定运行了。

2.2 具体要求

假设我把相应的代码传输到ubuntu服务器上的一个文件夹为flask_app,我想为它创建一个flask_venv虚拟环境,且我的ubuntu的服务器IP为192.168.81.129,没有实际的域名,只是先测试和内部使用。

以下是完整的部署步骤,包含了更新并安装必要依赖的步骤。

1. 连接到服务器

使用SSH连接到你的Ubuntu服务器:

ssh your_username@192.168.81.129

2. 更新并安装必要的依赖

在开始配置之前,确保服务器上的软件包管理器是最新的,并安装必要的依赖项,包括Python、pip、和Nginx:

sudo apt update
sudo apt upgrade -y
sudo apt install python3 python3-pip python3-venv nginx

3. 导航到项目目录

进入你存放Flask应用代码的目录(假设为flask_app):

cd /home/your_username/flask_app

4. 创建和激活Python虚拟环境

在项目目录中创建一个名为flask_venv的虚拟环境,并激活它:

python3 -m venv flask_venv
source flask_venv/bin/activate

如下图所示,进入python虚拟环境:
在这里插入图片描述

5. 安装项目依赖

在虚拟环境中,使用pip安装Flask和其他必要的依赖:

pip install flask torch torchvision Pillow gunicorn

若是下载包太慢,可以添加国内镜像源:

pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install flask torch torchvision Pillow gunicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

6. 配置Flask应用

设置Flask应用的环境变量,确保它在生产模式下运行:

export FLASK_APP=cpu_resnet_flask_web.py
export FLASK_ENV=production

7. 使用Gunicorn运行Flask应用

在虚拟环境中,使用Gunicorn来运行你的Flask应用:

gunicorn --bind 0.0.0.0:8000 cpu_resnet_flask_web:app

此命令将Flask应用绑定到服务器的8000端口,监听所有IP地址的请求。

8. 安装并配置Nginx

在服务器上安装Nginx,用于反向代理和处理请求:

sudo apt install nginx

然后,配置Nginx,使其将80端口的请求转发给Gunicorn。

打开Nginx配置文件:

sudo nano /etc/nginx/sites-available/flask_app

在文件中添加以下配置:

server {
    listen 80;
    server_name 192.168.81.129;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /uploads/ {
        alias /home/your_username/flask_app/uploads/;
    }
}

保存并退出文件编辑器。

9. 启用Nginx配置

为Nginx启用新配置,并重启Nginx服务:

sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

运行结果如下:
在这里插入图片描述

10. 配置防火墙

确保防火墙允许HTTP流量通过:

sudo ufw allow 'Nginx Full'

11. 测试部署

在浏览器中输入 http://192.168.81.129,测试应用是否能够正常访问。如果配置正确,你应该能够看到你的Flask应用的主页。

12. 设置Gunicorn为服务

为了保证Gunicorn在服务器重启后自动启动,可以使用systemd来管理它。

创建一个systemd服务文件:

sudo nano /etc/systemd/system/flask_app.service

在文件中添加以下内容:

[Unit]
Description=Gunicorn instance to serve Flask application
After=network.target

[Service]
User=your_username
Group=www-data
WorkingDirectory=/home/your_username/flask_app
Environment="PATH=/home/your_username/flask_app/flask_venv/bin"
ExecStart=/home/your_username/flask_app/flask_venv/bin/gunicorn --workers 3 --bind unix:flask_app.sock -m 007 cpu_resnet_flask_web:app

[Install]
WantedBy=multi-user.target

保存后,启用并启动服务:

sudo systemctl start flask_app
sudo systemctl enable flask_app

13. 检查服务状态

检查Gunicorn服务是否正确运行:

sudo systemctl status flask_app

在这里插入图片描述

14. 访问应用

在浏览器中输入 http://192.168.81.129,确保一切正常运行。

通过以上步骤,你的Flask应用应该已经成功部署到Ubuntu服务器上,并通过192.168.81.129可以访问。这个环境适合内部测试和使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值