Web服务器部署上线的踩坑流程回顾与知新
5月份时曾部署上线了C++的Web服务器,温故而知新,本篇文章梳理总结一下部署流程知识;
以下是本文的大概内容思维导图:

一、最初的解决方案
原理:
当用户注销(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重定向和管道操作中起着重要的作用。
- 标准输入(stdin):文件描述符0,通常与键盘输入相关联。当程序需要从用户获取输入时,可以读取标准输入流来接收用户的输入数据。例如,通过命令行输入或从终端读取数据。
- 标准输出(stdout):文件描述符1,通常与显示器相关联。当程序产生输出时,默认会将输出内容发送到标准输出流,并在终端上显示。可以通过重定向操作将标准输出流重定向到文件,以便将输出保存在文件中。
- 标准错误(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/sh
while true
do
ps -ef | grep "temporaryfile" | grep -v "grep"
#查找系统中含有"temporaryfile"字符的进程,并且排除grep本身的进程。
if [ "$?" -eq 1 ]
#如果未运行
then
python3 /home/xxx/xxxxxx.py
#启动应用,修改成自己的启动应用脚本或命令
echo "process has been restarted!"
else
echo "process already started!"
fi
sleep 60
done
参考文章:https://zhuanlan.zhihu.com/p/599421452
三、最后的思考
虽然脚本的办法挺不错的,服务一直运行到今天2023/9/3都没有挂过,但是不由得思考两个问题
1、最开始的webserver服务为什么会挂掉?看日志也没有分析出原因
2、大型企业的后台服务是怎样运行维护的呢?不至于我这样一个一个的手动启动和查进程关闭或者使用脚本吧
ai回答:
大型公司的后台Linux部署通常采用更为复杂和全面的解决方案。这些解决方案可能包括:
- 容器化技术:使用容器技术(如Docker)将应用程序和其依赖项打包成可移植的容器镜像,从而实现隔离和可扩展性。
- 自动化部署:使用自动化工具(如Ansible、Chef或Puppet)来管理和部署服务器和应用程序,实现快速、可靠的部署过程。
- 高可用性和负载均衡:使用负载均衡器和集群管理工具,确保系统的高可用性和可扩展性。
- 日志和监控:使用日志记录和监控工具(如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 的时间序列数据和日志。它在直观的仪表板上可视化数据和日志,这些仪表板采用各种形式,例如条形图、饼图、直方图等。
要学的东西还有很多啊,无限进步! 以下是一些参考文章。
参考文章:
- https://zhuanlan.zhihu.com/p/604456459#:~:text=6个比较好用的开源集中式日志管理工具 1 1、ManageEngine Log360 2 2、Elastic Stack(Elasticsearch Logstash,3 3、Graylog 4 4、Fluentd 5 5、LOGalyze 6 6、NXlog
- https://zhuanlan.zhihu.com/p/231806045#集群是什么?
- https://zhuanlan.zhihu.com/p/38982164
- https://kubernetes.io/
Web服务器部署上线的踩坑流程回顾与知新的更多相关文章
- Gitbook部署之nodejs踩坑
title: Gitbook部署之nodejs踩坑 date: 2020-11-06 16:34:30 summary: Gitbook部署和NVM的使用.hexo失效 Gitbook部署之nodej ...
- web服务器部署过程记录
由于之前没有服务器部署经验,又选择了所有软件都是单独编译安装,遇到很多问题,解决之后还是学习到了很多新东西. 如今回过头来还是选择lnmp集成环境的部署方式比较方便快捷:https://lnmp.or ...
- web前端生成图片之探索踩坑
前段时间,产品和运营整了个非常变态的需求,要求将一个活动页面输出为图片,然后用户进行分享 开始以为是用户自己手动截图分享,没想到后来不是,细思极恐,感叹需求之变态. 从网上找了N个方案,最后确定使用 ...
- Web服务器部署浅析
企业内网站 中小型企业一般将企业宣传网站外包给第三方进行统一设计.部署和运维.大型企业因为访问量和数据量有所增加,部分网站可能具备在线咨询或订单的功能,此类Web服务器采用最通用的IU机架式服务器以降 ...
- Solr 7 部署与使用踩坑全记录
前言 Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持层面搜索.命中醒目显示和多种输出格式.在这篇文章中,我将介绍 Solr 的部署和使用的基本操作,希望能让初次使用的朋友们少 ...
- web项目部署上线(无虚拟主机,待学习)
购买阿里云服务器 阿里云服务器ECS 系统镜像使用Ubuntu 20.04 LTS 使用ssh连接服务器,终端或者CMD中执行:$ssh root@x.x.x(阿里云服务器账号名@公网地址) 输入账号 ...
- gitolite服务器部署中的一些坑
1.秘钥登录问题可参考< 安装gitolite,并ssh公钥无密码登录>http://www.cnblogs.com/tr0217/p/4517952.html,该文中推荐了阮一峰的< ...
- web服务器部署
1.控制面板---打开关闭Windows服务功能---Interner信息服务--全选中 2.控制面板---防火墙--关闭防火墙---允许程序通过Windows防火墙---勾选“万维网服务http” ...
- 【web】docker复现环境踩坑
在先知看到有师傅发了个学习 P 牛的代码审计的文章,在 github 上下下来复现环境,结果 docker 各种问题,气死 安装 docker-compose:pip install -i https ...
- 外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
随机推荐
- 牧云 • 主机管理助手|正式开放应用市场,梦幻联动雷池WAF等多款开源软件
0x00 前言 上个月,我司长亭开源了雷池WAF,不到三天就吸引了超过上千个师傅使用,几个交流群里,师傅们讨论的热火朝天,其中两个话题引起了我们牧云 • 主机管理助手 ( Collie ) 团队的关注 ...
- 我借助 AI 神器,快速学习《阿里的 Java 开发手册》,比量子力学还夸张
我平时经常要看 PDF,但是我看书贼慢,一个 PDF 差不多几十上百页,看一遍要花挺长时间. 我记性还不好,看完之后,过些日子就记不清 PDF 是讲什么的了.为了找到 PDF 里的某些信息,又得再花时 ...
- Python modbus_tk 库源码分析
modbus_tk 源代码分析 前言 modbus_tcp 协议是工业项目中常见的一种基于 TCP/IP 协议的设备数据交互协议. 作为 TCP/IP 协议的上层协议,modbus_tcp 协议涉及到 ...
- 【技术积累】JavaSciprt中的函数【一】
什么是函数?如何声明函数? JavaScript中的函数是一段可重复使用的代码块,它可以接受输入并返回输出. 在JavaScript中,函数是一种特殊的对象,因此可以将其存储在变量中,将其作为参数传递 ...
- 【Netty】一个RPC实例
Netty实现简易RPC调用 总体流程: 客户端发起rpc调用请求,封装好调用的接口名,函数名,返回类型,函数参数类型,函数参数值等属性,将消息发送给服务器. 服务器的handler解析rpc请求,调 ...
- 代理详解(java代理和CGLIB动态代理)
[代理]大家都知道,特别是在spring中aop.spring中的事务.spring解析注解@Configuration,以及最原始的解析spring.xml的配置,这些都是使用代理来进行实现的, ...
- 探秘高逼格艺术二维码的制作过程-AI绘画图生图
在之前的文章<AI制作艺术二维码-文生图>中,我介绍了一种直接通过提示词生成高逼格二维码的方法,但是通过提示词我们无法很好的控制生成图片的样式,特别是有些同学想要将自己的Logo或者头像附 ...
- APP流水线测试领域探索与最佳实践
1 背景 APP端UI自动化因其特殊性(需连接测试机)一般都在本地执行,这种执行方式的局限性有以下弊端: 时效性低:研发每次打包后都需要通知测试,测试再去打包平台取包,存在时间差 研发自测或产品验收无 ...
- Hexo博客Next主题valine评论系统邮件提醒
简介 Valine:一款快速.简洁且高效的无后端评论系统. Valine-Admin Github 项目地址,具体教程以 最新版 为准 Valine-Admin项目地址 简介 Valine Admin ...
- C语言基础-基础指针
文章目录 指针 前言 1.什么是指针 2.指针的使用 (1)指针的定义 (2)指针的赋值 (3)指针类型 (4)如何使用指针 3.野指针 (1)导致野指针的原因 ① 未初始化指针 ②指针越界访问 ③指 ...