乐趣区

关于前端:实操干货做好这-16-项优化你的-Linux-操作系统焕然一新

大家好,这次跟大家谈谈又拍云的操作系统优化计划。往简略地说,咱们应用的 Linux 操作系统次要都是基于 CentOS6/7 的精简和优化。往简单地说,则是咱们有两套零碎,业务上应用的定制 Linux 零碎和数据中心应用的优化版 Linux 零碎。

业务上咱们应用裁剪过的定制 Linux 零碎,目标是为了更平安、更高效、更加贴近业务需要,不便全国各点进行闪电式部署,但这套零碎不具备普适性,所以咱们明天临时不谈它。明天次要分享数据中心罕用的 Linux 优化版本,因为这个比拟通用,适宜大家在应用时进行参考。我会从以下几个方面来进行分享。

主机名设定和永恒失效

在 CentOS 或 RHEL 中,有以下三种定义的主机名:

  • 动态的(static):“动态”主机名也称为内核主机名,是零碎在启动时从 /etc/hostname 主动初始化的主机名。
  • 瞬态的(transient):“瞬态”主机名是在零碎运行时长期调配的主机名如通过 DHCP 或 mDNS 服务器调配。
  • 灵便的(pretty):“灵便”主机名则容许应用自在模式(包含非凡 / 空白字符)的主机名,以展现给终端用户(如 Gemini’s Computer)。

好的主机名,能够让非运维的机房人员高深莫测地理解和定位机器。比方: 用处名 + 省份 + 机房名 + 机柜号 + 编号,示例如下:

HOST="DBS-ZJ-FUD-009"
hostnamectl set-hostname --static $HOST
hostnamectl set-hostname --pretty $HOST
hostnamectl set-hostname --transient  $HOST
echo "$HOST" > /proc/sys/kernel/hostname

定制近程登录界面

登陆 Linux 的欢送界面可由 /etc/issue 和 /etc/motd 管制。如下显示,不必登录零碎就能高深莫测的晓得零碎版本、CPU 和内存型号容量、运行状态、利用版本号及网络连接状况。

字符集配置

好的字符集,能够防止终端显示下的乱码。倡议应用 en_US.utf8 字符集。

# 查看操作系统反对的所有字符集
# locale -a

cat > /etc/locale.conf <<EOF
LANG=en_US.utf8
LC_CTYPE=en_US.utf8
EOF
localectl set-locale LANG=en_US.UTF8

惯例根底软件装置

因为应用的都是基于 CentOS 的最小化精简装置,装置后会短少一些惯例的根底软件,所以咱们会适当补充一些根底软件,以帮忙疾速排查和定位问题。

yum install -y tree ntpdate  bc nc net-tools wget lsof rsync nmon bash-completion iptables-services firewalld sysstat mtr htop bind-utils yum-utils epel-release smartmontools supervisor python-setuptools python-pip pkgconfig

时区和工夫同步设定

在理论生产环境中,保障服务器时区和工夫的一致性十分重要。尤其是分布式系统、多机集群环境、数据库主从备份、以及依赖工夫同步的定时工作等场景,时区和工夫同步是十分有用的,一旦二者不统一很容易导致各种各样的问题。

timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp 1
timedatectl set-local-rtc 0
#timedatectl set-time "2018-08-08 18:08:08"
ntpdate -u cn.pool.ntp.org

强烈建议同时把工夫同步操作也写入 crontab 里做双保险。

# crontab -l
0 * * * * root(ntpdate -o3 192.168.1.10 211.115.194.21)

禁用 SELinux

SELinux 为平安增强型 Linux(Security-Enhanced Linux),次要由美国国家安全局开发。它概念谨严、构造及配置简单、操作严格。因而在应用时能够视状况决定是否要开启应用,能够在有秘密和信息敏感机构等的非凡场景下能够启用。

sed -r -i  '/^SELINUX=/s^=.*^=disabled^g' /etc/selinux/config
set enforce 0

增加普通用户并 sudo

sudo 是 Linux 系统管理指令,是容许系统管理员让普通用户执行一些或者全副的 root 命令的一个工具,如 halt、reboot、su 等等。这样岂但能够缩小 root 用户的登录和治理工夫,也可能进步安全性。

须要留神的是,生产环境尽量不要间接用 root,倡议先新建普通用户再晋升权限。

[root@OPS-FDI-020 ~]# useradd shaohy
[root@OPS-FDI-020 ~]# usermod -G wheel  shaohy
[root@OPS-FDI-020 ~]# sed -i '/pam_wheel/s/^#//g'  /etc/pam.d/su

