Ubuntu Flask 运行 gunicorn+Nginx 部署
linux Ubuntu 下运行python 程序出现killed
原因:CPU或内存限制:在华为云上,你可能有CPU或内存使用的限制。例如,如果你使用的是一个固定大小的实例,那么超过该实例的CPU或内存限制可能会导致进程被杀死。
参考:Linux下Python程序Killed,分析其原因_python killed-CSDN博客
运行:
查看日志
cd /var/log/
直接查找错误
egrep -i 'killed process' /var/log/syslog
# 或:
egrep -i -r 'killed process' /var/log
出现:
Out of memory: Killed process 67092 (python) total-vm:4800520kB, anon-rss:3452304kB, file-rss:2612kB, shmem-rss:0kB, UID:0 pgtables:7800kB oom_score_adj:0
程序运行内存太大了,华为云服务器的4G不够用。
重新调整程序后,继续
不小心开了防火墙,导致xshell又连接不上了,通过华为云线上的控制台重新关闭。
sudo ufw disable
华为云服务器如何开放端口允许外部访问_华为云服务器端口开放访问不了-CSDN博客
华为云开启5000端口,供外部访问



添加完毕!
可以去跑flask文件啦
进入对应路径运行 python app.py
运行成功
外网就可以访问了 http://公网ip:5000/
关于 Gunicorn 和 Nginx之间数据怎么流通的,了解可以看这个:
Gunicorn 和 Nginx之间数据流通-CSDN博客
下面开始正式部署:
代码部分:
......
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
配置服务器
选择 WSGI 服务器 Gunicorn
虽然 Flask 内置了一个开发服务器,但不建议在生产环境中使用。选择一个生产就绪的 WSGI 服务器,如 Gunicorn 或 uWSGI。安装你选择的服务器:
这里选择 gunicorn,独角兽
# 安装 Gunicorn
pip install gunicorn
Gunicorn 有许多配置选项,可以通过命令行参数或配置文件进行设置。一些常见的配置选项包括:
workers:工作进程的数量,可以根据 CPU 核心数进行调整。bind:绑定地址和端口,默认为127.0.0.1:8000。logfile:日志文件的路径。loglevel:日志级别(debug, info, warning, error, critical)
例如,要指定 4 个工作进程并在 8001 端口上监听,你可以运行:
gunicorn -w 4 -b 0.0.0.0:8001 app:app
- 注意这里的正确拼写 app:app
- 注意端口号(有必要的话同时设置华为云服务器的安全组)
可能出现的问题: Gunicorn正常运行但是外部不能正常访问。
注意如果直接运行:gunicorn app:app 这是运行默认配置
Gunicorn 可能只监听在 127.0.0.1(localhost)上,而不是 0.0.0.0(所有可用接口)。
那外网是无法访问的,没有正确配置来接受来自你外部IP 地址的连接。
- Gunicorn绑定到
0.0.0.0,而不是127.0.0.1,这样它就可以接受来自任何IP地址的连接。
可能出现的问题:Gunicorn运行报错: [INFO] Starting gunicorn 21.2.0
[ERROR] Connection in use: ('0.0.0.0', 8000)
这个错误说明 端口 8000 正在被其他进程使用。由于端口是唯一的,一个时间点上只能有一个进程监听特定端口。
查找正在使用端口的进程:
sudo lsof -i :8000
或
sudo netstat -tuln | grep 8000
杀死正在使用端口的进程:将 <PID> 替换为实际的进程ID。
sudo kill -9 <PID>
另外还可以再看看确保没有其他 Gunicorn 实例在运行:
ps aux | grep gunicorn
杀死正在运行的Gunicorn 实例的进程
sudo kill -9 <PID>
重新启动 Gunicorn
gunicorn -w 2 -b 0.0.0.0:8000 app:app
可以正常运行了,外部可以正常访问到。
关闭gunicorn:
ctrl+c 关掉,顺便杀死刚才运行的gunicorn,即上面的步骤
使用系统服务管理 Gunicorn
对于生产环境,你可能希望使用系统服务(如 systemd 或 supervisor)来管理 Gunicorn 进程。这样可以在服务器启动时自动启动 Gunicorn,并在其崩溃时自动重启。
使用 systemd 创建一个服务单元文件(例如 /etc/systemd/system/gunicorn.service),内容如下:Linux 系统使用 systemd 把Flask 项目注册为系统服务
gunicorn.service的名字自己定义可以是myflaskapp.service等
创建命令:vim /etc/systemd/system/gunicorn.service 输入i进行编辑
[Unit]
Description=Gunicorn service for my Flask app
After=network.target [Service]
User=your_username
Group=your_groupname
WorkingDirectory=/path/to/your/app
ExecStart=/usr/local/bin/gunicorn -w 4 -b unix:/path/to/your/app/gunicorn.sock 'app:app' [Install]
WantedBy=multi-user.target
替换 your_username、your_groupname、/path/to/your/app 和其他路径为实际的值。
whoami # 获取当前用户名 结果替换your_username
groups # 获取当前用户所在的组 结果替换your_groupname
设置正确的工作目录
WorkingDirectory=/path/to/your/app
这个就是你flask项目的文件夹,
比如我的是 /root/TensorFlow_to_Android/Flower_APP
我的app.py 就在这文件夹下面,填到文件夹就可以了。
确保 Gunicorn 可执行文件路径正确
ExecStart=/usr/local/bin/gunicorn -w 4 -b unix:/path/to/your/app/gunicorn.sock 'app:app'
这句因人而异,
如果gunicorn 不是安装在虚拟环境(flask项目没有创建虚拟环境)则:
可通过 which gunicorn 或 find / -name gunicorn(可能需要 sudo)来查找 gunicorn 的实际安装位置。得到真实路径就替换掉 /usr/local/bin/gunicorn
unix:/path/to/your/app/gunicorn.sock这个替换成0.0.0.0:8000 注意端口号
完整的一句比如:
ExecStart=/usr/bin/gunicorn -w 4 -b 0.0.0.0:5500 app:app
如果 Gunicorn 安装在一个虚拟环境中,确保虚拟环境被激活,并且 ExecStart 指令指向了虚拟环境中正确的 Gunicorn 可执行文件路径
下面是我的设置
[Unit]
Description=Gunicorn service for my Flask flower app
After=network.target [Service]
User=root
Group=root
WorkingDirectory=/root/TensorFlow_to_Android/Flower_APP
ExecStart=/usr/bin/bash -c 'source /root/tf_cpu/bin/activate && exec gunicorn --workers 3 --bind 0.0.0.0:8000 app:app' [Install]
WantedBy=multi-user.target
ExecStart的设置说明:
ExecStart=/usr/bin/bash -c 'source /root/tf_cpu/bin/activate && exec gunicorn --workers 3 --bind 0.0.0.0:8000 app:app'
bash路径 可以通过运行 which bash 来检查 bash 的实际路径。得到的路径 替换掉 /usr/bin/bash
/bin/bash -c 来执行一个 shell 命令, 这个命令做了两件事:
-
source /root/tf_cpu/bin/activate:这行代码用于激活 Python 虚拟环境 注意修改虚拟环境路径/root/tf_cpu/bin/activate exec gunicorn --workers 3 --bind unix:/run/gunicorn.sock app:app:这行代码用于启动 Gunicorn 服务器。exec确保当前 shell 进程被替换为 Gunicorn 进程,gunicorn是要执行的命令,后面的参数是 Gunicorn 的配置选项。
至此完成,点击ESC 退出,输入 :wq 保存并退出
重新加载 systemd 配置:
sudo systemctl daemon-reload
立即启动这个服务:
sudo systemctl start gunicorn.service
设置系统启动时自动运行该服务:
sudo systemctl enable gunicorn.service
检查服务的状态,以查看是否成功启动:
sudo systemctl status gunicorn.service
如果服务仍然无法启动,请查看服务的日志以获取更多信息:
sudo journalctl -u gunicorn.service
从外部访问你的网址吧!可以了!
设置反向代理(可选)
为了提高性能和安全性,设置一个反向代理服务器,如 Nginx,来处理静态文件、SSL 加密和负载均衡。配置 Nginx 以将请求转发到你的 Flask 应用服务器(Gunicorn 或 uWSGI)
安装和配置 Nginx
sudo apt update
sudo apt install nginx
sudo apt install nginx 这句命令不需要在虚拟环境中进行。Nginx 是一个独立的服务器软件,它通常作为系统级的服务运行,而不是在 Python 虚拟环境中运行。因此,你需要在系统的全局环境中安装 Nginx。
创建Nginx配置文件
在Nginx中,每个网站或应用通常都有一个单独的配置文件。你需要创建一个新的配置文件来定义如何代理请求到你的Flask应用。
创建一个新的Nginx配置文件,例如your_flask_app 然后,将以下内容粘贴到文件中,并根据你的设置进行调整:
server { listen 80; server_name your_server_ip_or_domain; 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 /static/ { # alias /path/to/your/flask/app/static/; # expires 30d; } # 防止Nginx处理.py文件 location ~* \.py$ { deny all; } error_log /var/log/nginx/your_flask_app_error.log; access_log /var/log/nginx/your_flask_app_access.log;
}
确保将your_server_ip_or_domain替换为你的服务器IP地址或域名,比如59.110.230.237将/path/to/your/flask/app/static/替换为你的Flask应用静态文件目录的路径。(没有就忽略)
在这个配置中,proxy_pass指令告诉Nginx将请求转发到运行在localhost:8000的Gunicorn服务器。
启用Nginx配置文件
sudo ln -s /etc/nginx/sites-available/your_flask_app /etc/nginx/sites-enabled/
在 Nginx 的配置中创建一个符号链接(symlink),用于启用一个网站或应用的配置。在 Nginx 的标准配置中,/etc/nginx/sites-available/ 目录通常包含所有可用的网站或应用的配置文件,而 /etc/nginx/sites-enabled/ 目录则包含实际被 Nginx 加载的配置文件。
这个命令的作用是将 /etc/nginx/sites-available/your_flask_app 这个配置文件链接到 /etc/nginx/sites-enabled/ 目录下,这样 Nginx 就会加载并应用这个配置。
测试Nginx配置
sudo nginx -t
重启Nginx服务
sudo systemctl restart nginx
打开浏览器并访问你的服务器的IP地址或域名。你应该能够看到你的Flask应用正在运行,并且所有请求都是通过Nginx代理到Gunicorn的。
如果Nginx正确代理了请求到Gunicorn,并且Gunicorn正确运行了你的Flask应用,那么你应该能够通过Nginx的服务器地址(而不是Gunicorn的地址)访问你的Flask应用,并且应用的行为应该与预期一致。(也就是说没加端口就能访问了喔。当然加了端口的话就是直接走Gunicorn喔)
至此,完成。如果理解有误欢迎指出。理解也是曲折发展的。先有初步的理解,然后不断修正,加深了解后形成正确的认识。
关于 Gunicorn 和 Nginx之间数据怎么流通的,进一步了解可以看这个:Gunicorn 和 Nginx之间数据流通-CSDN博客
检查Nginx日志
使用cat或tail命令查看访问日志
如:(路径看上面定义的)
tail -f /var/log/nginx/your_flask_app_error.log
tail -f /var/log/nginx/your_flask_app_access.log
Gunicorn日志下次再试。
相关文章:
Ubuntu Flask 运行 gunicorn+Nginx 部署
linux Ubuntu 下运行python 程序出现killed 原因:CPU或内存限制:在华为云上,你可能有CPU或内存使用的限制。例如,如果你使用的是一个固定大小的实例,那么超过该实例的CPU或内存限制可能会导致进程被杀死。 参考&am…...
Tuxera NTFS 2023安装使用教程 Tuxera NTFS破解版 Tuxera NTFS for Mac优惠
对于必须在Windows电脑和Mac电脑之间来回切换的Mac朋友来说,跨平台不兼容一直是一个巨大的障碍,尤其是当我们需要使用NTFS格式的硬盘在Windows和macOS之间共享文件时。因为Mac默认不支持写入NTFS磁盘。 为了解决这一问题,很多朋友会选择很便捷…...
Linux-centos如何搭建yum源仓库
1.本地搭建(无需连接外网) 1.1检查网络配置,及网络连接 打开虚拟机,点击【编辑——虚拟网络编辑器】 点击【仅主机模式】查看子网段是否和局内IP匹配 进入局内,查看网络IP是否在你上述设置的网段内,如果不…...
Vue组件中引入jQuery
两种在vue中引入jQuery的方式 1、普通html中使用jQuery 将jQuer的文件导入到项目中,然后直接使用<script src"jQuery.js"></script>即可。 <script src"jQuery.js"></script> 2、vue组件中使用jQuery 安装依赖 c…...
设计模式 --3:装扮模式
结构图 代码 #include<iostream>using namespace std;class person { public:person() {};person(string name) { this->name name; }virtual void show() {cout << "装扮的:" << this->name << endl;} private:string name; }; //装…...
element-plus中的表单校验
1. 简单校验: 1.1 在script中给出校验规则对象,主要属性名与form对象的属性名一致1.2 一个字段的校验规则可以有多个,值是一个数组,数组中的一个对象就是一条校验规则1.3 主要校验规则: 1.3.1 required:是…...
ros小问题之roslaunch tab补不全新增的功能包
在学习Gazebo这一章节时,通过catkin_create_pkg命令创建了仿真机械臂所需的软件包,创建完成后里面的内容直接拷贝了教材配套的文件,但在roslaunch时,摁tab键补不全新加的包。 重新source catkin_ws/devel/setup.bash不起作用&…...
C#常见的.Net类型(二)
目录 一、在集合中存储多个对象理解集合的选择1.列表2.字典3.堆栈4.队列5.集 二、使用Span、索引和范围Span索引范围 处理类型和属性1.特性2.创建自定义特性3.反射 一、在集合中存储多个对象 处理集合的常见类型 类型描述List动态大小的数组,可以按索引访问Dictio…...
oracle临时表空间不释放
项目报错 nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 原因是临时表空间满了,临时表空间一直增长,未释放导致临时表空间使用率100%。 查询临时表空间使用率 --临时表空间利用率…...
Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem
Chapter 13 Techniques of Design-Oriented Analysis: The Feedback Theorem 从这一章开始讲负反馈Control系统和小信号建模. 13.2 The Feedback Theorem 首先介绍 Middlebrook’s Feedback Theorem 考虑下面负反馈系统 传输函数 Guo/ui G ( s ) u o u i G ∞ T 1 T G…...
科研学习|论文解读——美国政治经济中的权力:网络分析(JASIST, 2019)
论文原题目 Power in the U.S. political economy: A network analysis 摘要 美国政治经济的许多特征产生于大型政治和经济机构之间的互动,然而我们对它们的互动性质和这些机构之间的权力分配知之甚少。在本文中,对总部设在美国的组织的网络进行了详细的…...
常用的git命令
一、常用的git命令 1. 配置 git config --local user.name "xxx" ---仅对当前Git仓库有效。配置信息将保存在当前Git仓库的 .git/config 文件中 local优先级最高,会覆盖其他范围的相同配置 git config --global user.email "xxx" ---全局…...
【AI】用iOS的ML(机器学习)创建自己的AI App
用iOS的ML(机器学习)创建自己的AI App 目录 用iOS的ML(机器学习)创建自己的AI App机器学习如同迭代过程CoreML 的使用方法?软件要求硬件开始吧!!构建管道:设计和训练网络Keras 转 CoreML将模型集成到 Xcode 中结论推荐超级课程: Docker快速入门到精通Kubernetes入门到…...
远程调用初体验笔记
远程调用初体验笔记 微服务架构通常将系统拆分成多个独立的服务单元,每个服务单元都专注于实现特定的业务功能。当一个服务需要使用另一个服务提供的功能时,就可以通过远程调用来实现。 使用步骤 1.步骤 Spring给我们提供了一个RestTemplate工具&#…...
反无人机电子护栏:原理、算法及简单实现
随着无人机技术的快速发展,其在航拍、农业、物流等领域的应用日益广泛。然而,无人机的不规范使用也带来了安全隐患,如侵犯隐私、干扰航空秩序等。为了有效管理无人机,反无人机电子护栏技术应运而生。 目录 一、反无人机电子护栏…...
Java项目利用Redisson实现真正生产可用高并发秒杀功能 支持分布式高并发秒杀
Java中的高并发秒杀场景下我们可以使用redisson来实现高并发秒杀功能, 以下就是一个可用于生产环境的高并发秒杀示例代码: pom依赖 <!-- https://mavenlibs.com/maven/dependency/org.redisson/redisson --><dependency><groupId>org.redisson</groupId&…...
0104行列式的性质-行列式-线性代数
记 D ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ D\begin{vmatrix}a_{11}&a_{12}&\cdots &a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots&&\cdots\\a_{n1}&a_{n2}&\cdots&a_{nn}\en…...
k8s HPA 自动伸缩机制 (配置,资源限制,)
目录 一、概念 核心概念 工作原理 HPA 的配置关键参数 关键组件 使用场景 注意事项 如何确保程序稳定和服务连续 二、metrics-server 部署 metrics-server 准备 metrics-server 镜像: 使用 Helm 安装 metrics-server: 配置 metrics-server: 安装 metrics-server: …...
vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)
GIT-SHELL 沙盒绕过(CVE-2017-8386)导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突,将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa,这是ssh的私钥,连接的时候请指…...
SpringBoot+vue3打造企业级一体化SaaS系统
SpringBootvue3打造企业级一体化SaaS系统 简介: 全面提升前后端技术水平,独立完成全栈项目开发能力,快速进击全栈工程师,最终在面试中脱颖而出。整合后端主流技术(Spring Boot、物理数据库隔离、加载动态权限、多…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
