通过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" ]; then
    echo "请输入正确的服务名称(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; then
    echo "Nginx已安装"
    
 
else
    echo "Nginx未安装,接下来将开始安装nginx"
    #配置挂载点
    mount /dev/sr0 /mnt
    dnf install nginx -y
    
fi

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.html
    echo "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; then
    echo "nfs已安装" 
else
    echo "nfs未安装,接下来将开始安装nfs"
    dnf install nfs-utils  -y    
fi	

再继续创建共享目录

	#服务端建立共享文件目录,并设置权限
	nfs_path="/pub"
	mkdir  -p $nfs_path
	touch $nfs_path$/{1..10}
	chmod o+w $nfs_path

	#服务端编辑配置文件
	echo " $nfs_path     *(rw) "  >> /etc/exports  # 在后面添加以下内容

	#结束重启服务
	#若start后报错,显示启动失败,应先停止服务,在重启服务,所以建议直接用restart
	systemctl 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; then
    echo "Nginx服务已运行,可通过浏览器访问网站"
else
    echo "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=`hostname -I`

配置:

IP=`hostname -I`
curl_code=`curl -o /dev/null -s -w "%{http_code}\n" $IP`
if [ $curl_code -eq 200 ];then
    echo "访问网站成功"
else
    echo “访问出现了问题”
fi

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

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

9、邮箱配置

下面是配置163邮箱的简单配置,如果需要详细过程和配置QQ邮箱的可以看我之前的博客 RHCE的学习(1)

#挂载
[root@server ~]# mount /dev/sr0 /mnt
#安装邮件服务、
[root@server ~]#dnf   install  s-nail  -y
#配置邮件服务
[root@server ~]# vim  /etc/s-nail.rc
# 最后一行添加以下内容:
set  from=17674044@163.com
set  smtp=smtp.163.com
set  smtp-auth-user=17674044@163.com
set  smtp-auth-password=do***授权码qbibj
set  smtp-auth=login

# 注意:该文件输入完毕有的系统需要强制保存退出,输入wq!
#测试邮件服务
[root@server ~]# echo 邮件内容 | mail -s 主题 xxxxxx@163.com

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" ]; then
    echo "请输入正确的服务名称(nginx)"
    #终止脚本运行
    exit 1    #更改状态码
fi


#使用which命令检查nginx是否已经安装
if which nginx &>/dev/null; then
    echo "Nginx已安装"
else
    echo "Nginx未安装,接下来将开始安装nginx"
    #配置挂载点
    mount /dev/sr0 /mnt
    dnf install nginx -y
    
fi

if 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  <<EOF
	server {
   		listen       80;
    	root   $web_path;  #自定义路径
	}
EOF   
	#注意,需定格并且单独一行	
	#创建网页文件
	touch $web_path/index.html
    echo "this is test" > $web_path/index.html
    #然后重启服务
    systemctl restart nginx
fi

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

if rpm -q nfs-utils &>/dev/null; then
	#服务端建立共享文件目录,并设置权限
	nfs_path="/pub"
	mkdir  -p $nfs_path
	touch $nfs_path$/{1..10}
	chmod o+w $nfs_path

	#服务端编辑配置文件
	echo " $nfs_path     *(rw) "  >> /etc/exports  # 在后面添加以下内容

	#结束重启服务
	#若start后报错,显示启动失败,应先停止服务,在重启服务,所以建议直接用restart
	systemctl restart  nfs-server
fi

# 测试nginx服务是否成功运行
if systemctl is-active nginx &>/dev/null; then
    echo "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 ];then
    	echo "访问网站成功"
    else
    	echo “访问出现了问题”
    fi
else
    echo "Nginx服务未启动"
    echo "以下是自定义配置文件内容:"
    cat $web_path/index.html
fi

echo "脚本代码在附件" | 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:

测试邮件是否可以发送

扩展:(使用函数)

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