CentOS 7 运维优化


一般的,我们安装CentOS mini和其他相应服务后,就能正常工作了。但工作一段时间后,服务器会出现不稳定、被入侵、甚至在突然的高并发时直接瘫痪状况。这些问题大多都是由于我们考虑其实际的抗压性和安全性的原因。所以,在这里提供一些运维优化的建议。

1.关闭不需要的服务

众所周知,服务越少,系统占用的资源就会越少, 所以应当关闭不需要的服务。建议把不需要的服务关闭掉,这样做的好处是减少内存和CPU资源占用。首先可以看下系统中 存在着哪些已经启动了的服务。

// 安装ntsysv
yum install -y ntsysv
// 设置启动的服务
ntsysv

下面列出的是需要启动的服务,未列出的服务一律关闭。

  • crond : 自动计划任务。
  • network:Linux系统的网络服务,很重要,若不开启此服务的话,服务器就不能联网。
  • sshd: OpenSSH 服务器守护进程。
  • rsyslog:Linux的日志系统服务(CentOS5.8下此服务名称为syslog),必须要启动。

2.关闭不需要的TTY

可用vim编辑器打开文件

vim /etc/init/start-ttys.conf
// 内容如下:
start on stopped rc RUNLEVEL=[2345]
env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script. /etc/sysconfig/initfor tty in $(echo $ACTIVE_CONSOLES) ; do[ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continueinitctl start tty TTY=$ttydone
end script

这段代码使 init 打开了6个控制台,可分则用 ALT + F1 到 ALT + F6 控制台默认都驻留在内存中。用ps aux 命令即可看到,命今如下:

ps aux | grep tty | grpe -v grep

命令显示结果如下所示:

root         1211  0.0  0.2 115520  2048 tty1
root         1213  0.0  0.2 115520  2048 tty2
root         1214  0.0  0.2 115520  2048 tty3
root         1217  0.0  0.2 115520  2048 tty4
root         1219  0.0  0.2 115520  2048 tty5

事实上没有必要使用这么多,那如何关闭不需婴的进程呢?
通常保留两个控制台就可以了。

vim /etc/init/start-ttys.conf

3.对TCP/IP网络参数进行调整

调整TCPⅡP网络参数,可以加强对抗 SYN Flood 的能力,命令如下:

echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.conf
sysctl -p

4.修改SHELL命令的 history 记录个数

// 用Vim编辑器打开
vim /etc/profile
// 找到HISTSIZE=1000 并改为 100;
HISTSIZE=100
// 立即生效
source /etc/profile

5.定时校正服务器的时间

yum install -y ntp
crontab -e
// 加入一行
*/5 * * * * /usr/sbin/ntpdate ntp.api.bz

ntp.api.bz是一组NTP服务器集群,之前是6台服务器,位于上海电信;现在是3台服务器,分散于上海和浙江电信,可以用 dig 命令查看

dig ntp.api.bz

6.停止IPV6网络服务

在 CentOS64 默认的状态下,IPv6 是被启用的。

// 可用如下命令查看:
lsmod | grep ipv6

有些网络和应用程序还不支持 IPv6 ,因此,禁用 IPv6 可以说是一个非常好的选择: 加强系统的安全性,并提高系统的整体性能。不过,首先要确认一下:IPv6是不是处于动的状态,命令如下:

// 列出全部网络接口信息
ifconfig -a// 修改相应的配置文件,停止 IPv6 ,命令如下:
echo "install ipv6 /bin/true" > /etc/modprobe.d/disable-ipv6.conf
# 每当系统需要加载IPv6时,强制执行 /bin/true 来替代实际加载的模块
echo "IPV6INIT=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0
# 禁用基于IPv6网络,使之不会被触发启动

7.调整 Linux 的最大文件打开数

要调整一下 Linux 的最大文件打开数,否则运行 Squid 诅服务的机器在高负载时执行性能将会很差;另外,在 Linux 下部署应用时,有时候会遇上 “Too many open files” 这样的问题,这个值也会影响服务器的最大并发数。其实 Linux 是有文件句柄限制的。但默认值下是很高,一般是1024,生产服务器很容易就会达到这个值,所以需要改动此值。

// 打开配置
vim /etc/security/limit.conf
// 在最后一行添加如下
* soft nofile 65535
* hard nofile 65535
// 再打开配置
vim /etc/rc.local
// 添加如下内容
ulimit -SHn 65535 

另外,ulimit -n 命令并不能真正看到文件的最大文件打开数。可用如下脚本查看:

#!/bin/bash
for pid in `ps aux |grep nginx |grep -v grep|awk '{print $2}'`
do
cat /proc/${pid}/limits |grep 'Max open files'
done

8.启动网卡

在配置 CentOS 7 网卡 IP 地址时,容易忽略的一项是Linux在启动时未 启动网卡,其后果很明显,那就是该 Linux 机器永远也没有 IP 地址。

// 查看以太网代号(也可用ifconfig命令)
ip address
// 修改网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-enp1s0
// 修改如下内容(如果没有,请自行添加)
# 系统启动时就启动网卡设备
ONBOOT=yes
# 允许用从DHCP处获取的DNS覆盖本地的DNS
PEERDNS=yes
# 不允许普通用户修改网卡
USERCTL=no

9.关闭写磁盘I/O功能

Linux文件默认有3个时间,分别如下所示。

  • atime:对此文件的访问时间。
  • ctime:此文件inOde发生变化的时间。
  • mtime:此文件的修改时间。

如果有多个小文件(比如 Web 服务器的页面上有多个小图片),通常是没有必要记录文件的访问时间的,这样就可以减少写磁盘的 I/O ,可这要如何配置呢?

// 修改文件系统的配置文件
vim /etc/fstab
// 然后,在包含大量小文件的分区中使用 noatime 和 nodiratime 这两个命令。例如:
/dev/sda5 /data/pics ext3 noatime,nodiratime 0 0
这样文件被访问时就不会再产生写磁盘的 I/O 了。 

10.修改SSH登录配置

SSH服务配置优化,请保持机器中至少包含一个具有sudo权限的用户,下面的配置禁止root远程登录,代码内容如下所示:

# 禁止root远程登录
sed -i 's@#PermitRootLogin yes@PermitRootLogin no@' /etc/ssh/sshd_config
# 禁止空密码登录
sed -i 's@PermitEmptyPasswords no@PermitEmptyPasswords no@' /etc/ssh/sshd_config
# 关闭SSH反向查询,以加快SSH的访问速度
sed -i 's@UseDNS yes@UseDNS no@' /etc/ssh/sshd_config /etc/ssh/sshd_config

11.增加具有SUdO权限的用户

添加用户的步骤和过程比较简单这里略过,由于系统已经禁止了root远程登录,因 此需要一个具有sudo权限的admin用户,权限跟root相当。

vim /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)   ALL
# 然后添加如下内容:
admin   ALL=(ALL)   ALL
# 如果在进行sudo切换时不想输入密码,可以做如下更改:
admin   ALL=(ALL)   NOPASSWD:ALL