为用户 shaohy 增加 sudo,除关机外的其余所有操作:

[root@OPS-FDI-020 ~]# visudo
Cmnd_Alias SHUTDOWN = /sbin/halt, /sbin/shutdown, /sbin/poweroff, /sbin/reboot, /sbin/init
shaohy         ALL=(ALL)       ALL,!SHUTDOWN
%wheel         ALL=(ALL)       ALL,!SHUTDOWN    #批改 wheel 组的权限,禁止关机
Defaults logfile=/var/log/sudo.log

配置防火墙规定和 iptables

自 CentOS7 当前都是默认应用 firewalld 治理 netfilter 子系统,须要留神的是底层调用的命令依然应用了 iptables。二者的区别比照如下:

  • firewalld 能够动静批改单条规定,动静治理规定集,容许更新规定而不毁坏现有会话和连贯。而 iptables,在批改了规定后必须得全副刷新才能够失效。
  • firewalld 应用区域和服务而不是链式规定。
  • firewalld 默认是回绝的,须要设置当前能力放行。而 iptables 默认是容许的,须要回绝的才去限度。

所以在抉择时能够思考不回绝 firewalld,去尝试承受它。

#!/bin/sh
IPS="192.168.0.0/16"
firewall-cmd --zone=public --remove-service=ssh
firewall-cmd --new-zone=openssh --permanent
firewall-cmd --zone=openssh --add-port=22222/tcp --permanent
firewall-cmd --permanent --zone=public --set-target=default
for ip in  $IPS;do
        firewall-cmd --zone=openssh --add-source=$ip --permanent
done
firewall-cmd --reload
firewall-cmd --runtime-to-permanent

GPT 分区和分区挂载

又拍云每一台 CDN 服务器上都有大量硬盘,且不说 4T、6T 这类量比拟小的,即使是 10T 的也有 12 块之多,所以须要自动化格式化和划分区这些硬盘的运维操作。

晚期的主疏导记录(Master Boot Record,缩写:MBR),又叫做主疏导扇区,也就是计算机开机后拜访硬盘时所必须要读取的首个扇区,无奈反对大于 2T 的硬盘疏导。尽管打了补丁的 MBR 也能够反对大于 2T 的分区,但 GPT 曾经成为了新的趋势。相比 MBR 而言,GPT 分区计划有以下特点:

  • GPT 是 UEFI 规范的一部分(UEFI 是一种个人电脑零碎规格,用来定义操作系统与零碎固件之间的软件界面,作为 BIOS 的代替计划)。
  • GPT 分区列表反对最大 128PB(1PB=1024TB)。
  • 能够定义 128 个分区。
  • 没有主分区,扩大分区和逻辑分区的概念,所有分区都能格式化。
#!/bin/sh
DEV=`lsscsi | awk '/HGST/{print $NF}'` # 筛选所有的 sata 硬盘
i=1
for dev in $DEV;do
        label="/disk/sata0$i"
        echo $dev $label
        parted -m -s $dev rm 1
        parted -m -s $dev mklabel gpt
        parted -m -s $dev mkpart primary ext4 2048s 100%
        partx -a $dev
        ((i++))
        nohup mkfs.ext4 -L $label ${dev}1 >/dev/null &
done

ulimit 配额设定

因为 CentOS7 / RHEL7 零碎中应用 Systemd 代替了之前的 SysV,导致 /etc/security/limits.conf 文件的配置只实用于通过 PAM 认证登录用户的资源限度,对 systemd 的 service 资源限度不失效。

因为 systemd service 的资源限度,所以咱们将全局配置搁置于 /etc/systemd/system.conf 和 /etc/systemd/user.conf 中。其中 system.conf 用于零碎实例,user.conf 用于用户实例。

sed -r -i -e '/DefaultLimitCORE/s^.*^DefaultLimitCORE=infinity^g' -e '/DefaultLimitNOFILE/s^.*^DefaultLimitNOFILE=100000^g' -e '/DefaultLimitNPROC/s^.*^DefaultLimitNPROC=100000^g' /etc/systemd/system.conf

加大关上文件数的限度, 默认设置了非 root 用户的最大过程数为 4096。

cat > /etc/security/limits.d/20-nproc.conf <<EOF
*       soft  nproc  10240
root    soft  nproc  unlimited
EOF

sysctl.conf 配置失效

sysctl.conf 文件配置参数较多且简单,如果须要详解每一个参数的作用须要很长时间。这里咱们之间看一部分常见调优参数来感受一下。次要是集中在网络和 TCP 参数优化、swap 禁用、文件句柄放大。


