通过shell脚本分析部署nginx网络服务
要求:
- 接收用户部署的服务名称
- 判断服务是否安装
- 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务
- 没有安装;安装对应的软件包
- 测试: 判断服务是否成功运行;
- 已运行,访问网站
- 未运行,提示服务未启动,并显示自定义的配置文件内容
- 以上配置没有问题,请邮件告知我,并将脚本代码(代码文件)邮件发送我 我的邮箱账号:lxx1065372838@163.com
需求分析:
- 接收用户部署的服务名称
- 接收:可以用位置变量($1)或read
- 本次分析选择的是nginx服务,所以需要判断输入是否是nginx
- 判断服务是否安装,未安装进行安装
- 使用which命令检查nginx是否已经安装
- 已安装;自定义网站配置路径为/www;
- 需要创建目录/www mkdir -p选项确保即使父目录不存在也能创建成功
- 建议用变量将/www赋值,因为后面需要多次用到,如果更改路径只需将变量重新赋值即可,无需多次更改
- cat和<<EOF实现配置文件写入(创建子配置文件更改默认路径)
- 创建网页文件
- 使用touch 创建后缀为.html的文件(默认为index.html)
- 完成后重启服务
- 创建共享目录(nfs)
- 判断是否安装nfs服务
- 若无安装,进行安装
- 安装完后,启动nfs服务
- 编辑配置文件(将共享目录信息添加到主配置文件)
- 用 >> 追加
- 主配置文件 /etc/exports
- 创建共享文件目录,并设置权限mkdir touch chmod
- 判断服务是否成功运行
- 四种方法(自选即可)
- 已运行,访问网站
- curl 与 wget 判断是否可以成功访问
- 未运行,提示服务未启动,并显示自定义的配置文件内容
- 显示之前的网页文件即可
- 邮箱配置,可以看我之前的博客RHCE的学习(1)
- 邮件发送,附带脚本代码(代码文件)
准备工作:
- 关闭防火墙(因为要与外部连接访问)
[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
命令通常用于连接文件并打印到标准输出,但配合<<EOF
(EOF
是自定义的结束标记,可以是其他标记)可以实现从标准输入读取内容并写入文件。当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:
测试邮件是否可以发送