通过shell脚本分析部署nginx网络服务(详细易懂)

通过shell脚本分析部署nginx网络服务

要求:

  1. 接收用户部署的服务名称
  2. 判断服务是否安装 
    1. 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务  
    2. 没有安装;安装对应的软件包
  3. 测试: 判断服务是否成功运行;
    • 已运行,访问网站
    • 未运行,提示服务未启动,并显示自定义的配置文件内容
  4. 以上配置没有问题,请邮件告知我,并将脚本代码(代码文件)邮件发送我                  我的邮箱账号:lxx1065372838@163.com

需求分析:

  1. 接收用户部署的服务名称
    • 接收:可以用位置变量($1)或read
    • 本次分析选择的是nginx服务,所以需要判断输入是否是nginx
  2. 判断服务是否安装,未安装进行安装
    • 使用which命令检查nginx是否已经安装
  3. 已安装;自定义网站配置路径为/www;
    • 需要创建目录/www     mkdir  -p选项确保即使父目录不存在也能创建成功
    • 建议用变量将/www赋值,因为后面需要多次用到,如果更改路径只需将变量重新赋值即可,无需多次更改
    • cat和<<EOF实现配置文件写入(创建子配置文件更改默认路径)
  4. 创建网页文件
    • 使用touch 创建后缀为.html的文件(默认为index.html)
    • 完成后重启服务
  5. 创建共享目录(nfs)
    • 判断是否安装nfs服务 
    • 若无安装,进行安装
    • 安装完后,启动nfs服务
    • 编辑配置文件(将共享目录信息添加到主配置文件)
      • 用 >> 追加
      • 主配置文件 /etc/exports
    • 创建共享文件目录,并设置权限mkdir   touch   chmod
  6. 判断服务是否成功运行
    • 四种方法(自选即可)
  7. 已运行,访问网站
    • curl 与 wget  判断是否可以成功访问
  8. 未运行,提示服务未启动,并显示自定义的配置文件内容
    • 显示之前的网页文件即可
  9. 邮箱配置,可以看我之前的博客RHCE的学习(1)
  10. 邮件发送,附带脚本代码(代码文件)
     

 准备工作:

  • 关闭防火墙(因为要与外部连接访问)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce  0

1、接收用户部署的服务名称

#!/bin/bash# 接收用户输入的服务名称
read -p "请输入要部署的服务名称: " service_name# 判断输入的服务名称是否为nginx
if [ "$service_name" != "nginx" ]; thenecho "请输入正确的服务名称(nginx)"#终止脚本运行exit 1    #更改状态码
fi

2、判断服务是否安装,未安装进行安装

解释主要命令用法:

&>:

&>是一种重定向操作符。它将标准输出(stdout)和标准错误输出(stderr)合并到一起进行重定向。

which:

用于在系统的PATH环境变量所指定的一系列目录中查找指定命令(在这里是nginx)的位置,并返回其绝对路径。

which nginx &>/dev/null

这个命令主要用于检查系统中是否能找到nginx命令,并且在检查过程中不显示任何与查找相关的输出内容,脚本可以根据这个命令的退出状态码(如果能找到nginx命令,退出状态码为 0;否则为非 0)来进一步判断nginx是否已安装或者在系统路径中有正确的配置。

#使用which命令检查nginx是否已经安装
if which nginx &>/dev/null; thenecho "Nginx已安装"elseecho "Nginx未安装,接下来将开始安装nginx"#配置挂载点mount /dev/sr0 /mntdnf install nginx -yfi

3、已安装;自定义网站配置路径为/www;

cat命令通常用于连接文件并打印到标准输出,但配合<<EOFEOF是自定义的结束标记,可以是其他标记)可以实现从标准输入读取内容并写入文件。当cat遇到<<EOF后,会将后续输入的内容作为要写入文件的内容,直到遇到单独一行的EOF结束标记为止。