12.优化Linux下的内核TCP参数以提高系统性能

内核的优化跟服务器的优化一样,应本着稳定安全的原则。下面以Squid服务器为例来说明,待客户端与服务器端建立 TCP/IP 连接后就会关闭Socket,服务器端连接的端口状态也就变为 TIME_WAIT 了。那是不是所有执行主动关闭的SOCket都会进入TIME_WAIT 状态呢?有没有什么情况可使主动关闭的Socket直接进入CLOSED状态呢?答案是主动关 闭的一方在发送最后一个ACK后就会进人 TIME_WAIT 状态,并停留2MSL(报文最大生存)时间,这是 TCP/IP 必不可少的,也就是说这一点是“解决”不了的。

TCP/IP 护设计者如此设计,主要原因有两个:

  • 防止上一次连接中的包迷路后重新出现,影响新的连接经过 2MSL 时间后,上一次连接中所有重复的包都会消失。
  • 为了可靠地关闭TCP连接。主动关闭方发送的最后一个ACKFN有可能会丢失,如果丢失,被动方会重新发送Fm,这时如果主动方处于CLOSED状态,就会q 应RST而不是ACK。所以主动方要处于TIM巳吣IT状态,而不能是CLOSED」态。另外,TIME_WAIT 并不会占用很大的资源,除非受到攻击。
