当前位置: 首页 > news >正文

Web服务器部署上线踩坑流程回顾

5月份时曾部署上线了C++的Web服务器,温故而知新,本篇文章梳理总结一下部署流程知识;

  • 最初的解决方案:https://blog.csdn.net/BinBinCome/article/details/129750951?spm=1001.2014.3001.5501
  • 后来的解决方案:https://blog.csdn.net/BinBinCome/article/details/129796690?spm=1001.2014.3001.550

以下是本文的大概内容思维导图:
在这里插入图片描述

一、最初的解决方案

原理:
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

方法1:进程忽略HUP信号

命令:
nohup (no hang up,不挂起):用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
使用:

nohup ./IM_chat >> IMchat.log 2>&1 &- ./IM_chat : 当前文件目录下的新坑项目可执行文件- >> IMchat.log 2>&1: 将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 IMchat.log 文件中- & : 让命令在后台执行,终端退出后命令仍旧执行

其他知识:
1、Linux中的0、1、2: 0是standard input,标准输入,1是standard output,标准输出,2是standard error,标准错误输出
2、停止运行进程的方法:
ps -aux | grep “IM_chat”
Kill - 9 进程号PID
AI回答版知识:
在Linux中,0、1、2是特殊文件描述符,用于表示标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。它们在I/O重定向和管道操作中起着重要的作用。

  1. 标准输入(stdin):文件描述符0,通常与键盘输入相关联。当程序需要从用户获取输入时,可以读取标准输入流来接收用户的输入数据。例如,通过命令行输入或从终端读取数据。
  2. 标准输出(stdout):文件描述符1,通常与显示器相关联。当程序产生输出时,默认会将输出内容发送到标准输出流,并在终端上显示。可以通过重定向操作将标准输出流重定向到文件,以便将输出保存在文件中。
  3. 标准错误(stderr):文件描述符2,通常也与显示器相关联。与标准输出类似,但标准错误流用于输出错误和警告消息,而不是正常的程序输出。通常,错误消息会直接打印到终端上,而不受标准输出重定向的影响。
    这些概念涉及到Linux的输入输出(I/O)机制和文件描述符的概念:
  • 输入输出(I/O):指计算机系统与外部设备之间的数据交换过程。在Linux中,输入可以来自键盘、文件或其他进程的输出。输出可以显示在终端、写入文件或发送给其他进程。
  • 文件描述符:在Linux中,每个打开的文件(包括设备和管道)都与一个唯一的整数标识符相关联,称为文件描述符。0、1和2是预定义的文件描述符,分别对应标准输入、标准输出和标准错误。
  • I/O重定向:通过重定向操作,可以改变程序默认的输入或输出位置。使用特殊的符号(如<、>和>>)将输入/输出从一个源/目标指向另一个源/目标。例如,将命令的输出重定向到文件,或从文件中读取输入而不是键盘。
  • 管道操作:管道允许将一个进程的输出直接传递给另一个进程的输入,以实现进程间通信。通过使用|符号,可以将一个命令的输出连接到另一个命令的输入,形成一个管道链。
    这些机制使得在Linux系统中可以方便地控制输入和输出流,以及处理输入输出的重定向和管道操作,从而增强了程序的灵活性和可扩展性。

方法2:进程运行在新会话

服务跑起来后,过了段时间访问自己的写的webserver服务器里放的个人主页页面发现竟然挂了!于是检查日志没发现啥问题,于是尝试让进程运行在新会话的方法;
screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。如果有大量命令需要在稳定的后台里运行,可以避免对每条命令都做这样的操作;

yum -y install   screen                # 安装screen
screen -dmS sessionname         # 建立一个处于断开模式下的会话,sessionname可更改为自己的服务名
screen -list                                 # 列出所有会话,查看是否建立会话
screen -r sessionname                 # 重新连接指定会话,运行自己的服务

用快捷键CTRL + a + d 来暂时断开当前会话。退出终端连接,查看服务是否稳定运行

