一般的,我们安装CentOS mini和其他相应服务后,就能正常工作了。但工作一段时间后,服务器会出现不稳定、被入侵、甚至在突然的高并发时直接瘫痪状况。这些问题大多都是由于我们考虑其实际的抗压性和安全性的原因。所以,在这里提供一些运维优化的建议。
众所周知,服务越少,系统占用的资源就会越少, 所以应当关闭不需要的服务。建议把不需要的服务关闭掉,这样做的好处是减少内存和CPU资源占用。首先可以看下系统中 存在着哪些已经启动了的服务。
// 安装ntsysv
yum install -y ntsysv
// 设置启动的服务
ntsysv
下面列出的是需要启动的服务,未列出的服务一律关闭。
可用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/init
for tty in $(echo $ACTIVE_CONSOLES) ; do
[ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
initctl start tty TTY=$tty
done
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
调整TCPⅡP网络参数,可以加强对抗 SYN Flood 的能力,命令如下:
echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.conf
sysctl -p
// 用Vim编辑器打开
vim /etc/profile
// 找到HISTSIZE=1000 并改为 100;
HISTSIZE=100
// 立即生效
source /etc/profile
yum install -y ntp
crontab -e
// 加入一行
*/5 * * * * /usr/sbin/ntpdate ntp.api.bz
ntp.api.bz是一组NTP服务器集群,之前是6台服务器,位于上海电信;现在是3台服务器,分散于上海和浙江电信,可以用 dig 命令查看
dig ntp.api.bz
在 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网络,使之不会被触发启动
要调整一下 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
在配置 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
Linux文件默认有3个时间,分别如下所示。
如果有多个小文件(比如 Web 服务器的页面上有多个小图片),通常是没有必要记录文件的访问时间的,这样就可以减少写磁盘的 I/O ,可这要如何配置呢?
// 修改文件系统的配置文件
vim /etc/fstab
// 然后,在包含大量小文件的分区中使用 noatime 和 nodiratime 这两个命令。例如:
/dev/sda5 /data/pics ext3 noatime,nodiratime 0 0
这样文件被访问时就不会再产生写磁盘的 I/O 了。
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
添加用户的步骤和过程比较简单这里略过,由于系统已经禁止了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
内核的优化跟服务器的优化一样,应本着稳定安全的原则。下面以Squid服务器为例来说明,待客户端与服务器端建立 TCP/IP 连接后就会关闭Socket,服务器端连接的端口状态也就变为 TIME_WAIT 了。那是不是所有执行主动关闭的SOCket都会进入TIME_WAIT 状态呢?有没有什么情况可使主动关闭的Socket直接进入CLOSED状态呢?答案是主动关 闭的一方在发送最后一个ACK后就会进人 TIME_WAIT 状态,并停留2MSL(报文最大生存)时间,这是 TCP/IP 必不可少的,也就是说这一点是“解决”不了的。
TCP/IP 护设计者如此设计,主要原因有两个:
// 在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
命令中的含义分别如下。
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
以下将简单说明上面各个参数的含义:
执行以下命令使内核配置立马生效:
/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 ” 的报错尽量也要本着服务器稳定的最高原则。如果服务器不稳定的话,一切工作和努力就都会白费。 如果以上优化仍无法满足工作要求,则又可能需要定制你的服务器内核或升级服务器硬件。
(adsbygoogle = window.adsbygoogle || []).push({});