// 在Squid服务器中可输入如下命令查看当前连接统计数:
netstat -n | awk '/^tcp/ {++S[$NF]} END{for(a in S)} print a, S[a]}'  

命令显示结果如下所示:

LAST_ACK 14
SYN_RECV 348
ESTABISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122

命令中的含义分别如下。

  • CLOSED:无恬动的或正在进行的连接。
  • LISTEN:服务器正在等待进入呼叫。
  • SYN_RECV:一个连接请求已经到达,等待确认。
  • SYN_SENT:应用已经开始,打开一个连接。
  • ESTABLISHED;正常数据传输状态。
  • FIN_WAT1:应用说它已经完成。
  • FIN_WAT2:另一边己同意释放。
  • ITMED_WAIT:等待所有分组死掉。
  • CLOSING;两边尝试同时关闭。
  • TIME_WAIT:另一边已初始化一个释放。
  • LAST_ACK:等待所有分组死掉。
    也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
    在 Linux 下高并发的 Squid 服务器中,TCP TIME_WAIT 套接字的数量经常可达到两三万,服务器很容易就会被拖死。不过,可以通过修改Linux 内核参数来减少 Squid 服务器的 TIME_WAIT 套接字数量,命令如下:
vim /etc/sysctl.conf
// 然后,增加以下参数
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000

以下将简单说明上面各个参数的含义:

  • net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时 启用 Cookie 旋来处理,可防范少量的SYN 攻击。该参数默认为0,表示关闭。
  • net.ipv4.tcp_tw_reuse = 1表示开启重用,即允许将TIME-WAIT 套接字重新用于的TCP连接。该参数默认为 0,表示关闭。
  • net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT 套接字的快速回收,该参数默认为0,表示关闭。
  • net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,那么这个参数将决定保持在FlN-WAIT-2 状态的时间。
  • net.ipv4.tcp_keepalive_time = 1200 表示当 Keepalived 启用时,TCP发送Keepalived 消息的频度改为20分钟,默认值是2小时。
  • net.ipv4.ip_local_port_range = 10000 65000 表示CentOS 系统向外连接的端口范围。其默认值很小,这里改为10000到65000。建议不要将这里的最低值设得太低,否则可能会占用正常的端口。
  • net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认值为1024,此处加大队列长度为8192,可以容纳更多等待连接的网络连接数。
  • net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT 套接字的最大数量,如果超过这个数字,TlME_WAIT 套接字将立刻被清除并打印警告信息,默认值为180000,此处改为5000。对于Apache、Nginx等服务器,前面介绍的几个参数已经可以很好地减少TIME_WAIT套接字的数量,但是对于Squid来说,效果却不大,有了此参数就可以控制TME_WAIT 套接字的最大数量,避免Squid 记服务器被大量的TIME_WAIT 套接字拖死。

执行以下命令使内核配置立马生效:

/sbin/sysctl -p

如果是用于Apache 或 Nginx 等 Web 服务器,则只需要更改以下几项即可。

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10000 65000// 执行以下命令使内核配置立马生效
/sbin/sysctl -p

如果是Post6x邮件服务器,则建议内核优化方案如下:

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10000 65000
kernel.shmmax = 134217728// 执行以下命令使内核配置立马生效
/sbin/sysctl -p

当然这些都只是最基本的更改,大家还可以根据自己的需求来更改内核的设置,比如我们的线上机器在高并发的情况下,经常会出现 ‘‘TCP:too many orpharned sockets ” 的报错尽量也要本着服务器稳定的最高原则。如果服务器不稳定的话,一切工作和努力就都会白费。
如果以上优化仍无法满足工作要求,则又可能需要定制你的服务器内核或升级服务器硬件。