# 创建自定义网站配置路径及共享目录和网页文件
web_path="/www"
#使用-p选项确保即使父目录不存在也能创建成功
mkdir -p $web_path#修改配置文件中路径
sub_config_file="/etc/nginx/conf.d/new_domain.conf"
cat > $sub_config_file <<EOF
server {listen       80;root   $web_path;  #自定义路径
}
EOF  #注意,需定格并且单独一行	

4、创建网页文件

    touch $web_path/index.htmlecho "this is test" > $web_path/index.html#然后重启服务
systemctl restart nginx

5、创建共享目录(nfs)

需先判断nfs是否安装

仅仅使用which nfs可能无法准确判断 NFS 是否安装,因为系统中不存在一个名为nfs的可执行命令来代表整个 NFS 套件。

所以我们可以通过rpm -q 命令来查询 nfs-utils 软件包是否已安装

#使用rpm命令检查nfs是否已经安装
if rpm -q nfs-utils &>/dev/null; thenecho "nfs已安装" 
elseecho "nfs未安装,接下来将开始安装nfs"dnf install nfs-utils  -y    
fi	

再继续创建共享目录

	#服务端建立共享文件目录,并设置权限nfs_path="/pub"mkdir  -p $nfs_pathtouch $nfs_path$/{1..10}chmod o+w $nfs_path#服务端编辑配置文件echo " $nfs_path     *(rw) "  >> /etc/exports  # 在后面添加以下内容#结束重启服务#若start后报错,显示启动失败,应先停止服务,在重启服务,所以建议直接用restartsystemctl restart  nfs-server

6、判断服务是否成功运行

分析:核心在于判断进程是否运行的方法?
方法1:查看进程  systemctl is-active sshd     systemctl status sshd
[root@localhost ~]# ps -elf | grep sshd | grep -v grep | wc -l
4
方法2:查看端口
本地查看netstat、ss、lsof    --- https://www.jianshu.com/p/644e75af4405
远程查看telnet、nmap、nc命令中判定服务是否运行的四种方式:#systemctl  status chronyd#ps -aux | grep shronyd#netstat -tunlp#lsof -i:123     列出打开的文件(进程),-i 指定端口

systemctl is - active nginx &>/dev/null这个命令的主要作用是检查nginx服务是否在运行,并且不显示任何与这个检查操作相关的输出信息,脚本可以根据这个命令的退出状态码来判断nginx服务的运行状态。如果命令返回 0,表示nginx服务正在运行;如果返回非 0 值,表示nginx服务没有运行。

# 测试nginx服务是否成功运行
if systemctl is-active nginx &>/dev/null; thenecho "Nginx服务已运行,可通过浏览器访问网站"
elseecho "Nginx服务未启动"echo "以下是自定义配置文件内容:"cat $web_path/index.html
fi

7、已运行,访问网站

curl

  • -o /dev/null:将curl获取到的网页内容重定向到/dev/null(即丢弃,这里我们主要关心状态码,不需要查看网页内容)。
  • -s:使curl在执行过程中不输出进度条等额外信息,保持输出简洁。
  • -w "%{http_code}\n":指定输出格式,这里是输出http状态码并换行。http状态码是一个三位数,不同的数字代表不同的访问结果。例如,200 表示访问成功,404 表示未找到页面,500 表示服务器内部错误等。
  • 如果返回的状态码是 200,则说明此次访问网站成功;如果是其他数字,则表示访问出现了相应的问题。

IP地址

  • `ifconfig`:输出网络接口信息。
  •  `grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'`:使用`grep`配合扩展正则表达式(`-E`)和只输出匹配部分(`-o`)的选项,匹配`inet`(或`inet addr:`)开头,后面跟着IP地址格式(由四个数字部分组成,每个部分由点分隔)的内容。
  • `grep -Eo '([0-9]*\.){3}[0-9]*'`:进一步过滤,只提取IP地址部分。
  • `head -n 1`:因为可能会匹配到多个IP地址(例如有多个网络接口),只取第一个匹配到的IP地址。
ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | head -n 1