本次最初方案即srceen中组合nohup加上&的组合拳,终极版还能加上systemctl配置开机自启!的参考文章:

  • https://www.linuxprobe.com/process-run-in-background.html
  • https://blog.csdn.net/Pan_peter/article/details/128875714

二、后来的解决方案

平稳运行大概大半个月后,偶然发现服务又挂了,不能忍了个人主页谁天天看在不在运行啊!直接上脚本每一段时间自动检测一下服务是否运行中,没运行的话就重启一下!(以下脚本可自己定义去修改,非正式使用脚本)

#!/bin/shwhile truedops -ef | grep "temporaryfile" | grep -v "grep"
#查找系统中含有"temporaryfile"字符的进程,并且排除grep本身的进程。
if [ "$?" -eq 1 ]
#如果未运行
thenpython3 /home/xxx/xxxxxx.py
#启动应用,修改成自己的启动应用脚本或命令echo "process has been restarted!"elseecho "process already started!"fisleep 60done

参考文章:https://zhuanlan.zhihu.com/p/599421452

三、最后的思考

虽然脚本的办法挺不错的,服务一直运行到今天2023/9/3都没有挂过,但是不由得思考两个问题
1、最开始的webserver服务为什么会挂掉?看日志也没有分析出原因
2、大型企业的后台服务是怎样运行维护的呢?不至于我这样一个一个的手动启动和查进程关闭或者使用脚本吧

ai回答:
大型公司的后台Linux部署通常采用更为复杂和全面的解决方案。这些解决方案可能包括:

  1. 容器化技术:使用容器技术(如Docker)将应用程序和其依赖项打包成可移植的容器镜像,从而实现隔离和可扩展性。
  2. 自动化部署:使用自动化工具(如Ansible、Chef或Puppet)来管理和部署服务器和应用程序,实现快速、可靠的部署过程。
  3. 高可用性和负载均衡:使用负载均衡器和集群管理工具,确保系统的高可用性和可扩展性。
  4. 日志和监控:使用日志记录和监控工具(如ELK堆栈、Prometheus、Grafana等)来收集、分析和监视系统的运行情况,以及进行故障排除和性能优化。

服务挂掉的原因由于时间久远(大概几个月前)很难追溯了,但是第二个问题却是可以继续推动无限进步!

1、Docker技术: 看完了w3c教程成功入门并用其搭建vulhub靶场过;https://www.w3cschool.cn/docker/docker-command-manual.html
2、自动化部署工具: K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,这个看来得学学了;
3、负载均衡和高可用 : 负载均衡集群–知乎,打开新世界大门原来负载均衡技术的实现除了我知道的nginx软件技术以外还有硬件技术的实现;
4、日志和监控工具:Elastic Stack(Elasticsearch Logstash 和 Kibana)
Elastic Stack,通常缩写为ELK,是一种流行的三合一日志集中、解析和可视化工具,可将来自多台服务器的大量数据和日志集中到一台服务器中。
ELK Stack 包含 3 种不同的产品:
Logstash
Logstash是一个免费的开源数据管道,它收集日志和事件数据,甚至处理数据并将其转换为所需的输出。使用名为“ beats ”的代理将数据从远程服务器发送到logstash。“ beats ”将大量系统指标和日志发送到Logstash,然后对其进行处理。然后它将数据提供给Elasticsearch。
弹性搜索
Elasticsearch基于Apache Lucene构建,是一个开源分布式搜索和分析引擎,适用于几乎所有类型的数据——包括结构化和非结构化数据。这包括文本、数字和地理空间数据。
它于 2010 年首次发布。Elasticsearch是ELK堆栈的核心组件,以其速度、可扩展性和 REST API 着称。它存储、索引和分析从Logstash传递的大量数据。
Kibana
数据最终传递给Kibana,这是一个与Elasticsearch一起运行的 WebUI 可视化平台。Kibana允许您探索和可视化来自 elasticsearch 的时间序列数据和日志。它在直观的仪表板上可视化数据和日志,这些仪表板采用各种形式,例如条形图、饼图、直方图等。

要学的东西还有很多啊,无限进步! 以下是一些参考文章。