net.ipv4.ip_forward=1
net.ipv4.ip_local_port_range=1000 65535

net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_rfc1337=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_sack=1
net.ipv4.tcp_dsack=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_rmem=4096 102400 16777216
net.ipv4.tcp_wmem=4096 102400 16777216
net.ipv4.tcp_mem=786432 1048576 1572864
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_synack_retries=5
net.ipv4.tcp_retries1=3
net.ipv4.tcp_retries2=15
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_max_syn_backlog=262144                                  
net.ipv4.tcp_max_orphans=262144
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_keepalive_time=30
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_max_tw_buckets=600000
net.ipv4.tcp_congestion_control=bbr

net.core.somaxconn=8192
net.core.rmem_default=131072
net.core.wmem_default=131072
net.core.rmem_max=33554432
net.core.wmem_max=33554432
net.core.dev_weight=512
net.core.optmem_max=262144
net.core.netdev_budget=1024
net.core.netdev_max_backlog=262144

vm.swappiness=0
vm.dirty_writeback_centisecs=9000
vm.dirty_expire_centisecs=18000
vm.dirty_background_ratio=5
vm.dirty_ratio=10
vm.overcommit_memory=1
vm.overcommit_ratio=50
vm.max_map_count=200000

fs.file-max=524288
fs.aio-max-nr=1048576 

/etc/passwd 安全性查看

用户的 shell 权限查看,通常思考到安全性的问题,不容许有非 root 用户领有 shell 权限。

# 过滤出有 uid==0, gid== 0 的埋伏用户, 判断有没有 bash
awk -F: '($3==0||$4==0) {print $0}' /etc/passwd|grep -i bash
# 除 root 外的用户 shell 全副为 nologin
sed -r -i '/^[^root]/s:/bin/bash:/sbin/nologin:g' /etc/passwd

sshd 服务配置

因为简直所有 Linux 服务器都通过 SSH 来进行远程管理,这很容易招来许多不请自来,千方百计通过 SSH 来获得您的服务器权限。所以 SSH 平安不容忽视!强烈建议禁用口令登录,批改之前先改用公密钥的形式来 SSH 登录治理服务器。

sed -r -i '/#Port 22/s^.*^Port 22222^g;/^PasswordAuthentication/s^yes^no^g' /etc/ssh/sshd_config

敞开不必要服务

Linux 服务(Linux services)对于每个利用 Linux 的用户来说都很重要。敞开不必要的服务,能够让 Linux 运行更高效,但并不是所有的 Linux 服务都能够敞开,这个要本人衡量。

systemctl disable network  postfix irqbalance tuned rpcbind.target

如果有基于 udp 的服务,如 ntpd、dns,要留神 udp 的反射攻打。因为 udp 的反射攻打破坏力极大,最好敞开掉无用相干的服务, 或者抉择高防机房去部署此类服务。

logrotate 缩减轮转日志包

当服务器过程较多,日志文件大小增长较快,就会一直耗费磁盘空间并触发告警。这时就须要人为定期依照各种维度去手动清理日志,如果不及时清理则很容易变成运维事变。

通常能够应用 logrotate 日志滚动机制将日志文件按工夫或大小分成多份,删除工夫长远的日志文件,从而节俭空间和不便整顿。

sed -r -i 's@weekly@daily@g;s@^rotate.*@rotate 7@g;s@^#compress.*@compress@g' /etc/logrotate.conf
systemctl daemon-reload; systemctl restart rsyslog

journalctl 调整 journal 日志

在 Systemd 呈现之前,Linux 零碎及各利用的日志都是别离治理的,而 Systemd 对立治理了所有 Unit 启动日志。这样的益处就是能够只用一个 journalctl 命令,查看所有内核和利用的日志。

适当的配置能够让 journal 体积可控,不至于容量爆炸。

sed -r -i -e '/Compress=/s@.*@Compress=yes@g; /SystemMaxUse=/s@.*@SystemMaxUse=4G@g;' -e '/SystemMaxFileSize=/s@.*@SystemMaxFileSize=256M@g;' -e '/MaxRetentionSec=/s@.*@MaxRetentionSec=2week@g' /etc/systemd/journald.conf

综上所述,实现以上这些优化后,一个安全可靠的操作系统就能够正式上线提供服务了, 祝大家 Linux 之旅玩得欢快!

举荐浏览

面试官问,Redis 是单线程还是多线程我懵了

Base64 编码常识,一文打尽

退出移动版