《构建高可用Linux服务器 第3版》—— 2.4 系统维护时应该注意的地方

简介:

本节书摘来自华章出版社《构建高可用Linux服务器 第3版》一 书中的第2章,第2.4节,作者:余洪春 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 系统维护时应该注意的地方

无论是自己的内网开发机器还是线上的生产机器,我们在操作时都应该谨慎,否则系统很容易发生Crash的情况。就算我们能用备份很快恢复,在恢复时间之内,我们也会损失大量的数据,而且如果万一恢复不了,那就是灾难性的了。

2.4.1 服务器硬件改动进入了Emergency模式

同事在处理一台CentOS 5.8服务器时,他在机器上移走了一块硬盘,然后就直接启动机器,忽然发现系统进了Emergency模式,于是他连忙跑过来找我。我第一句就是问他:你改动了硬件没?他说他移走硬盘后就直接启动了,不是跟Windows Server 2003一样吗,有什么问题?我跟他讲解了一下Linux系统下/etc/fatab的语法及作用,最后边操作边告诉他整个解决步骤,如下所示。

1)在Emergency模式下输入root密码进入单用户模式。

2)修改/etc/fstab文件时会出现“Read-only file system”,如何处理?重新将其装载成读写模式,命令如下:

mount -o remount,rw /
这句话的作用是将/分区设置成可读写。

3)编辑/etc/fatab文件,将移除的硬盘用#号屏蔽掉,然后重启服务器,故障解除。

2.4.2 如何以普通用户的身份编辑无权限的文件

如果普通用户用vim编辑nginx.conf等配置文件,保存的时候会提示:没有root权限,解决办法是在保存时加上以下命令:

:w !sudo tee %
这条命令的含义是把当前编辑的文件内容当做标准输入并输入到命令sudo tee文件名里去。也就是将sudo保存为当前文件名,这是一个相当管用的命令,不过这个命令比较拗口,我采用谐音记忆的方法记住了它,其实多练习几次自然就熟悉此命令了。

2.4.3 在Linux下配置最大文件打开数的方法

在Linux下部署应用(特别是Squid服务器时)的时候,有时会遇上“Socket/File:Cant open so many files”问题;这也会影响服务器的最大并发数。其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,如果是生产服务器用,很容易就会达到这个数量。

1.查看方法

我们可以用“ulimit-a”命令来查看所有限制值,命令如下所示:

ulimit-a
命令显示结果如下所示:

core file size     (blocks, -c) 0

data seg size      (kbytes, -d) unlimited

scheduling priority       (-e) 0

file size        (blocks, -f) unlimited

pending signals         (-i) 16126

max locked memory    (kbytes, -l) 32

max memory size     (kbytes, -m) unlimited

open files           (-n) 1024

pipe size      (512 bytes, -p) 8

POSIX message queues   (bytes, -q) 819200

real-time priority       (-r) 0

stack size       (kbytes, -s) 10240

cpu time        (seconds, -t) unlimited

max user processes       (-u) 16126

virtual memory     (kbytes, -v) unlimited

file locks           (-x) unlimited
其中open files(-n)1024是Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量,可影响MySQL的并发连接数目)。这个值可用ulimit命令修改,但ulimit命令修改的数值只对当前登录用户目前使用的环境有效,系统重启或用户退出后就会失效。

系统的总限制是在:/proc/sys/fs/file-max。我们可以通过cat命令查看其目前的值,修改/etc/sysctl.conf也可以控制这个数值。

另外还有一个知识点,使用/proc/sys/fs/file-nr可以看到整个系统目前使用的文件句柄数量。

查找文件句柄问题的时候,还有一个很实用的程序lsof。可以很方便看到某个进程打开了哪些句柄,也可以看到某个文件/目录被什么进程占用了。

2.修改方法

若要令修改ulimits的数值永久生效,则必须修改配置文档,可以将ulimit修改命令放入/etc/profile里面,不过,这个方法实在不方便。还有一个方法是修改/etc/sysctl.conf。我修改后测试过,发现它不会改变用户的ulimits-a,只改变/proc/sys/fs/file-max的值。

而我以前的做法是修改/etc/security/limits.conf,其中有很详细的注释,文件内容修改如下所示:

* soft nofile 32768

* hard nofile 65535```
这样可以将文件句柄限制统一改成软32768,硬65536。配置文件最前面的内容是指domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制。这里要值得注意的是:其中的硬限制是实际的限制,而软限制,是warning限制,它只会给出warning;其实ulimit命令本身就分软硬设置,加-H就代表硬限制,加-S就代表软限制。默认显示的是软限制,如果运行ulimit命令修改时没有加上-H或-S,就是两个参数一起改变。

不过,这种做法仅对当前配置有效,如果重启系统,则完全失效。正确的做法应该是“编辑/etc/rc.loal文件”,在其后添加如下内容:


ulimit -SHn 65535


注意 如果想使shell及系统重启以后系统的最大文件打开数的修改值均生效,建议以上两个步都操作。



我们可以用以下脚本nginx_limit.sh来查看nginx进程能打开的最大文件打开数,内容如下:


for pid in 'ps aux |grep nginx | grep -v grep| awk '{print$2}''

do

cat /proc/${pid}/limits |grep 'Max open files'

done
如果是非nginx的其他进程,可以用下面的方法来判断,命令如下所示:


cat /proc/2976/limits | grep "Max open files"
命令显示结果如下所示,表示修改是生效的:


Max open files 65535 65535 files
其中,2976为httpd进程的pid值,我们可以通过ps命令得到,这种方法可以精确得到当前进程打开文件的最大打开数。

####2.4.4 在crontab下正确防止脚本运行冲突

如果某脚本要运行30分钟,可以在crontab里把脚本间隔设为至少一小时来避免冲突。而比较糟的情况是可能该脚本在执行周期内没有完成,接着第二个脚本又开始运行了。如何确保只有一个脚本实例运行呢?一个好用的方法是利用lockf(FreeBSD 8.1下为lockf,CentOS 5.8下为flock),在脚本执行前先检测能否获取某个文件锁,以防止脚本运行冲突。

lockf的参数如下。

-k:一直等待获取文件锁。

-s:silent,不发出任何信息,即使拿不到文件锁。

-t seconds:设定timeout的时间是seconds秒,如果超过时间,则自动放弃。

执行以下crontab计划任务前,需获取临时文件create.lock的文件锁,此项crontab计划任务的内容如下(以FreeBSD 8.1 x86_64举例说明):


*/10**** (lockf -s -t 0 /tmp/create.lock /usr/bin/python /home/project/cron/create_tab.py

          >> /home/project/logs/create.log 2>&1)
相关文章
|
4月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
379 3
Linux系统禁用swap
|
4月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
830 3
|
4月前
|
Ubuntu 安全 关系型数据库
安装MariaDB服务器流程介绍在Ubuntu 22.04系统上
至此, 您已经在 Ubuntu 22.04 系统上成功地完成了 MariadB 的标准部署流程,并且对其进行基础但重要地初步配置加固工作。通过以上简洁明快且实用性强大地操作流程, 您现在拥有一个待定制与使用地强大 SQL 数据库管理系统。
337 18
|
存储 Ubuntu Linux
HPE SPP 2025.09.00.00 - HPE 服务器固件、驱动程序和系统软件包 (Released Oct 2025)
HPE SPP 2025.09.00.00 - HPE 服务器固件、驱动程序和系统软件包
174 0
|
4月前
|
Ubuntu 安全 关系型数据库
安装MariaDB服务器流程介绍在Ubuntu 22.04系统上
至此, 您已经在 Ubuntu 22.04 系统上成功地完成了 MariadB 的标准部署流程,并且对其进行基础但重要地初步配置加固工作。通过以上简洁明快且实用性强大地操作流程, 您现在拥有一个待定制与使用地强大 SQL 数据库管理系统。
365 15
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
489 0
Linux系统初始化脚本
|
5月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
354 18
|
4月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
416 1
|
4月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1106 1
|
5月前
|
域名解析 运维 监控
阿里云轻量服务器的系统镜像和应用镜像的区别
轻量应用服务器是阿里云推出的易用型云服务器,支持一键部署、域名解析、安全管理和运维监控。本文介绍其系统镜像与应用镜像的区别及选择建议,助您根据业务需求和技术能力快速决策,实现高效部署。