参考文章:

  1. https://zhuanlan.zhihu.com/p/604456459#:~:text=6%E4%B8%AA%E6%AF%94%E8%BE%83%E5%A5%BD%E7%94%A8%E7%9A%84%E5%BC%80%E6%BA%90%E9%9B%86%E4%B8%AD%E5%BC%8F%E6%97%A5%E5%BF%97%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7%201%201%E3%80%81ManageEngine%20Log360%202%202%E3%80%81Elastic%20Stack%EF%BC%88Elasticsearch%20Logstash,3%203%E3%80%81Graylog%204%204%E3%80%81Fluentd%205%205%E3%80%81LOGalyze%206%206%E3%80%81NXlog
  2. https://zhuanlan.zhihu.com/p/231806045#%E9%9B%86%E7%BE%A4%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F
  3. https://zhuanlan.zhihu.com/p/38982164
  4. https://kubernetes.io/

相关文章:

Web服务器部署上线踩坑流程回顾

5月份时曾部署上线了C的Web服务器&#xff0c;温故而知新&#xff0c;本篇文章梳理总结一下部署流程知识&#xff1b; 最初的解决方案&#xff1a;https://blog.csdn.net/BinBinCome/article/details/129750951?spm1001.2014.3001.5501后来的解决方案&#xff1a;https://blog…...

目标检测YOLO实战应用案例100讲-基于卷积神经网络的小样本机载雷达动目标检测

目录 前言 机载雷达动目标检测方法及深度学习理论基础 2.1引言 2.2机载雷达回波信号模型...

SpringBoot 的 MVC

1.1 MVC定义 MVC是Model、View、Controller的缩写&#xff0c;它是软件工程当中的一种软甲架构模式&#xff0c;它把软件系统分为模型 Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据View&#xff08;视图&#xff09;是应用程…...

springboot上线打包+vuecli2部署在linux服务器上(打包上线)

这里也是记录一下springboot的上线打包流程,我这里前端使用的是vuecli2 springboot的依赖是2.7.9的版本 前端是使用的vue2 打包前,你的linux上必须要先安装,tomcat\java\nginx springboot打包 springboot打包点击一下,等maven编译打包成功在target文件下找到,jar包, 然后,把j…...

Postern配置HTTP和HTTPS的步骤

Postern是一款强大的Android代理工具&#xff0c;它允许您在设备上配置全局代理来实现安全、隐私保护和自由上网。本文将详细介绍如何使用Postern在Android设备上配置HTTP和HTTPS代理&#xff0c;为您提供更便捷的上网体验。 步骤1&#xff1a;下载和安装Postern应用 首先&am…...

DataTableResponseEntity

/// <summary>/// DataTable数据集合返回实体/// </summary>[Serializable]public sealed class DataTableResponseEntity : IResponse{private readonly DataTable sourceTable;private readonly int PageCount;private readonly int totalCount;private readonly…...

Python爬虫(十八)_多线程糗事百科案例

多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:https://cloud.tencent.com/developer/article/1021994 Queue(队列对象) Queue是python中的标准库&#xff0c;可以直接import Queue引用&#xff1b;队列时线程间最常用的交互数据的形式。 python下多线程的思考…...

无穷级数重要知识点

部分和 s ∑ i 1 n u i s \sum_{i1}^{n} u _{i} si1∑n​ui​ 注意&#xff1a;部分和不是数列的一部分之和&#xff0c;而是一个极限的概念&#xff0c;此处的n是一个极限值&#xff0c; n 趋于正无穷&#xff01; \color{red}n趋于正无穷&#xff01; n趋于正无穷&#x…...

【MyBatis】快速入门

1、简介 MyBatis是一个持久化、轻量级的半自动化ORM框架&#xff0c;封装了所有JDBC的原始操作。查询参数以及获取结果集等。 1.1 原始JDBC操作存在的问题 &#xff08;1&#xff09;数据库连接、释放频繁造成系统资源浪费&#xff0c;影响系统性能 &#xff08;2&#xff09;…...

【gtpJavaScript】使用JavaScript实现套壳gtp与gtp打字输出效果

