Flask(3): 在Linux系统上部署项目

        1 前言

        说实话,我并不想接触linux系统,要记住太多的命令。我更习惯windows系统,鼠标点点,只要记住少量的命令就可以了。

        但是我选择了python,就注定无法逃避linux系统。虽然python也能在windows上很好的运行,但根据我的观察,python更适合在linux系统上运行(在windows上,跟C#这类语言比,感觉python就像外人)。

        既然躲不过,那就开干。就像我不想学JavaScript一样,但涉及前端就躲不开它。谁让咱是全(guang)栈(gan)开(si)发(ling)呢😂?

        我决定从流行的ubuntu开始(虽然树莓派的官方系统之前用过,不过不是当服务器用的,而且也多用的是图形界面)。

        正好我要参加一个考试,给了一个pdf题库,只要背题就可以了。作为程序员怎么可能直接在pdf里面背题呢? 做个答题系统不香吗?我决定先用ai做个简易答题系统,在ubuntu server上部署,先用起来再说。

        2 准备部署环境

        2.1 更新服务器

        确保目标服务器上的软件是最新的,使用如下命令来更新Ubuntu服务器:

sudo apt update
sudo apt upgrade

        2.2 安装python和pip

        Flask需要Python环境。确保目标服务器上安装了Python 3和pip。

sudo apt install python3 python3-pip

        一般情况下系统已经自带,无需安装。

        2.3 安装虚拟环境组件,并建立虚拟环境

        使用如下命令安装组件:

sudo apt install python3-venv

        定位到项目部署目录,执行如下命令:

python3 -m venv myprojectenv

        注意:这里的“myprojectenv”是虚拟环境所在文件夹名称,可以根据自己的需要换成其他名称。

        2.4 激活虚拟环境

        运行如下命令来激活虚拟环境:

source myprojectenv/bin/activate

        注意: 这里的“myprojectenv”是自定义的虚拟环境目录名称

        3 安装项目依赖的模块

        将项目代码上传到服务器的部署目录下,记得先在开发环境使用“pip freeze > requirements.txt”命令生成requirements.txt文件

        在服务器上已经激活的虚拟环境里安装依赖:

pip install -r requirements.txt

        4 使用tornado作为wsgi

                在项目中使用tornado模块来创建,示例如下:

        app.py的内容

from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello():return "Hello, World!"

run.py的内容

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from app import app  # 导入你的Flask应用http_server = HTTPServer(WSGIContainer(app))
http_server.listen(8000)  # 定义监听的端口
IOLoop.current().start()  # 启动事件循环

        5 运行项目

        用上面的例子,在已经激活的虚拟环境中执行如下命令来运行项目:

python run.py

        这时可以使用   http://ip地址:8000/  来访问。不过该方法的缺点是退出终端窗口后,程序也退出运行。要在后台运行,可以使用nohup命令:

nohup python run.py &

        我的答题系统运行界面如下,真的很简易:

        6 使用nginx作为反向代理

        还可以再在外面加一层反向代理,应该可以让系统更稳定可靠吧。我用的是nginx。

        6.1 安装nginx

sudo apt install nginx

        6.2 配置nginx

‌        创建Nginx配置文件‌,为该项目创建一个单独的Nginx服务器配置文件。

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

        这里的“myapp”是自定义的配置文件名称。添加的内容示例:

server {listen 80;  #监听端口server_name localhost;server_name 0.0.0.0;  #对外网开放location / {proxy_pass http://127.0.0.1:8000;  #转发的网址,即wsgi访问的地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /static/ {alias /path/to/your/app/static/;}
}

        proxy_set_header用来将原始请求的头部信息传递给后端,确保应用能获取正确的客户端ip和主机名‌

        location /static/ 定义了如何处理静态文件的请求。

        alias /path/to/your/app/static/; 表示静态文件的路径。需要将 /path/to/your/app/static/ 替换为你的应用静态文件的实际路径,例如 /home/user/myapp/static/。 这样静态文件的请求就直接在这里发给前端,无需经过后端,减小后端的压力。

        6.3 激活nginx配置

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

        以上的路径要根据实际情况替换,命令解释如下:

sudo ln -s ...  这个命令创建了一个符号链接,将你的配置文件从 sites-available 目录链接到 sites-enabled 目录,从而启用该配置。

sudo nginx -t  这个命令用于测试 Nginx 配置文件的语法是否正确。如果没有错误,它会输出 syntax is oktest is successful

sudo systemctl restart nginx  这个命令重启 Nginx 服务,使新的配置生效。

        6.4 给nginx分配访问文件的权限

        查看 Nginx 运行用户

ps aux | grep nginx

        通常 Nginx 的工作用户是 www-datanginx

        修改文件夹权限

        将 static 文件夹及其内容的所有者设置为 Nginx 用户,并确保文件夹有读取权限:

sudo chown -R www-data:www-data /path/to/your/static
sudo chmod -R 755 /path/to/your/static

        如果使用的是 nginx 用户,将上述命令中的 www-data 替换为 nginx

        检查父目录权限

        确保所有父目录(如 /path/to/your/)对 Nginx 用户开放执行权限:

sudo chmod o+x /path/to/your

        6.5 nginx的维护

一般情况下nginx服务已经运行了。可以使用“sudo systemctl restart nginx” 重启服务,还可以使用“tail -f /var/log/nginx/error.log”查看错误日志,了解运行情况。

7 后记

        虽然目前并没有使用linux系统的需求,但作为技术储备也好,发觉linux的未来发展前景也罢,总要学习一点的。

        现在部署的答题系统设计的非常简易,代码很少,基本是ai给出的,没有用户管理只支持一个人答题。计划等考完继续升级,不但支持多用户,还要能使用小程序在手机上打开,再在gitcode上开源发布。趁着这个项目,既熟悉linux系统,又能学习小程序开发和发布开源项目,可谓一举多得。

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

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

相关文章

WIN10重启开机不用登录,直接进入桌面

我们个人机不需要登录。 步骤1 置,帐户,登录选项,密码。 输入当前密码后,直接下一步。 再次重启,就会发现不需要密码了。

idea中导入从GitHub上克隆下来的springboot项目解决找不到主类的问题

第一步:删除目录下的.idea和target,然后用idea打开 第二步:如果有需要,idea更换jdk版本 原文链接:https://blog.csdn.net/m0_74036731/article/details/146779040 解决方法(idea中解决)&#…

数字友好战略视域下数字安全核心要素的理论解构与实践路径

本论文聚焦数字友好战略框架下的数字安全核心要素,系统阐述数字安全的理论内涵、战略价值与实践路径。通过多维度分析数字安全在个人、企业与国家层面的作用机制,结合国际法规标准与前沿技术实践,揭示数字安全对构建可持续数字生态的关键支撑…

管理与维护samba服务器

允许 Linux、Unix 系统与 Windows 系统之间进行文件和打印机共享,使得不同操作系统的用户能够方便地访问和共享资源,就像在同一局域网中的 Windows 计算机之间共享资源一样。 server01安装Samba服务器 [rootserver ~]# rpm -qa | grep samba [rootserver…

前端面试每日三题 - Day 8

这是我为准备前端/全栈开发工程师面试整理的第八天每日三题练习,涵盖 JavaScript 闭包与执行上下文、React 性能优化与虚拟 DOM、以及高可用消息队列架构设计。 ✅ 题目 1:深入理解 JavaScript 中的闭包与执行上下文 📘 解析: 闭…

996引擎-拓展变量:物品变量

996引擎-拓展变量:物品变量 测试代码参考资料对于Lua来说,只有能保存数据库的变量才有意义。 至于临时变量,不像TXT那么束手束脚,通常使用Lua变量就能完成。 测试代码 -- 存:物品拓展strfunction (player)local where =

现代Web应用中的高级模糊搜索实现:多条件组合查询与性能优化

搜索功能是现代Web应用中提升用户体验的核心组件。本文将深入探讨如何实现一个高效、灵活的前端模糊搜索解决方案,支持多条件组合查询、精确匹配、模糊匹配以及时间范围筛选。 需求分析与设计目标 核心需求场景 多字段模糊搜索:支持在多个字段中同时搜…

Selenium 实现自动化分页处理与信息提取

Selenium 实现自动化分页处理与信息提取 在 Web 自动化测试或数据抓取场景中,分页处理是一个常见的需求。通过 Selenium,我们可以实现对多页面内容的自动遍历,并从中提取所需的信息。本文将详细介绍如何利用 Selenium 进行自动化分页处理和信…

VS qt 联合开发环境下的多国语言翻译

添加Linguist 文件方法,如同添加类文件的方式,那样: 其他跟QT的一样的流程,另外在main函数里要注册一下, QTextCodec::setCodecForLocale(textCodec); QTranslator translator5; QString trans5 fi…

第十七节:高频开放题-React未来发展趋势

服务端组件(RSC)普及 React Compiler对开发模式的影响 React 未来发展趋势深度解析:服务端组件与编译器的革命性变革 一、服务端组件(RSC)的全面普及与生态重构 1. RSC 的核心理念与技术优势 React Server Component…

Python爬虫实战:获取B站查询数据

一、引言 1.1 研究背景 随着互联网的迅猛发展,视频分享平台积累了海量的数据资源。以 B 站为例,其丰富的视频内容和活跃的用户群体蕴含着巨大的价值。对 B 站搜索数据进行爬取和分析,有助于洞察用户兴趣、市场趋势以及内容创作方向,为市场调研、用户行为分析和内容推荐系…

【Rust 精进之路之第3篇-变量观】`let`, `mut` 与 Shadowing:理解 Rust 的变量绑定哲学

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:为数据命名,Rust 的第一道“安全阀” 在上一篇文章中,我们成功搭建了 Rust 开发环境&#xff0c…

stm32(IO口的最高速度)

如果我们写入速度 快到一种程度 肯定就不能完全按理想的来了 当我们写01快起来 中间的保持时间就会越来越少 就逐渐往下面变化 所以其实 我们如果改变上升时间 和 下降时间 还是能将最后的波形 变成为正常的波形的。 不用追求高速 ,满足要求下 选低速的即可。 因…

String +memset字符串类题型【C++】

tips: 1、寻找最大公共子串时,如果字符串可以旋转但是不能反转,考虑在每个字符串后重复一次自身,如 "abcd" 变为 "abcdabcd",这样在用dp就可以了。 如何变环拆环为链: cin>>n&…

基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(三)

上一篇 介绍了数据接入处理的整体方案设计。本篇介绍基于SmartETL框架的流程实现。 5. 流程开发 5.1.简单采集流程 从指定时间(yy年 mm月)开始,持续采集arXiv论文。基于月份和顺序号,构造论文ID,进而下载论文PDF文件…

[Swift]Xcode模拟器无法请求http接口问题

1.以前偷懒一直是这样设置 <key>NSAppTransportSecurity</key> <dict><key>NSAllowsArbitraryLoads</key><true/><key>NSAllowsArbitraryLoadsInWebContent</key><true/> </dict> 现在我在Xcode16.3上&#xff…

Python基础总结(八)之循环语句

文章目录 一、for循环1.1 for循环格式1.2 for ...else1.3 for...break1.4 for...continue 二、while循环2.1 while循环格式2.2 while...break2.3 while...continue2.4 while ...else 循环语句就如其名&#xff0c;就是重复的执行一段代码&#xff0c;直到满足退出条件时&#x…

vuex实现同一页面radio-group点击不同按钮显示不同表单

本文实现的是点击单一规格和多规格两个按钮会在页面显示不同的表单 方法一 <!-- 单规格和多规格的切换 --> <el-form label-width"80px" class"text-align-left"><el-form-item label"商品规格"><!-- 监听skus_type的改…

AI编写的“黑科技风格、自动刷新”的看板页面

以下的 index.html 、 script.js 和 styles.css 文件&#xff0c;实现一个具有黑科技风格、自动刷新的能源管理系统实时监控看板。 html页面 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name&q…

Vim使用完全指南:从基础到高效编辑

Vim使用完全指南&#xff1a;从基础到高效编辑 一、Vim简介与基本概念 Vim&#xff08;Vi IMproved&#xff09;是从vi发展出来的一个功能强大的文本编辑器&#xff0c;以其高效性和灵活性著称&#xff0c;特别适合程序开发和系统管理任务。与常规文本编辑器不同&#xff0c;…