CentOS 7 运维优化相关推荐

  1. Redis运维优化的陷阱及避坑指南

    Linux 配置优化 我们在使用 Redis 过程中,可能更多的关注 Redis 本身的一些配置优化,如 AOF.RDB 配置.数据结构配置优化等.但是很少关心 Redis 的载体,服务器的优化.而这 ...

  2. centos 常用运维命令

    Ndo5DNFg4tGuRs%4 查看所有打开的端口: firewall-cmd --zone=public --list-ports 添加(--permanent永久生效,没有此参数重启后失效) f ...

  3. centos日常运维

    1.linux 下的打包 tar -czvf xxx.tar.gz source_file 在终端下使用nohup tar -czvf xxx.tar.gz source_file & 2.查 ...

  4. 美图秀秀DBA谈MySQL运维及优化

    随着MySQL应用的不断普及和自身发展,如何更好的优化MySQL和使用MySQL,依然是一个比较有挑战的问题,尤其是在业务快速增长的场景下.本次分享主要介绍一些通用的运维优化实践和问题,以及未来的一些 ...

  5. 记——凡科业务运维工程师面试总结(5.10)

    初到凡科,是在凤凰新村地铁A出口,右拐50米,第一栋建筑就是5号楼,首层便是凡科科技. 到了前台,先说明来意后(通知来面试业务运维的),登记一下基本后,对方便拿出一套笔试题给我做,试题都是关于linu ...

  6. mysql 触发器不能同时 insert or update or delete_运维日记|SQL server 那点事——DML触发器...

    11月19日,21点,小编正六指霸屏,决赛圈1V4,忽然,电话响了,这种感觉很熟悉,不错,上次差点推掉对面水晶的那一幕又上演了--作为一名美创的员工,客户才是第一位,我毫不犹豫的摁下了接听键. ​ X ...

  7. 云计算基础设施智能运维的下一段征程,你们准备好了吗?

    随着云计算的不断发展和普及,在背后支撑它的基础设施技术也在飞速演进.2019年杭州云栖大会,在<大规模云计算基础设施智能运维>分论坛上,来自阿里巴巴的资深技术专家们.以及英特尔的资深架构师 ...

  8. oracle最新版本是多少_运维日记|关于Oracle的补丁你需要知道的事

    各位新朋友-记得先点蓝字关注我哦- 之前一起熟悉了Oracle数据库的软件版本,服务周期,今天我们一起来了解下,Oracle发布的基础版本之上,常说的补丁到底是什么,有什么分类,经历了怎样的迭代. c ...

  9. sqlserver 触发器 update_运维日记| SQL server 那点事——DML触发器

    各位新朋友-记得先点蓝字关注我哦- 11月19日,21点,小编正六指霸屏,决赛圈1V4,忽然,电话响了,这种感觉很熟悉,不错,上次差点推掉对面水晶的那一幕又上演了--作为一名美创的员工,客户才是第一位 ...

最新文章

  1. [CQOI2010]扑克牌
  2. 怎样训练左右手协调_2019中考体育训练计划
  3. Sublime注释插件--DocBlockr
  4. php扩展dio,PHP Dio扩展新函数dio_fdopen参数返回--bad file descriptor的分
  5. ACCESS 文本文件导入和导出指定字段类型的方法
  6. python logging模块的作用_【python】【logging】python日志模块logging常用功能
  7. 了解一下Elasticsearch的基本概念
  8. AOS编排语言系列教程(一):开启AOS之旅,解锁各种自动化姿势
  9. ibatis 存储过程 结果集 map_「大数据」(七十五)Spark之弹性分布式数据集
  10. 当前主流的单元测试工具
  11. java中的轻重量级组件_java Swing AWT 轻量级组建 和 重量级组件
  12. 拜托!不要用“ ! = null “ 做判空了
  13. 请以平常心看这篇帖子
  14. c语言图片百叶窗特效,Flash遮罩特效实例--百叶窗效果
  15. 苹果开发者账号双重认证
  16. BZOJ 3786: 星系探索 ETT
  17. 无法ping 对方计算机,ping通对方ip,却不能访问对方电脑?
  18. Golang的Panic和Recover
  19. 用云服务器搭建虚拟主机,用云服务器搭建虚拟主机
  20. video标签不能自动播放的原因

热门文章

  1. mysql 查询主键
  2. 解放号占楼送大礼活动新浪微博火热进行中
  3. 为什么WiFi和USB3.0会互相干扰?
  4. 子沐课堂——MatPlotlib之四大金刚
  5. ubuntu安装oracle
  6. RabbitMQ fanout广播模式
  7. handlebar的helper应用
  8. python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类
  9. 我在培训机构折腾的经历,再和大家聊聊这个行业| 十年系列
  10. 员工打卡案列使用泛型集合的解决方法以及一些遇到的问题(2018年4月4号突如其来的雪花纷飞)...