postman测试gtp接口 https://platform.openai.com/docs/api-reference/chat/create?langcurl 导入到postman中 记得弄一个gtp的key 然后请求测试gtp接口&#xff1a; 纯前端实现gtp请求页面 目录结构&#xff1a; 部分参考&#xff1a;GitHub - xxxjkk/chat-website: 简易版c…...

C++内存管理(2)new、delete详解

目录 new operator&#xff08;new操作&#xff09; new类对象时加不加括号的差别 new工作任务 delete工作任务 new和delete 堆区空间操作&#xff08;对比malloc和free&#xff09; new和delete操作基本类型的空间 new和delete操作基本类型的数组 new和delete操作类的…...

ELK集群搭建流程(实践可用)

一、概述 ELK 是一个由三个开源软件工具组成的数据处理和可视化平台&#xff0c;包括 Elasticsearch、Logstash 和 Kibana。这些工具都是由 Elastic 公司创建和维护的。 Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;可以将大量数据存储在一个或多个节点上&#xf…...

react-quill富文本 中文输入法触发change问题

使用的富文本是编辑器 react-quill 需求&#xff1a; 点击按钮插入自定义颜色文字&#xff0c;然后手动输入为正常颜色。 问题&#xff1a; quill组件把带颜色的字体创建个dom, 临近的文字都会整合进一个dom中&#xff0c;导致输入的文字和插入的带颜色 都统一成一个颜色了…...

Upload-labs 1~15 通关详细教程

文章目录 Upload-labs 1~15 通关详细教程Pass-01-前端js验证Pass-02-后端MIME验证Pass-03-黑名单验证Pass-04-黑名单验证.htaccessPass-05-文件后缀名大小写绕过Pass-06-文件后缀名空格绕过Pass-07-文件后缀名点绕过Pass-08-文件后缀名::$DATA绕过Pass-09-点空格点空格绕过Pass…...

ChatGPT分析日本排放核污水对世界的影响

文章目录 1 背景2 环境影响3 健康影响4 国际关系影响5 应对措施 近段时间被日本排放核污水到海里的消息刷屏了&#xff0c;这一举措引发了广泛的关注和担忧。本文结合ChatGPT来分析这件事的前因后果、会对世界造成的影响、以及应对措施。 1 背景 受2011年发生的大地震及海啸影响…...

eclipse进入断点之后,一直卡死,线程一直在运行【记录一种情况】

问题描述: 一直卡死在某个断点处&#xff0c;取消断点也是卡死在这边的进程处。 解决方式&#xff1a; 将JDK的使用内存进行了修改 ① 打开eclipse&#xff0c;window->preference->Java->Installed JREs&#xff0c;选中使用的jdk然后点击右侧的edit&#xff0c;在…...

2.5 动态字符串 String (完整源码)

C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 本文的实现基本上和 动态数组 vector 是一样的。 因为大部分接口都一样。 所以&#xff0c;本文就直接给出全部的源码和运行结果。 //------下面的代码是用来测试你的代码有没有问题的辅助代码…...

Ansible之变量

一&#xff09;Ansible变量介绍 我们在PlayBook⼀节中&#xff0c;将PlayBook类⽐成了Linux中的shell。 那么它作为⼀⻔Ansible特殊的语⾔&#xff0c;肯定要涉及到变量定义、控 制结构的使⽤等特性。 在这⼀节中主要讨论变量的定义和使⽤ 二&#xff09;变量命名规则 变量的…...

自动化测试面试常见技术题目

1&#xff1a;一行代码实现1--100之和 print(sum(list(range(1,101)))) 2&#xff1a;如何在一个函数内部修改全局变量 global  修改全局变量 局部作用域只能调用全局作用域的变量&#xff0c;但是不熊修改全局作用域的变量&#xff0c;如果想要修改全局作用域的变量需要gl…...

aarch64 arm64 部署 stable diffusion webui 笔记 【2】继续安装其他依赖 gfpgan

