openEuler部署flask项目在虚拟机上
1. 前言
其实我们用的虚拟机可以视为一个本地虚拟服务器,和云服务相差不大,区别就是一个在本地,一个在云上,剩下的就是操作系统和各自配置的不同,最后部署的web项目都是要通过主机IP访问才有意义。
本篇教程主要就是介绍在openEuler操作系统上部署flask项目,最后部署的web项目都是要通过主机IP访问。
2.Nginx代理转发
当我们执行完openEuler搭建虚拟机并运行Flask项目后,接着就要部署的web项目都是要通过主机IP访问,这就需要配置Nginx做端口代理转发,看教程吧。
2.1 安装Nginx
在 CentOS 发行版上安装 Nginx 的步骤如下:
-
更新包列表: 在执行安装之前,建议首先更新你的包列表,以确保获取最新的软件版本和更新。
1
sudo yum update
-
安装 Nginx: 使用
yum
包管理器安装 Nginx:1
sudo yum install nginx
-
启动 Nginx 服务: 安装完成后,启动 Nginx 服务并设置开机自启动:
1
2sudo systemctl start nginx
sudo systemctl enable nginx -
检查 Nginx 状态: 使用以下命令检查 Nginx 服务是否正在运行:
1
sudo systemctl status nginx
-
访问 Nginx 默认页面: 打开你的 Web 浏览器,输入服务器的 IP 地址或域名,例如
http://server_ip
,你应该能够看到 Nginx 默认的欢迎页面。 -
配置防火墙规则: 如果 CentOS 上启用了防火墙,需要允许 HTTP(端口 80)流量通过。你可以运行以下命令:
1
2sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload
请注意,上述步骤可能因为 CentOS 版本、配置和环境而有所不同。在执行操作之前,建议阅读相关的 CentOS 文档或指南,以确保你按照正确的步骤进行安装和配置。
另外,Nginx 的配置文件位于 /etc/nginx/nginx.conf
,你可以根据需要编辑这个文件来自定义 Nginx 的行为,如添加虚拟主机、设置 HTTPS 等。
2.2 通过nginx转发到服务器IP
要通过 Nginx 将 Flask 项目转发到服务器 IP,你需要设置 Nginx 的虚拟主机配置,以便 Nginx 可以接收来自外部的请求,并将它们转发到 Flask 项目运行的端口。以下是基本的步骤:
-
安装 Flask 项目: 在服务器上安装并配置好你的 Flask 项目,确保它在某个端口上运行。例如,假设你的 Flask 项目运行在 127.0.0.1 的 5000 端口上。
-
安装并配置 Nginx: 在服务器上安装并配置 Nginx,确保它可以代理请求到 Flask 项目的端口。
-
创建 Nginx 虚拟主机配置: 编辑 Nginx 的虚拟主机配置文件,通常在
/etc/nginx/conf.d/
或/etc/nginx/sites-available/
目录中,创建一个新的.conf
文件,比如myflaskapp.conf
。 -
配置虚拟主机: 在虚拟主机配置文件中添加类似以下的配置,将请求转发到 Flask 项目所在的端口。假设你的 Flask 项目运行在 127.0.0.1 的 5000 端口上:
1
2
3
4
5
6
7
8
9
10server {
listen 80;
server_name your_domain_or_server_ip;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}替换
your_domain_or_server_ip
为你的域名或服务器 IP。 -
保存配置并重启 Nginx: 保存虚拟主机配置文件后,重新加载 Nginx 配置:
1
sudo systemctl reload nginx
-
测试访问: 打开你的 Web 浏览器,输入服务器的域名或 IP 地址,访问你的 Flask 项目。Nginx 将会代理请求并将它们转发到 Flask 项目的端口。
-
注意:
1
2
3flask项目里的接口不要写成这样:http://127.0.0.1/demo,
直接写成/demo,服务器会解析到的
否则会造成同源策略和跨域问题,没必要再做多的一步操作 -
配置防火墙规则: 如果服务器上启用了防火墙,确保允许 Nginx 和 Flask 项目的端口通过。你可以运行类似的命令来放行端口。
请注意,上述步骤中的配置示例可能需要根据你的实际情况进行调整。在配置过程中,确保备份相关配置文件,并根据需要添加额外的安全性和配置选项。
3. python脚本自启动
如果你希望在服务器启动时自动执行Flask应用的运行指令,你可以使用系统级的自动化工具来实现。你可以使用Systemd服务来管理和运行你的Flask应用。以下是基本的步骤:
-
创建Systemd服务文件: 在
/etc/systemd/system/
目录下,创建一个以.service
结尾的文件,比如myflaskapp.service
。使用 root 权限编辑这个文件:1
sudo nano /etc/systemd/system/myflaskapp.service
在文件中添加类似以下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13[Unit]
Description=My Flask App
After=network.target
[Service]
User=your_username
Group=your_group
WorkingDirectory=/path/to/your/project
ExecStart=/path/to/venv/bin/python app.py
Restart=always
[Install]
WantedBy=multi-user.target将
your_username
替换为你的用户名,一般为root
,your_group
替换为你的用户组,一般为root
,/path/to/your/project
替换为你的项目路径,例如:/www/kp
/path/to/venv/bin/python app.py
替换为虚拟环境中的 Python 解释器路径,例如:/usr/bin/python3app.py
-
启用和启动 Systemd 服务: 使用以下命令启用和启动 Systemd 服务:
1
2sudo systemctl enable myflaskapp.service
sudo systemctl start myflaskapp.service这将会使 Systemd 在服务器启动时自动运行你的 Flask 应用。
-
查看服务状态: 你可以使用以下命令查看服务的状态:
1
sudo systemctl status myflaskapp.service
这将会显示服务的运行状态,包括是否正在运行以及可能的错误信息。
-
重启和停止服务: 你可以使用以下命令重启和停止服务:
1
2sudo systemctl restart myflaskapp.service
sudo systemctl stop myflaskapp.service
这样,你的 Flask 应用会在服务器启动时自动运行,并且 Systemd 会负责管理应用的生命周期。请注意,在执行这些操作之前,请确保你的 Flask 应用能够正确运行,并且虚拟环境、依赖和路径都配置正确。
- reboot重启测试一下:重启服务器后,在浏览器输入主机IP即可访问
4. 定时刷新
4.1 说明
如果 Flask 应用在数据量较大的情况下无法加载,但通过执行 systemctl restart myflaskapp.service
重启应用后问题得以解决,可能有以下一些原因:
- 内存泄漏: 当应用处理大量数据时,如果存在内存泄漏,内存可能会逐渐耗尽,导致应用变得不稳定或无法加载。通过重新启动应用,内存泄漏可能会暂时得到解决。
- 资源释放问题: 你的 Flask 应用可能在处理大量数据后没有及时释放资源,导致资源耗尽。通过重新启动应用,之前分配的资源会被释放,这可能是为什么问题得以解决的原因。
- 缓存问题: 如果你的应用使用了缓存机制,缓存可能会导致旧数据的积累,从而导致加载问题。重启应用会清除缓存,从而解决加载问题。
- 长时间运行: 如果应用长时间运行,可能会导致一些资源积累或状态变得不稳定。重启应用可以将应用状态重置为初始状态,可能暂时解决问题。
- 连接池问题: 如果应用涉及数据库或其他外部服务,连接池可能会出现问题,导致长时间运行后无法正确连接。重启应用会重置连接池。
如果在重启应用后问题得到解决,但在长时间运行后问题再次出现,你可能需要仔细检查你的代码,确保在处理大量数据时正确释放资源、避免内存泄漏等问题。另外,记录应用的日志以便在出现问题时进行调查是很有帮助的。
4.2 定时刷新
在使用定时任务重启你的 Flask 应用之前,你通常不需要手动执行
sudo systemctl stop myflaskapp.service
。这是因为你计划使用定时任务来定期重启应用,而systemctl restart
命令会先停止服务然后再启动服务。如果你在定时任务中设置了每天的某个特定时间执行
sudo systemctl restart myflaskapp.service
,系统会自动停止并重启你的 Flask 应用。因此,在定时任务生效后,你不需要手动执行停止操作。但是,在配置定时任务之前,确保你的 Flask 应用在正常运行。如果应用没有配置好或者存在问题,定时任务可能会导致不必要的中断。确保测试和验证应用在定时任务执行前可以正常启动和停止。
如果你想让 sudo systemctl restart myflaskapp.service
每 24 小时执行一次,你可以使用一个定时任务来实现。你可以使用 cron 作业来定期执行指定的命令。下面是设置 cron 作业的步骤:
-
编辑 cron 作业列表: 在终端中,输入以下命令来编辑 cron 作业列表:
1
crontab -e
-
添加定时任务: 在编辑器中,添加以下一行来指定每天定时执行
sudo systemctl restart myflaskapp.service
命令的时间:1
0 0 * * * sudo systemctl restart myflaskapp.service
在上面的例子中,
0 0 * * *
表示每天的午夜 00:00 执行一次。你可以根据需要调整时间和频率。 -
保存并退出: 在编辑器中保存你的修改并退出。
-
确认 cron 作业: 使用以下命令来查看当前的 cron 作业列表:
1
crontab -l
确保你添加的作业正确显示在列表中。
这样,每天的指定时间,cron 作业就会自动执行 sudo systemctl restart myflaskapp.service
,从而重启你的 Flask 应用。
请注意,使用 cron 作业需要小心,确保你的命令没有错误和异常情况,否则可能会导致不必要的问题。在编辑 cron 作业时,你可以使用 crontab
的帮助文档来了解更多有关 cron 表达式的信息:
1 | man 5 crontab |
另外,确保你在执行这些操作之前备份重要数据,以防止意外情况发生。
拓展
如果你想将定时任务的执行时间改为每天早上 9:45,你可以在 crontab -e
编辑器中使用如下设置:
1 | 45 9 * * * sudo systemctl restart myflaskapp.service |
在上面的例子中,45 9 * * *
表示在每天的第 9 小时 45 分执行一次定时任务,即早上 9:45。
确保你的系统时间设置正确,并且你的 Flask 应用在这个时间点是可用的。在设置定时任务之后,可以使用 crontab -l
命令来查看你的定时任务列表,以确保设置正确。
4.3 隔段刷新
如果你想让定时任务每隔一段时间执行一次,而不是每天固定时间执行,你可以使用 crontab 的特殊语法来定义执行间隔。以下是一些示例:
-
每小时执行一次: 每小时的第 0 分钟执行一次。
1
0 * * * * sudo systemctl restart myflaskapp.service
-
每两小时执行一次: 每两小时的第 0 分钟执行一次。
1
0 */2 * * * sudo systemctl restart myflaskapp.service
-
每十分钟执行一次: 每小时内的第 10、20、30、40、50 分钟执行一次。
1
10,20,30,40,50 * * * * sudo systemctl restart myflaskapp.service
-
每十分钟执行一次(更简洁的语法): 使用
/
符号来定义执行间隔。1
*/10 * * * * sudo systemctl restart myflaskapp.service
这些示例中,你可以根据需要选择适合你的执行频率。如果你想要更精细的间隔,可以根据 crontab 语法进行自定义。
请注意,定时任务的间隔和频率是可以根据需求进行调整的。确保你的 Flask 应用能够在短时间内多次启动和停止,以及在执行定时任务期间没有问题。
5. 完成
现在不用再重复打开物理机在项目终端执行python3 app.py
的操作了
打开物理机,在浏览器输入主机IP即可访问
注意事项:
- 基本环境搭建好一定要拍摄快照!!!
- 基本环境搭建好一定要拍摄快照!!!
- 基本环境搭建好一定要拍摄快照!!!