flask_web部署服务器测试
一、代码简介
我的代码是一个基于Flask框架的Web应用,用于对上传的图像进行分类预测。该应用使用了预训练的ResNet50模型来对图像进行分类,并返回分类结果。以下是该代码的功能和作用的详细分析:
-
初始化Flask应用:
app = Flask(__name__)
这行代码初始化了一个Flask应用实例,
app
是Flask应用的核心对象,后续的路由和请求处理都基于这个对象进行。 -
设置上传文件夹和允许的文件类型:
UPLOAD_FOLDER = 'uploads' ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'bmp'}
指定了上传文件将保存到
uploads
文件夹中,并限制了允许上传的文件类型为PNG、JPG、JPEG、BMP格式。 -
检查并创建上传文件夹:
if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER)
如果上传文件夹不存在,则创建这个文件夹,以确保上传文件有地方存放。
-
设置PyTorch设备:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
检查是否有可用的GPU设备,如果有,则使用GPU,否则使用CPU进行模型的推理计算。
-
定义并加载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类分类任务。模型加载了预训练好的权重,并设置为评估模式。
-
定义图像预处理操作:
test_transforms = transforms.Compose([ transforms.ToTensor(), ])
定义了对输入图像的预处理操作,将图像转换为PyTorch的张量形式。
-
定义分类标签:
classes = ['发动机干扰', '悬浮电位', '手机干扰', '日光灯干扰', '沿面放电', '绝缘件内部气隙放电', '自由金属颗粒放电', '金属尖端放电', '雷达干扰']
定义了9个分类标签,这些标签代表了模型可以预测的不同类别。
-
文件扩展名检查函数:
def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
这个函数用于检查上传的文件是否符合允许的格式。
-
图像预测函数:
def predict(filepath): # 处理图像并进行预测 # 返回预测的类别和概率
该函数读取图像文件,进行预处理后通过模型进行预测,返回预测的类别和相应的概率值。
-
定义根路由:
@app.route('/') def upload_file(): return render_template('index.html')
该路由定义了应用的主页,返回一个上传文件的页面。
-
文件上传处理:
@app.route('/uploadfile/', methods=['POST']) def upload_file_post(): # 处理上传的文件并进行预测,返回结果
该路由处理文件上传请求,检查文件是否合法后保存文件,并调用
predict
函数进行预测,最后将结果以JSON格式返回。 -
提供上传的图像:
@app.route('/uploads/<filename>') def uploaded_file(filename): return send_from_directory(UPLOAD_FOLDER, filename)
该路由用于在浏览器中访问和下载已上传的图像文件。
-
启动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
可以访问。这个环境适合内部测试和使用。