接上篇 aarch64 arm64 部署 stable diffusion webui 笔记 【1】准备 venv 安装pytorch 验证cuda_hkNaruto的博客-CSDN博客 编辑requirements_versions.txt&#xff0c;注释掉torch 启动webui.sh (venv) [rootceph3 stable-diffusion-webui]# useradd yeqiang useradd&#xf…...

使用ECS和RDS部署WordPress,搭建个人博客并使用域名访问

目录 一、准备工作 1、准备ECS服务器 2、创建数据库账号和密码 二、部署环境 1、远程连接 2、安装Apache服务 3、部署WordPress 三、对博客的优化并使用域名访问 1、博客的设计优化 1.1 插件的使用 1.2 博客的设计介绍 2、使用域名访问 四、个人博客部署的心得 1…...

C# Winform 简单排期实现(DevExpress TreeList)

排期的需求在很多任务安排的系统中都有相应的需求&#xff0c;原生的Winform控件并未提供相应的控件&#xff0c;一般都是利用DataGridViewTreeView组合完成相应的需求&#xff0c;实现起来比较麻烦。用过DevExpress控件集的开发者应该知道&#xff0c;DevExpress WinForm提供了…...

2023高教社杯国赛数学建模C题思路+模型+代码(9.7晚开赛后第一时间更新)

目录 1.C题思路模型&#xff1a;9.7晚上比赛开始后&#xff0c;第一时间更新&#xff0c;获取见文末名片 2.竞赛注意事项&#xff1a;包括比赛流程&#xff0c;任务分配&#xff0c;时间把控&#xff0c;论文润色&#xff0c;已经发布在文末名片中 3.常用国赛数学建模算法 …...

QT6中添加串口模块SerialPort最简单方法

qt6.2.3以上版本已经开始支持SerialPort包了&#xff0c;不用在傻傻的自己去编译包了。 在安装的时候勾选SerialPort即可。 等着安装完即可。 如果已经安装完了的小伙伴&#xff0c;可以用 从新打开维护 选择增加或者删除组件 即可从新选择组件...

LeetCode每日一题:1123. 最深叶节点的最近公共祖先(2023.9.6 C++)

目录 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 原理思路&#xff1a; 1123. 最深叶节点的最近公共祖先 题目描述&#xff1a; 给你一个有根节点 root 的二叉树&#xff0c;返回它 最深的叶节点的最近公共祖先 。 回想一下&…...

Oracle查看锁表和正在执行的Sql

查看当前被锁的表&#xff08;需要有管理员权限&#xff09;&#xff1a; --查看锁表进程SQL语句1&#xff1a; select sess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_modefrom v$locked_object lo, dba_objects ao, v$session sesswh…...

Linux centos 卸载 ceph

在CentOS上卸载Ceph的操作步骤&#xff1a; 1. 停止Ceph集群&#xff1a;首先&#xff0c;你需要停止Ceph集群中的所有服务。在每个节点上运行以下命令来停止所有服务 systemctl stop ceph.target 2. 卸载Ceph软件包&#xff1a;在每个节点上&#xff0c;使用yum包管理器卸载C…...

ElementUI浅尝辄止34:Radio 单选框

在一组备选项中进行单选 1.如何使用&#xff1f; 由于选项默认可见&#xff0c;不宜过多&#xff0c;若选项过多&#xff0c;建议使用 Select 选择器。 //要使用 Radio 组件&#xff0c;只需要设置v-model绑定变量&#xff0c;选中意味着变量的值为相应 Radio label属性的值&…...

开始MySQL之路——MySQL三大日志(binlog、redo log和undo log)概述详解

前言 MySQL实现事务、崩溃恢复、集群的主从复制&#xff0c;底层都离不开日志&#xff0c;所以日志是MySQL的精华所在。只有了解MySQL日志&#xff0c;才算是彻底搞懂MySQL。 日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包…...

router基础使用

1.安装router npm i vue-router3 安装后 2.写出路由界面 接着 3.配置路由 import Vue from vue import VueRouter from vue-router import Home from "../views/Home.vue" import About from "../views/About.vue" Vue.use(VueRouter)const routes …...