方法二:

使用`ip addr show`命令(在较新的Linux系统中更推荐)

ip addr show | grep -Eo 'inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -n 1

配置:

IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | head -n 1`
curl_code=`curl -o /dev/null -s -w "%{http_code}\n" $IP`
if [ $curl_code -eq 200 ];thenecho "访问网站成功"
elseecho “访问出现了问题”
fi

8、未运行,提示服务未启动,并显示自定义的配置文件内容

    echo "Nginx服务未启动"echo "以下是自定义配置文件内容:"cat $web_path/index.html

9、邮箱配置

看我之前的博客,这次使用的是163邮箱,之前博客还有qq邮箱的详细教程

10、邮件发送,附带脚本代码(代码文件)

$0 是一个特殊的变量,在 Shell 脚本中它表示当前正在执行的脚本文件本身的名称(包含路径)

#mail -s 邮件主题
#mail -a 添加附件echo "脚本代码在附件" | s-nail -s  "分析部署nginx网络服务的脚本代码" -a "$0"  lxx1065372838@163.com

完整脚本配置:

#!/bin/bash# 接收用户输入的服务名称
read -p "请输入要部署的服务名称: " service_name# 判断输入的服务名称是否为nginx
if [ "$service_name" != "nginx" ]; thenecho "请输入正确的服务名称(nginx)"#终止脚本运行exit 1    #更改状态码
fi#使用which命令检查nginx是否已经安装
if which nginx &>/dev/null; thenecho "Nginx已安装"
elseecho "Nginx未安装,接下来将开始安装nginx"#配置挂载点mount /dev/sr0 /mntdnf install nginx -yfiif which nginx &>/dev/null; then#创建自定义网站配置路径及共享目录和网页文件web_path="/www"#使用-p选项确保即使父目录不存在也能创建成功mkdir -p $web_path#修改配置文件中路径sub_config_file="/etc/nginx/conf.d/new_domain.conf"cat > $sub_config_file  <<EOFserver {listen       80;root   $web_path;  #自定义路径}
EOF   #注意,需定格并且单独一行	#创建网页文件touch $web_path/index.htmlecho "this is test" > $web_path/index.html#然后重启服务systemctl restart nginx
fi#使用rpm命令检查nfs是否已经安装
if rpm -q nfs-utils &>/dev/null; thenecho "nfs已安装" 
elseecho "nfs未安装,接下来将开始安装nfs"dnf install nfs-utils  -y    
fi	if rpm -q nfs-utils &>/dev/null; then#服务端建立共享文件目录,并设置权限nfs_path="/pub"mkdir  -p $nfs_pathtouch $nfs_path$/{1..10}chmod o+w $nfs_path#服务端编辑配置文件echo " $nfs_path     *(rw) "  >> /etc/exports  # 在后面添加以下内容#结束重启服务#若start后报错,显示启动失败,应先停止服务,在重启服务,所以建议直接用restartsystemctl restart  nfs-server
fi# 测试nginx服务是否成功运行
if systemctl is-active nginx &>/dev/null; thenecho "Nginx服务已运行,可通过浏览器访问网站"IP=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | head -n 1`curl_code=`curl -o /dev/null -s -w "%{http_code}\n" $IP`if [ $curl_code -eq 200 ];thenecho "访问网站成功"elseecho “访问出现了问题”fi
elseecho "Nginx服务未启动"echo "以下是自定义配置文件内容:"cat $web_path/index.html
fiecho "脚本代码在附件" | s-nail -s  "分析部署nginx网络服务的脚本代码" -a "$0"  lxx1065372838@163.com

测试截图:

功能1:

接收用户部署的服务名称

功能2:

判断nginx服务是否安装,未安装进行安装

扩展:

删除服务以及其相关的依赖软件包

[root@localhost ~]# dnf remove nginx -y

功能3:

自定义网站配置路径与网页文件

功能4:

判断nginx服务是否安装,未安装进行安装(同理)

功能5:

创建共享目录

配置文件里会有多个是因为我脚本执行了两次

功能6:

判断服务是否成功运行

测试未运行需在脚本重启nginx服务后面加个停止服务即可

功能7:

浏览器测试网页

功能8:

测试邮件是否可以发送

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解

随着技术的不断进步和5G网络的推广&#xff0c;中国流媒体播放器行业市场规模以及未来发展趋势都将持续保持稳定的增长&#xff0c;并将在未来几年迎来新的发展机遇。流媒体播放器将继续作为连接内容创作者和观众的重要桥梁&#xff0c;推动数字媒体产业的创新和发展。 EasyPla…

【 LVGL】用外部FLASH存储字库并显示

LVGL–用外部FLASH存储字库并显示 应用场景 由于使用的芯片内部FLASH空间有限&#xff0c;如果仅使用英文字库并用不了多少空间&#xff0c;但是项目需要支持中英文字库&#xff0c;中文字库添加2w字左右&#xff0c;10px大小就要1M多了&#xff0c;内部空间根本不够用&#…

含284个数据集,覆盖18项临床任务,上海AI Lab等发布多模态医疗基准GMAI-MMBench

「有这样一台智能医疗设备&#xff0c;患者只需躺在智能医疗设备上便可完成从扫描、诊断、治疗、修复的全过程&#xff0c;实现健康的重启」。这是 2013 年上映的科幻电影「极乐空间」中的一个情节。 电影《极乐空间》场景 如今&#xff0c;随着人工智能技术的飞速发展&#xf…

Java-04

目录 Redis如何实现延时队列 延时队列的组成 生产消息 消费消息 实现细节 Redis集群 Integer.compare(a[1], b[1]))与a[1] - b[1]) 设计模式​编辑 算法 Redis如何实现延时队列 使用 sortedset &#xff0c;拿时间戳作为 score &#xff0c;消息内容作为 key 调用 zad…

【C++】— 掌握STL vector 类:“Vector简介:动态数组的高效应用”

文章目录 1.vector的介绍和使用1.1vector的介绍1.2 vector的特点1.3vector的使用1.3.1vector的定义1.3.2vector iterator的使用1.3.3vector 的空间增长问题1.3.4 vector 的增删查改1.3.5vector 迭代器失效问题 1.vector的介绍和使用 1.1vector的介绍 vector是一个顺序容器&am…

CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow

简介&#xff1a; 1.伸缩盒模型简介 2.伸缩容器、伸缩项目 3-4.主轴方向 5.主轴换行方式 6.复合属性flex-flow 7.主轴的对齐方式

互联网数字化商品管理浪潮思考:从信息化到精准运营

目录 一、商品数字化转型面临的现状分析 &#xff08;一&#xff09;运营方向分析 &#xff08;二&#xff09;商品归类分析 二、商品数字化管理建设分析 三、基础建设——商品信息数字化 &#xff08;一&#xff09;商品信息质量数字化的目的 &#xff08;二&#xff0…

STL关联式容器之RB-tree(红黑树)

AVL-tree之外&#xff0c;另一个颇具历史并被广泛运用的平衡二叉搜索树是RB-tree&#xff08;红黑树&#xff09;。所谓RB-tree&#xff0c;不仅是一颗二叉搜索树&#xff0c;而且必须满足一下规则&#xff1a; 1&#xff1a;每个节点不是红色就是黑色 2&#xff1a;根节点为…

电脑系统重装小白教程

​对于很多电脑用户来说&#xff0c;系统出现故障或者需要清理时&#xff0c;重装系统是一项不可避免的操作。但是&#xff0c;对于没有技术基础的小白用户而言&#xff0c;重装系统可能会显得复杂且困难。本文将为您提供一份简洁易懂的电脑系统重装教程&#xff0c;帮助您顺利…

