CentOS 7 运维优化

CentOS 7 运维优化nginx

2017年12月25日 18:05:27vim

阅读数:644api

CentOS 7 运维优化

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

1.关闭不须要的服务

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

// 安装ntsysv
yum install -y ntsysv
// 设置启动的服务
ntsysv
  • 1
  • 2
  • 3
  • 4

下面列出的是须要启动的服务,未列出的服务一概关闭。服务器

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

2.关闭不须要的TTY

可用vim编辑器打开文件cookie

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/init
    for tty in $(echo $ACTIVE_CONSOLES) ; do
        [ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
        initctl start tty TTY=$tty
    done
end script
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

ps aux | grep tty | grpe -v grep
  • 1

命令显示结果以下所示:并发

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
  • 1
  • 2
  • 3
  • 4
  • 5

事实上没有必要使用这么多,那如何关闭不需婴的进程呢? 
一般保留两个控制台就能够了。运维

vim /etc/init/start-ttys.conf
  • 1

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

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

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

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

// 用Vim编辑器打开
vim /etc/profile
// 找到HISTSIZE=1000 并改成 100;
HISTSIZE=100
// 当即生效
source /etc/profile
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

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

dig ntp.api.bz
  • 1

6.中止IPV6网络服务

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

// 可用以下命令查看:
lsmod | grep ipv6
  • 1
  • 2

有些网络和应用程序还不支持 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网络,使之不会被触发启动
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

另外,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
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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 了。
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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]}'
  • 1
  • 2

命令显示结果以下所示:

LAST_ACK 14
SYN_RECV 348
ESTABISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

命令中的含义分别以下。

  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

  • 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
  • 1

若是是用于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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

若是是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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

固然这些都只是最基本的更改,你们还能够根据本身的需求来更改内核的设置,好比咱们的线上机器在高并发的状况下,常常会出现 ‘‘TCP:too many orpharned sockets ” 的报错尽可能也要本着服务器稳定的最高原则。若是服务器不稳定的话,一切工做和努力就都会白费。  若是以上优化仍没法知足工做要求,则又可能须要定制你的服务器内核或升级服务器硬件。

相关文章
相关标签/搜索