前言:
通过一个多月的shell学习,总共写出30个案例,分批次进行发布,这次总共发布了5个案例,希望能够对大家的学习和使用有所帮助,更多案例会在下期进行发布。
案例二十一、系统内核优化
1.问题:
在服务器或高性能计算环境中,系统内核的默认参数可能无法满足特定工作负载的需求,导致性能不佳。例如,网络连接数受限可能影响高并发网络应用的性能,内存管理策略不当可能导致内存利用效率低下,磁盘 I/O 调度策略可能不适合特定的存储设备,从而影响读写速度。因此,需要对系统内核进行优化以提高系统的整体性能。
2.分析:
网络参数优化:调整最大连接数相关参数:增加系统允许的最大文件描述符数量(fs.file - max)和网络连接跟踪表的大小(net.netfilter.nf_conntrack_max),以适应大量并发连接的场景。
优化 TCP 参数:调整 TCP 缓冲区大小(net.ipv4.tcp_rmem、net.ipv4.tcp_wmem)、TCP 连接超时时间(net.ipv4.tcp_fin_timeout)和 TCP 快速回收等参数(net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse),提高网络传输效率和连接处理速度。
内存管理优化:调整内存分配策略参数:例如,调整vm.swappiness参数来控制系统使用交换空间的倾向,减少不必要的磁盘交换,提高内存使用效率。
优化内存缓存参数:根据服务器的应用场景,调整内存页面缓存相关参数,如vm.vfs_cache_pressure,以平衡文件系统缓存和其他内存使用。
磁盘 I/O 优化:选择合适的 I/O 调度策略:对于不同类型的存储设备(如机械硬盘或固态硬盘),选择合适的 I/O 调度算法(如noop、deadline、cfq等),通过修改/sys/block/<device>/queue/scheduler(<device>为磁盘设备名)来实现。
调整磁盘预读参数:根据磁盘性能和应用的 I/O 模式,调整磁盘预读相关参数(如blockdev --setra命令),提高磁盘读取效率。
3.实现:
#!/bin/bash# 备份原始内核配置文件
cp /etc/sysctl.conf /etc/sysctl.conf.bak# 网络参数优化
echo "fs.file-max = 1000000" >> /etc/sysctl.conf
echo "net.netfilter.nf_conntrack_max = 500000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_rmem = 4096 87380 16777216" >> /etc/sysctl.conf
echo "net.ipv4.tcp_wmem = 4096 16384 16777216" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf# 内存管理优化
echo "vm.swappiness = 10" >> /etc/sysctl.conf
echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf# 磁盘I/O优化(假设磁盘设备名为sda,这里以修改为deadline调度策略为例)
echo "echo deadline > /sys/block/sda/queue/scheduler" >> /etc/rc.local
chmod +x /etc/rc.local
blockdev --setra 4096 /dev/sda# 使新的内核配置生效
sysctl -p# 这里可以添加重启系统的命令,如果需要重启才能使所有优化生效
# reboot
4.实现解析:
备份原始内核配置文件:使用cp /etc/sysctl.conf /etc/sysctl.conf.bak将原始的内核配置文件/etc/sysctl.conf备份到/etc/sysctl.conf.bak。这样在优化出现问题时,可以回滚到原始配置。
网络参数优化部分:通过echo命令将一系列网络参数配置添加到/etc/sysctl.conf文件中。
fs.file - max = 1000000:将系统允许的最大文件描述符数量设置为 1000000,以支持大量的文件和网络连接。
net.netfilter.nf_conntrack_max = 500000:增加网络连接跟踪表的大小,适应更多的并发网络连接。
net.ipv4.tcp_rmem和net.ipv4.tcp_wmem:分别设置 TCP 接收缓冲区和发送缓冲区的大小,优化 TCP 数据传输。
net.ipv4.tcp_fin_timeout = 30:缩短 TCP 连接关闭时的等待时间,加快连接资源的回收。
net.ipv4.tcp_tw_recycle = 1和net.ipv4.tcp_tw_reuse = 1:启用 TCP 连接的快速回收和重用机制,提高服务器处理大量短连接的能力。
内存管理优化部分:vm.swappiness = 10:降低系统使用交换空间的倾向,只有当内存使用率达到 90%(100 - 10)时才更积极地使用交换空间,提高内存使用效率。
vm.vfs_cache_pressure = 50:调整文件系统缓存的回收压力,平衡文件系统缓存和其他内存使用。
磁盘 I/O 优化部分:echo "echo deadline > /sys/block/sda/queue/scheduler" >> /etc/rc.local:将设置磁盘sda的 I/O 调度策略为deadline的命令添加到/etc/rc.local文件中,并在系统启动时执行。deadline调度策略适用于一般的服务器场景,能在一定程度上平衡读写性能。同时,使用chmod +x /etc/rc.local赋予/etc/rc.local可执行权限。
blockdev --setra 4096 /dev/sda:设置磁盘sda的预读扇区数为 4096,根据磁盘性能和应用的 I/O 模式优化磁盘读取效率。
使新的内核配置生效:使用sysctl -p命令加载/etc/sysctl.conf中的新内核参数配置,使参数立即生效。部分参数可能需要重启系统才能完全生效,这里可以根据实际情况添加reboot命令,但需要谨慎操作,因为重启会中断当前的服务。
5.结果验证:
测试优化前后的磁盘 I/O 性能,优化前的读写速度
dd if=/dev/zero of=testfile bs=1M count=1024 oflag=direct 读
dd if=testfile of=/dev/null bs=1M count=1024 iflag=direct 写
优化后的读写速度
可以看到速度有一定的提升
案例二十二、一键部署LNMP环境
1.问题:
在服务器环境中,手动搭建 LNMP 环境步骤繁琐且容易出错,需要耗费大量时间。包括安装 Nginx、MySQL、PHP 以及相关的配置和启动操作,不同软件之间可能还存在版本兼容性问题。因此,需要一个脚本来自动化完成 LNMP 环境的部署,提高部署效率和准确性。
2.分析:
软件安装与版本选择:Nginx:从官方或可靠的软件源获取 Nginx 安装包,根据服务器性能和需求选择合适的版本。需要注意安装过程中的依赖项处理。
MySQL:可以选择 MySQL 官方版本或者其分支(如 MariaDB)。同样要处理好安装依赖,并且在安装后进行必要的配置,如设置 root 用户密码、创建数据库等。
PHP:确定要安装的 PHP 版本,安装 PHP 以及与 Web 应用相关的扩展,如php - mysql、php - fpm等,以支持与 MySQL 和 Nginx 的协同工作。
配置管理:Nginx 配置:修改 Nginx 的配置文件(如nginx.conf),设置服务器域名、监听端口、根目录等相关参数,同时配置 Nginx 与 PHP - FPM 的交互。
PHP - FPM 配置:调整 PHP - FPM 的配置,包括监听地址、进程管理、资源限制等,确保 PHP 能够高效稳定地运行。
MySQL 配置(如果有):除了设置 root 用户密码外,还可以根据需要配置数据库的字符集、存储引擎等参数。
服务启动与检查:安装完成后,启动 Nginx、MySQL 和 PHP - FPM 服务,并检查服务是否正常启动,避免出现启动失败但未被发现的情况。
3.流程图:
4.实现:
#!/bin/bash# 定义函数用于输出信息
function echo_info() {echo -e "[\033[36m$(date +%T)\033[0m] [\033[32mINFO\033[0m] \033[37m$@\033[0m"
}
function echo_warning() {echo -e "[\033[36m$(date +%T)\033[0m] [\033[1;33mWARNING\033[0m] \033[1;37m$@\033[0m"
}
function echo_error() {echo -e "[\033[36m$(date +%T)\033[0m] [\033[41mERROR\033[0m] \033[1;31m$@\033[0m"
}# 安装 Nginx
install_nginx() {echo_info "正在安装 Nginx..."yum install -y epel-release.noarchyum install -y nginxif [ $? -eq 0 ]; thenecho_info "Nginx 安装成功。"elseecho_error "Nginx 安装失败。"fi
}# 安装 MySQL(这里以 MariaDB 为例)
install_mysql() {echo_info "正在安装 MariaDB..."yum install -y mariadb-server mariadbif [ $? -eq 0 ]; thenecho_info "MariaDB 安装成功。"echo_info "正在启动 MariaDB..."systemctl start mariadbif [ $? -eq 0 ]; thenecho_info "MariaDB 启动成功。"echo_info "设置 MariaDB 开机自启..."systemctl enable mariadbecho_info "正在设置 MariaDB root 用户密码..."mysqladmin -u root password '123456'echo_info "密码设置成功。"elseecho_error "MariaDB 启动失败。"fielseecho_error "MariaDB 安装失败。"fi
}# 安装 PHP 及相关扩展
install_php() {echo_info "正在安装 PHP 及相关扩展..."yum install -y php php-fpm php-mysql php-gd php-mbstring php-xmlif [ $? -eq 0 ]; thenecho_info "PHP 及相关扩展安装成功。"elseecho_error "PHP 安装失败。"fi
}# 配置 Nginx
configure_nginx() {echo_info "正在配置 Nginx..."# 这里可以添加具体的 Nginx 配置修改代码,例如:# sed -i's/listen 80;/listen 8080;/' /etc/nginx/nginx.conf# 创建一个简单的 Nginx 服务器配置块示例cat > /etc/nginx/conf.d/default.conf << EOF
server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;index index.php index.html index.htm;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;include fastcgi_params;}
}
EOFecho_info "Nginx 配置完成。"
}# 配置 PHP - FPM
configure_php_fpm() {echo_info "正在配置 PHP - FPM..."# 这里可以修改 PHP - FPM 的配置文件,例如:# sed -i's/listen = 127.0.0.1:9000/listen = 127.0.0.1:9000;/' /etc/php-fpm.d/www.confecho_info "PHP - FPM 配置完成。"
}# 启动服务并检查状态
start_and_check_services() {echo_info "正在启动 Nginx 服务..."systemctl start nginxif [ $? -eq 0 ]; thenecho_info "Nginx 服务启动成功。"elseecho_error "Nginx 服务启动失败。"fiecho_info "正在启动 PHP - FPM 服务..."systemctl start php-fpmif [ $? -eq 0 ]; thenecho_info "PHP - FPM 服务启动成功。"elseecho_error "PHP - FPM 服务启动失败。"fi
}# 主函数,按顺序调用各个函数
main() {install_nginxinstall_mysqlinstall_phpconfigure_nginxconfigure_php_fpmstart_and_check_services
}main
5.实现解析:
信息输出函数:定义了echo_info、echo_warning和echo_error函数,用于以不同颜色和格式输出信息、警告和错误消息,方便在脚本执行过程中查看状态。这些函数使用echo -e和 ANSI 转义序列来实现彩色输出。
安装 Nginx 函数install_nginx:使用yum install -y nginx命令安装 Nginx。-y选项表示自动回答yes以确认安装。通过检查命令的返回值($?)判断安装是否成功,若$? -eq 0,则输出安装成功信息;否则输出安装失败信息。
安装 MySQL(MariaDB)函数install_mysql:使用yum install -y mariadb - server mariadb安装 MariaDB 服务器和客户端。安装成功后,启动 MariaDB 服务(systemctl start mariadb),并根据启动命令的返回值判断启动是否成功,输出相应信息。若启动成功,将 MariaDB 设置为开机自启(systemctl enable mariadb)。接着使用mysqladmin -u root password 'your_password'设置 root 用户的密码,这里的your_password需要替换为实际的密码。
安装 PHP 及相关扩展函数install_php:使用yum install -y php php - fpm php - mysql php - gd php - mbstring php - xml安装 PHP 以及常用的与 Web 应用相关的扩展。通过检查安装命令的返回值判断安装是否成功,输出相应信息。
配置 Nginx 函数configure_nginx:输出正在配置 Nginx 的信息,这里可以添加更详细的 Nginx 配置修改代码。在示例中,创建了一个简单的/etc/nginx/conf.d/default.conf配置文件,设置了 Nginx 的监听端口(80)、服务器名称(localhost)、根目录(/usr/share/nginx/html)以及 PHP 相关的配置(location ~ \.php$部分),用于处理 PHP 文件的请求,将其转发到 PHP - FPM 服务。
配置 PHP - FPM 函数configure_php_fpm:输出正在配置 PHP - FPM 的信息,这里可以添加修改 PHP - FPM 配置文件(如/etc/php - fpm.d/www.conf)的代码,示例中只是简单输出配置完成信息,实际应用中可能需要根据需求修改监听地址等参数。
启动服务并检查状态函数start_and_check_services:分别启动 Nginx 服务(systemctl start nginx)和 PHP - FPM 服务(systemctl start php - fpm),并根据启动命令的返回值判断启动是否成功,输出相应信息。
主函数main:按照安装 Nginx、安装 MySQL、安装 PHP、配置 Nginx、配置 PHP - FPM、启动服务并检查状态的顺序调用各个函数,完成 LNMP 环境的部署。
6.结果验证:
首先关闭服务器的防火墙
Systemctl stop firewalld
将网页内容修改为test1
echo "test1" > /usr/share/nginx/html/index.html
打开浏览器,搜索http://服务器ip,显示如下界面,表示部署成功
案例二十三、一键部署LAMP
1.问题:
手动在 Linux 系统上部署 LAMP 环境需要分别安装和配置 Apache、MySQL 和 PHP,操作繁琐且容易出错,需要一个自动化脚本来快速准确地完成部署。
2.分析:
软件安装源:Apache:可以从系统默认的软件仓库(如 yum 仓库)获取安装包,选择合适的版本进行安装。
MySQL:可选择 MySQL 官方版本或其兼容的分支(如 MariaDB),从相应的官方或可靠的仓库获取安装包。
PHP:确定要安装的 PHP 版本,并从系统仓库安装 PHP 以及与 Apache 和 MySQL 协同工作所需的扩展,如php - mysql等。
依赖关系处理:每个软件在安装过程中可能有依赖项,需要确保这些依赖项在安装软件之前或同时安装,以保证安装顺利进行。
配置管理:Apache 配置:设置服务器域名、监听端口、文档根目录等相关参数,确保 Apache 能正确处理网页请求。
MySQL 配置:设置 root 用户密码、数据库字符集、存储引擎等参数,同时创建必要的数据库和用户(如果需要)。
PHP 配置:调整 PHP 的配置文件,如php.ini,设置时区、错误显示等参数,并确保 PHP 模块与 Apache 正确集成。
3.流程图:
4.实现:
#!/bin/bash# 定义函数用于输出信息
function echo_info() {echo -e "[\033[36m$(date +%T)\033[0m] [\033[32mINFO\033[0m] \033[37m$@\033[0m"
}
function echo_warning() {echo -e "[\033[36m$(date +%T)\033[0m] [\033[1;33mWARNING\033[0m] \033[1;37m$@\033[0m"
}
function echo_error() {echo -e "[\033[36m$(date +%T)\033[0m] [\033[41mERROR\033[0m] \033[1;31m$@\033[0m"
}# 安装 Apache
install_apache() {echo_info "正在安装 Apache..."yum install -y httpdif [ $? -eq 0 ]; thenecho_info "Apache 安装成功。"elseecho_error "Apache 安装失败。"fi
}# 安装 MySQL(这里以 MariaDB 为例)
install_mysql() {echo_info "正在安装 MariaDB..."yum install -y mariadb-server mariadbif [ $? -eq 0 ]; thenecho_info "MariaDB 安装成功。"echo_info "正在启动 MariaDB..."systemctl start mariadbif [ $? -eq 0 ]; thenecho_info "MariaDB 启动成功。"echo_info "设置 MariaDB 开机自启..."systemctl enable mariadbecho_info "正在设置 MariaDB root 用户密码..."mysqladmin -u root password '123456'echo_info "密码设置成功。"elseecho_error "MariaDB 启动失败。"fielseecho_error "MariaDB 安装失败。"fi
}# 安装 PHP 及相关扩展
install_php() {echo_info "正在安装 PHP 及相关扩展..."yum install -y php php-mysql php-gd php-mbstring php-xmlif [ $? -eq 0 ]; thenecho_info "PHP 及相关扩展安装成功。"elseecho_error "PHP 安装失败。"fi
}# 配置 Apache
configure_apache() {echo_info "正在配置 Apache..."# 修改 Apache 主配置文件,这里只是示例,可根据实际需求修改sed -i's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.confecho_info "Apache 配置完成。"
}# 配置 MySQL
configure_mysql() {echo_info "正在配置 MySQL..."# 这里可以添加更多的 MySQL 配置操作,如修改 my.cnf 文件等echo_info "MySQL 配置完成(示例,可进一步完善)。"
}# 配置 PHP
configure_php() {echo_info "正在配置 PHP..."# 修改 php.ini 文件,设置时区等,这里只是示例sed -i " s/;date.timezone =/date.timezone = Asia/Shanghai/" /etc/php.iniecho_info "PHP 配置完成(示例,可进一步完善)。"
}# 启动服务并检查状态
start_and_check_services() {echo_info "正在启动 Apache 服务..."systemctl start httpdif [ $? -eq 0 ]; thenecho_info "Apache 服务启动成功。"elseecho_error "Apache 服务启动失败。"fiecho_info "正在启动 PHP 模块(与 Apache 集成)..."# 这里可以根据实际情况检查 PHP 与 Apache 集成是否成功启动,例如检查相关模块是否加载echo_info "PHP 模块启动成功(示例,可进一步检查)。"
}# 主函数,按顺序调用各个函数
main() {install_apacheinstall_mysqlinstall_phpconfigure_apacheconfigure_mysqlconfigure_phpstart_and_check_services
}main
5.实现解析:
信息输出函数:定义了echo_info、echo_warning和echo_error函数,用于以不同颜色和格式输出信息、警告和错误消息,方便在脚本执行过程中查看状态。这些函数使用echo -e和 ANSI 转义序列来实现彩色输出。
安装 Apache 函数install_apache:使用yum install -y httpd命令安装 Apache。-y选项表示自动回答yes以确认安装。通过检查命令的返回值($?)判断安装是否成功,若$? -eq 0,则输出安装成功信息;否则输出安装失败信息。
安装 MySQL(MariaDB)函数install_mysql:使用yum install -y mariadb - server mariadb安装 MariaDB 服务器和客户端。安装成功后,启动 MariaDB 服务(systemctl start mariadb),并根据启动命令的返回值判断启动是否成功,输出相应信息。若启动成功,将 MariaDB 设置为开机自启(systemctl enable mariadb)。接着使用mysqladmin -u root password 'your_password'设置 root 用户的密码,这里的your_password需要替换为实际的密码。
安装 PHP 及相关扩展函数install_php:使用yum install -y php php - mysql php - gd php - mbstring php - xml安装 PHP 以及常用的与 Web 应用相关的扩展。通过检查安装命令的返回值判断安装是否成功,输出相应信息。
配置 Apache 函数configure_apache:输出正在配置 Apache 的信息,这里使用sed -i's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf修改 Apache 的主配置文件,将监听端口从80改为8080。这只是一个简单的配置修改示例,实际应用中可能需要根据具体需求进行更复杂的配置。
配置 MySQL 函数configure_mysql:输出正在配置 MySQL 的信息,这里只是简单输出完成信息,实际应用中可以添加更多的配置操作,如修改my.cnf文件来设置数据库字符集、缓存大小等参数。
配置 PHP 函数configure_php:输出正在配置 PHP 的信息,使用sed -i "s/;date.timezone =/date.timezone = Asia/Shanghai/" /etc/php.ini修改php.ini文件,将 PHP 的时区设置为Asia/Shanghai。这也是一个简单的配置示例,可根据实际情况进一步完善。
启动服务并检查状态函数start_and_check_services:启动 Apache 服务(systemctl start httpd),根据启动命令的返回值判断启动是否成功,输出相应信息。对于 PHP 模块与 Apache 的集成启动,这里只是简单输出成功信息,实际可以添加更多检查逻辑,如检查相关的 PHP 模块是否在 Apache 中正确加载。
主函数main:按照安装 Apache、安装 MySQL、安装 PHP、配置 Apache、配置 MySQL、配置 PHP、启动服务并检查状态的顺序调用各个函数,完成 LAMP 环境的部署。
6.结果验证:
首先关闭防火墙
systemctl stop firewalld
打开浏览器,输入http://服务器ip,显示如下,表示脚本运行成功
案例二十四、判断当前用户是否为root用户
1.问题:
在 CentOS 系统中,编写一个 shell 脚本以准确判断当前正在操作的用户是否为 root 用户。
2.分析:
在 Linux 系统中,每个用户都有一个唯一的用户名标识。root 用户是具有最高权限的特殊用户,其用户名固定为 “root”。
可以通过获取当前用户的用户名信息,并与 “root” 进行比较来判断当前用户是否为 root 用户。在 shell 脚本中,可以使用一些特定的命令和语法来实现这个功能。
3.流程图:
4.实现:
#!/bin/bash# 获取当前用户的用户名
current_user=$(whoami)# 判断当前用户是否为root用户
if [ "$current_user" == "root" ]; thenecho "当前用户是root用户"
elseecho "当前用户不是root用户"
fi
5.实现解析:
current_user=$(whoami):使用whoami命令来获取当前正在操作的用户的用户名,并将其赋值给变量current_user。whoami命令会返回当前用户的登录名。
if [ "$current_user" == "root" ]; then... else... fi:这是一个条件判断语句。首先,将变量current_user的值与字符串 “root” 进行比较。如果两者相等,即当前用户的用户名是 “root”,那么就执行if语句块中的内容,也就是输出 “当前用户是 root 用户”;如果不相等,就执行else语句块中的内容,输出 “当前用户不是 root 用户”。
6.结果验证:
直接执行脚本
可以看到当前用户是root用户。
案例二十五、一键安装常用工具
1.问题:
在 CentOS 系统中,自动化安装一些常用的工具,如 wget、tree、vim 等,以提高系统的初始配置效率并满足日常使用需求。
2.分析:
需要确定要安装的常用工具列表,并了解在 CentOS 系统中使用何种包管理工具进行安装(如 yum)。
要考虑安装过程中的错误处理,例如网络问题导致的软件包下载失败或者依赖关系无法解决等情况。
3.流程图:
4.实现:
#!/bin/bash# 定义要安装的常用工具数组
tools=(wget tree vim)# 安装成功的工具列表
success_list=()
# 安装失败的工具列表
failure_list=()# 循环安装工具
for tool in "${tools[@]}"
doecho "正在安装 $tool..."yum install -y "$tool" > /dev/null 2>&1if [ $? -eq 0 ]; thensuccess_list+=("$tool")elsefailure_list+=("$tool")fi
done# 输出安装结果
echo "安装完成,以下工具安装成功:"
for s_tool in "${success_list[@]}"
doecho $s_tool
doneecho "以下工具安装失败:"
for f_tool in "${failure_list[@]}"
doecho $f_tool
done
5.实现解析:
tools=(wget tree vim):定义了一个包含要安装的常用工具名称的数组。
success_list=() 和 failure_list=():分别初始化安装成功和失败的工具列表为空数组,用于后续记录安装结果。
for tool in "${tools[@]}"... done:循环遍历 tools 数组中的每个工具名称。
yum install -y "$tool" > /dev/null 2>&1:使用 yum 命令安装当前工具,并将标准输出和标准错误输出重定向到 /dev/null,以避免安装过程中的大量输出信息干扰脚本执行。-y 参数表示自动回答 yum 安装过程中的所有提示为 “是”。
if [ $? -eq 0 ]; then... else... fi:通过检查上一个命令(yum install)的返回值($?)来判断安装是否成功。如果返回值为 0,表示安装成功,将工具名称添加到 success_list 数组中;否则添加到 failure_list 数组中。
最后两个循环分别输出安装成功和失败的工具列表。
6.结果验证:
直接执行脚本
可以看到所有工具安装成功,没有工具安装失败。