使用Ollama和Open WebUI管理本地开源大模型

Open WebUI和Ollama介绍 Open WebUI 是一个功能丰富且用户友好的自托管 Web 用户界面&#xff08;WebUI&#xff09;&#xff0c;它被设计用于与大型语言模型&#xff08;LLMs&#xff09;进行交互&#xff0c;特别是那些由 Ollama 或与 OpenAI API 兼容的服务所支持的模型。O…

Nmap识别MongoDB 6.0指纹

Nmap识别MongoDB 6.0指纹 朋友反馈一个问题&#xff0c;说使用Nmap扫描MongoDB服务时对于6.0以上的版本默认无法识别到服务版本信息。 如上图所示&#xff0c;对应的VERSION信息是空的&#xff0c;在提示信息中可以看到&#xff0c;官方推荐将指纹信息上传以帮助更新服务指纹&…

向量搜索工具之 Milvus vs. Elastic

在当今数据驱动的世界中&#xff0c;向量数据库因其在处理大规模非结构化数据方面的卓越能力而变得越来越重要。随着数据量的爆炸性增长&#xff0c;如何确保这些数据库在存储和检索数十亿数据点时仍能保持高性能&#xff0c;成为了一个关键挑战。 Milvus和Elasticsearch都是管…

Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集 日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故…

每日学习记录003:(C++)unique_ptr和shared_ptr

每日学习记录003&#xff1a;&#xff08;C&#xff09;unique_ptr和shared_ptr 在C中&#xff0c;unique_ptr和shared_ptr都是智能指针&#xff0c;它们为动态内存管理提供了更安全、更方便的方式。 一、unique_ptr的特点 &#xff08;一&#xff09;独占所有权 unique_pt…

免费实用的图片加水印工具

高度自定义的图片加水印工具 因工作需要和朋友的需求&#xff0c;我基于canvas开发了这款图片加水印工具。 地址&#xff1a;https://potatotools.top/toolsEntrance/pic/ImageWatermark.vue.html 功能亮点 尺寸定制 &#xff0c;轻松调整水印宽高&#xff0c;精准适配每张图…

数字化工厂 MES 成功之艰:深度剖析与探究

系统集成的复杂性 多源异构系统对接难题 在数字化工厂的建设进程中&#xff0c;MES&#xff08;制造执行系统&#xff09;处于核心枢纽地位&#xff0c;需与众多不同来源、不同架构的系统进行集成。企业内部往往早已部署了诸如企业资源计划&#xff08;ERP&#xff09;系统、…

kimi 大模型 API 接口实现大模型对话 - python 实现

kimi API接口实现大模型对话 - python 实现&#xff0c;具体代码如下&#xff1a; 注意&#xff1a;api_key 需要kimi官网注册后创建。 from openai import OpenAI if __name__ __main__:client OpenAI(api_key "sk-***********", # $MOONSHOT_API_KEY 官网注册…

服务器被隔离导致无法登录

现象描述 云服务器可能会因安全违规&#xff08;内容或行为违规&#xff09;或因 DDoS 攻击被封堵隔离&#xff0c;被隔离的云服务器在控制台显示为 “BANNING” 状态。 云服务器被隔离可能由于该台服务器违反了当前法律法规的要求。您可以通过以下方式查看该台服务器是否处于…

PaddleNLP的环境配置:

PaddleNLP的环境配置&#xff1a; conda create -n paddle—test python3.9conda activate paddle—testpython -m pip install paddlepaddle-gpu2.6.1.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html(paddle—test) (venv) PS D:\work\论文写…

物联网研究实训室建设方案

一、引言 随着物联网技术的快速发展&#xff0c;其在各个行业的应用越来越广泛&#xff0c;对物联网专业人才的需求也日益增加。为满足这一需求&#xff0c;建设一个符合现代化教学需求的物联网研究实训室&#xff0c;对于提高学生的实践能力和创新能力具有重要意义。本方案旨…