跟老男孩学Linux运维:高性能Web集群实践(上)
上QQ阅读APP看书,第一时间看更新

2.4 网站集群架构系统优化

2.4.1 集群节点模板机统一基础优化

1.基础优化操作项:规范功能目录

创建存储软件目录(/server/tools),创建存储脚本目录(/server/scripts)。

        # mkdir -p /server/tools
        # mkdir -p /server/scripts

2.基础优化操作项:配置hosts解析信息

设置本地服务主机名称与IP地址映射关系。

        # 配置/etc/hosts解析文件记录信息
        cat >/etc/hosts<<EOF
        127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
        ::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
        172.16.1.5 lb01
        172.16.1.6 lb02
        172.16.1.7 web01
        172.16.1.8 web02
        172.16.1.9 sweb01
        172.16.1.10 sweb02
        172.16.1.31 nfs01
        172.16.1.41 backup
        172.16.1.51 db01 db01.etiantian.org
        172.16.1.61 m01
        EOF

3.基础优化操作项:修改主机名称

修改主机名称,命令如下。

        # hostnamectl set-hostname backup  #<==设置主机名为backup。

4.基础优化操作项:更新yum源信息

服务器运行过程中,难免需要进行软件的更新,或者进行新服务软件的部署,此时就需要用到yum功能进行软件下载安装与更新,而yum源恰恰关系到软件能否下载成功和软件下载的速率,所以优化yum源也是对系统优化的关键一步。

第一,就近使用yum源地址,安装软件更快。

        curl  -s  -o  /etc/yum.repos.d/CentOS-Base.repo  http://mirrors.aliyun.com/repo/
            Centos-7.repo

第二,安装RHEL/CentOS官方源不提供的软件包。

        curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
        说明:EPEL(Extra Packages for Enterprise Linux企业版Linux的额外软件包)是Fedora
              小组维护的一个软件项目,为RHEL/CentOS提供它们默认不提供的软件包。

5.基础优化操作项:优化安全设置

对于内网环境而言,部分安全方面的设置是非必需的,可以进行关闭,以避免不必要的安全策略影响系统服务的正常运行。

        # 1.关闭SELinux
        sed -i 's#SELINUX=.*#SELINUX=disabled#g' /etc/selinux/config
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
        grep SELINUX=disabled /etc/selinux/config#<==查看修改SELinux的状态。
        setenforce 0                                 #<==临时关闭SELinux。
        getenforce                                    #<==查看SELinux状态。
        说明:关闭系统的安全服务SELinux
        # 2.关闭firewalld防火墙服务
        systemctl disable firewalld                #<==禁止firewalld防火墙开机自启动。
        systemctl stop firewalld                   #<==关闭firewalld防火墙服务。
        systemctl status firewalld                 #<==查看firewalld关闭的状态。
        说明:通知系统的防火墙功能,切记只是针对局域网内部的机器关闭,连接外网的服务器设备还需开启

6.基础优化操作项:精简开机启动程序

系统在启动后,部分软件是伴随系统一起启动的,但是系统启动本身就是一个很耗费时间的过程,如果一些非必需启动项也在系统启动时占用启动资源,多少还是会影响系统性能的;并且有些自启动的软件并不需要进行启动,很可能有些用户不熟悉的软件存在安全隐患,在启动后无形中增加了系统安全风险。因此建议,一些不必要的软件可以设置为不随系统开机自动运行,只将一些必须运行的服务程序,设置为开机自启动。

        systemctl  list-unit-files  |grep  enable|egrep  -v  "sshd.service|crond.service|
            sysstat|rsyslog|^NetworkManager.service|irqbalance.service"|awk  '{print
            "systemctl disable", $1}'|bash         #<==批量处理命令。
        [root@oldboy ~]# systemctl list-unit-files |grep enable #<==处理后结果。
        autovt@.service                                       enabled
        crond.service                                          enabled
        getty@.service                                        enabled
        NetworkManager.service                              enabled
        rsyslog.service                                       enabled
        sshd.service                                           enabled
        sysstat.service                                       enabled
        [root@oldboy ~]# netstat -lntup           #<==重启后查看系统开启的端口情况。
        Active Internet connections (only servers)
        Proto Recv-Q Send-Q Local Address   Foreign Address    State     PID/Program name
        tcp          0        0 0.0.0.0:22      0.0.0.0:*           LISTEN    7039/sshd
        tcp6         0        0 :::22             :::*                  LISTEN    7039/sshd

企业生产最小化原则有以下几个:

1)安装软件包最小化。

2)用户权限最小化。

3)目录文件权限最小化。

4)自启动服务最小化。

5)服务运行用户最小化。

7.基础优化操作项:设置普通用户提权操作(可选优化)

对于系统运维工作中,一些普通用户需要分担超级管理员root的工作压力,因此需要将相应的root权限进行下放,所以要将相应普通用户进行提权。

        # 提权oldboy可以利用sudo。
        useradd oldboy
        echo 123456|passwd --stdin oldboy
        \cp /etc/sudoers /etc/sudoers.ori
        echo "oldboy   ALL=(ALL) NOPASSWD: ALL " >>/etc/sudoers
        tail -1 /etc/sudoers
        visudo -c

8.基础优化操作项:设置系统字符集

设置系统字符集的命令如下。

        # 设置系统中文UTF8字符集。
        [root@oldboyedu ~]# cat /etc/locale.conf
        LANG="en_US.UTF-8"

修改命令如下:

        cp /etc/locale.conf{, .ori}
        localectl set-locale LANG="zh_CN.UTF-8"
        cat /etc/locale.conf

9.基础优化操作项:时间同步设置

在服务架构中,有时需要进行主备连接,或者Master服务端与Agent服务端的连接,这样的连接可能涉及数据信息的同步,而同步时就需要借用系统时间生成时间戳,判断周期性同步的间隔,如果同步的服务器之间时间不统一,可能会造成同步终端间数据同步异常。

        # 设置系统时间同步(Chrony是CentOS7推荐的时间服务器)。
        yum install ntpdate -y    #<==这里依然使用NTP时间服务软件。
        /usr/sbin/ntpdate ntp3.aliyun.com
        echo '#crond-id-001:time sync by oldboy' >>/var/spool/cron/root
        echo  "*/5  *  *  *  *  /usr/sbin/ntpdate  ntp3.aliyun.com  >/dev/null  2>&1">>/var/
            spool/cron/root
        crontab -l

设置定时任务,进行每5分钟的时间同步操作。

10.基础优化操作项:提升命令行操作安全性(可选优化,测试环境下建议不做)

提升命令行操作安全性的命令如下。

        # 提升命令行安全(可选配置)
        echo 'export TMOUT=300' >>/etc/profile        #<==设置会话超时时间为300秒。
        echo 'export HISTSIZE=5' >>/etc/profile       #<==命令行历史记录保留5个。
        echo 'export HISTFILESIZE=5' >>/etc/profile  #<==历史记录文件保留5个。
        tail -3 /etc/profile
        . /etc/profile

11.基础优化操作项:加大文件描述符

一般情况下,一台服务器被访问时会启用很多的程序,而启动每一个程序的进程都会占用文件服务器描述符,因此有时需要加大文件描述符的大小,从而不致影响到程序的启动。

        ulimit -SHn    xxxx
        说明:加大文件描述符命令,但只是临时的,重启系统或重新登录系统后需要重新设置。
        echo '*         -         nofile         65535' >>/etc/security/limits.conf
        说明:永久生效,但需要重新进入系统查看配置文件是否生效。
        # 实例演示:加大文件描述符。
        echo '*             -         nofile             65535 ' >>/etc/security/limits.conf
        tail -1 /etc/security/limits.conf
        ulimit -SHn    65535
        ulimit -n           #<==命令方式查看配置结果。

12.基础优化操作项:优化系统内核

利用相应内核参数数值的优化,从而影响系统的安全性、稳定性、高效性。

        cat >>/etc/sysctl.conf<<EOF
        net.ipv4.tcp_fin_timeout = 2
        net.ipv4.tcp_tw_reuse = 1
        net.ipv4.tcp_tw_recycle = 1
        net.ipv4.tcp_syncookies = 1
        net.ipv4.tcp_keepalive_time = 600
        net.ipv4.ip_local_port_range = 4000     65000
        net.ipv4.tcp_max_syn_backlog = 16384
        net.ipv4.tcp_max_tw_buckets = 36000
        net.ipv4.route.gc_timeout = 100
        net.ipv4.tcp_syn_retries = 1
        net.ipv4.tcp_synack_retries = 1
        net.core.somaxconn = 16384
        net.core.netdev_max_backlog = 16384
        net.ipv4.tcp_max_orphans = 16384
        #以下参数是对Iptables防火墙的优化,防火墙不开会提示,可以忽略。
        net.nf_conntrack_max = 25000000
        net.netfilter.nf_conntrack_max = 25000000
        net.netfilter.nf_conntrack_tcp_timeout_established = 180
        net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
        net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
        net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
        net.core.wmem_default = 8388608
        net.core.rmem_default = 8388608
        net.core.wmem_max = 16777216
        net.core.rmem_max = 16777216
        EOF
        sysctl -p

说明:以上配置参数可以统一放置在/etc/sysctl.conf内核文件中,利用sysctl -p命令,使之内核文件中,修改的内容生效

13.基础优化操作项:安装系统常用软件

CentOS6和CentOS7都要安装的企业运维常用基础工具包如下。

    yum install  tree  nmap  dos2unix  lrzsz  nc  lsof  wget  tcpdump  htop  iftop  iotop
        sysstat nethogs -y

CentOS7要安装的企业运维常用基础工具包如下。

    yum install psmisc net-tools bash-completion vim-enhanced -y

14.基础优化操作项:优化SSH远程连接效率

配置远程连接SSH配置文件,使之连接效率更高、连接更安全。

    \cp /etc/ssh/sshd_config{, .ori}
    说明:备份
    sed -i -e "17s/.*/Port 52113/g" /etc/ssh/sshd_config
    说明:修改SSH服务监听的默认22端口,使用自定义指定的监听端口进行连接
    sed -i -e "19s/.*/ListenAddress 172.16.1.41/g" /etc/ssh/sshd_config
    说明:修改SSH服务监听的默认IP地址,默认为0.0.0.0全部监听,可以自定义指定监听内网IP地址
    sed -i -e "38s/.*/PermitRootLogin no/g" /etc/ssh/sshd_config
    说明:关闭SSH登录root用户权限,提升系统安全性
    sed -i -e "64s/.*/PermitEmptyPasswords no/g" /etc/ssh/sshd_config
    说明:禁止空密码用户SSH连接登录系统
    提别说明:以上均采用sed替换方式修改SSH服务配置文件,替换时指定的行号会根据不同版本的系统
            有变化,最好以工作中常用的系统为主,修改相应行号。
    #如果是CentOS6还要修改SSH配置,防止连接速度慢的优化
    即把UseDNS yes改为UseDNS no,把GSSAPIAuthentication yes改为GSSAPIAuthentication no

特别强调,为了减少集群搭建的难度,本书仅仅显示做了如下的配置优化。

    [root@oldboy ~]# grep oldboy -A 5 /etc/ssh/sshd_config
    PermitEmptyPasswords no
    UseDNS no
    GSSAPIAuthentication no

15.基础优化操作项:锁定关键系统文件优化

对关键系统账号文件和启动文件进行锁定,防止用户篡改。

    chattr +i /etc/passwd /etc/shadow /etc/group     #<==锁定关键账户文件,防删防改。
    chattr +i /etc/inittab /etc/fstab /etc/sudoers  #<==锁定其他关键文件。
    lsattr  /etc/passwd  /etc/shadow  /etc/group  /etc/inittab  /etc/fstab  /etc/
        sudoers                          #<==查看结果。
    mv /usr/bin/chattr /opt/oldboy    #<==移走关键命令。
    cp /usr/bin/xargs /usr/bin/chattr#<==用其他命令伪装一下,用户需妥善保存关键命令

16.基础优化操作项:清理系统版本信息

清理系统版本信息的命令如下。

    说明:系统对外显示的信息越少越安全
        [root@web01~]# cat /etc/issue
        \S
        Kernel \r on an \m
        [root@web01~]# cat /etc/issue.net
        \S
        Kernel \r on an \m
        [root@web01~]# >/etc/issue.net
        [root@web01~]# >/etc/issue
        [root@web01~]# cat /etc/issue
        [root@web01~]# >/etc/issue.net

17.基础优化操作项:为GRUB增加密码

默认情况下,用户可以随意进入GRUB引导界面,这样就会存在安全隐患。例如,有人靠近设备就可以破解root密码,为了防止别人进入单用户模式破解密码,可以添加GRUB密码。

        [root@web01~]# grub2-setpassword
        Enter password:
        Confirm password:
        [root@web01~]# cat /boot/grub2/user.cfg
        GRUB 2_PASSWORD=grub.pbkdf2.sha512.10000.6EF80A70EC860EDACB2D3049195338DE2F3F3
            0D3629C57BC1825E4DB4C260E743B5454FEEBCBA4002E8CD27F08ECD9B67D7456F99C0FB66
            4481F4F4F28B76565.52C99D9A59314094A560F670B194E0E2548A3D3658E7840CE56A2F76
            C7082BEDD98684E07A7F237EAAE9334B5E190FBB77BDF6D429FB4F3D589CCEE610B795C3

此时系统重启后,进入系统GRUB菜单后就会出现输入密码的提示(见图2-3)。

图2-3 设置密码后进入GRUB菜单提示输入密码图

18.基础优化操作项:禁止用户ping服务器IP地址

禁止用户ping服务器IP地址的目的,也是让黑客用户以为服务器停机或者不可用,或禁止返回有效信息。

        [root@web01~]# echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf
        [root@web01~]# sysctl -p
        net.ipv4.icmp_echo_ignore_all = 1

2.4.2 集群节点模板机统一扩展优化

1.扩展优化操作项:优化系统提示符(可根据个人喜好选择)

有时输入命令或查询信息时会刷屏输出很多信息,此时会出现比较尴尬的局面,不知输出的信息是从哪看起,可能正常都应该从输入命令后的信息看起,但如果刷屏好多页,如何快速定位输入命令的命令行呢?如果有颜色进行区分,就能回滚屏幕进行快速定位了。

        # echo   "PS1='\[\e[32;1m\][\u@\h \W]\\$ \[\e[0m\]'" >>/etc/profile
        # source /etc/profile

2.扩展优化操作项:定义系统别名

系统别名只是系统中的一个小功能,虽然功能简单,但用处非常大。有时需要输入的命令会跟上一长串的参数信息,而这样的命令又经常使用,因此定义别名可以简化命令的输出,提升工作的效率。

        # echo "alias grep='grep --color=auto'" >>/etc/profile
        说明:定义grep命令查找的内容有颜色显示,便于查看,CentOS7默认已经配置好了。
        # echo "alias ll='ls -l --color=auto --time-style=long-iso'" >>/etc/profile
        说明:定义ls命令的长格式显示,是输出信息格列完全对齐显示
        # source /etc/profile
        提示:以上只是笔者工作中常用的基本别名设置,读者可根据实际工作情况自行定义。

3.扩展优化操作项:修改yum.conf文件配置信息

将yum.conf中的keepcache=0改为keepcache=1,为日后一键安装网站集群留好rpm及依赖工具包。

        [root@oldboy ~]# vim /etc/yum.conf
        [main]
        cachedir=/var/cache/yum/$basearch/$releasever    #<==定义保存yum安装软件包的默认
                                                              路径。
        说明:$basearch变量信息默认为# uname -m命令输出结果,即显示系统是64位还是32位平台信息
              $releasever变量信息默认为系统的发行版本信息,如果是CentOS6版本下载的,发行版本为
              6,即显示6作为目录,以上只是保存的默认路径信息,软件包下载时也有默认保存路径。
        keepcache=1                 #<==设置为1表示保存yum安装软件包,设置为0表示不保存。
        debuglevel=2                #<==调试级别(0-10),默认为2(具体调试级别的应用,笔者也不
                                        了解)。
        logfile=/var/log/yum.log  #<==yum的日志文件所在的位置。
        exactarch=1                 #<==在更新的时候,是否允许更新不同版本的rpm包,比如是否在
                                        i386上更新i686的rpm包。
        obsoletes=1                 #<==这是一个update的参数,具体请参阅yum(8),简单来说就是
                                        相当于upgrade,允许更新陈旧的rpm包。
        gpgcheck=1                  #<==是否检查GPG(GNU Private Guard),一种密钥方式签名。
        plugins=1                   #<==是否允许使用插件,默认是0不允许,但是我们一般会用yum-
                                        fastestmirror这个插件。
        installonly_limit=5        #<==允许保留多少个内核包。
        bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&\
        ref=http://bugs.centos.org/bug_report_page.php?category=yum
        distroverpkg=centos-release

4.扩展优化操作项:自动快速配置主机名和IP地址

自动快速配置主机名和IP地址的命令如下。

        [root@oldboy scripts]# cat modify.sh
        #! /bin/sh
        if [ $# -ne 2 ]; then
            echo "/bin/sh $0 hostname PartIP"
            exit 1
        fi
        hostnamectl set-hostname $1
        sed -i "/IPADDR/s#200#$2#g" /etc/sysconfig/network-scripts/ifcfg-eth0
            #<==模板机IP最后8位默认是200。
        sed -i "/IPADDR/s#200#$2#g" /etc/sysconfig/network-scripts/ifcfg-eth1
        systemctl restart network
        exit

执行命令如下。

        # sh modify.sh主机名IP地址后8位,在VMware中的虚拟机里执行。
        [root@web01 scripts]# sh modify.sh oldboy 7 #<==7是172.16.1.7,结尾的7。

2.4.3 集群节点模板机统一优化总结

Linux基础优化与安全重点小结

1)不用root登录管理系统,而以普通用户登录通过sudo授权管理。

2)更改默认的远程连接SSH服务端口,禁止root用户远程连接,甚至更改SSH服务只监听内网IP(本章未优化端口、用户以及服务监听的IP)。

3)定时自动更新服务器的时间,使其和互联网时间同步。

4)配置yum更新源,从国内更新源下载安装软件包。

5)关闭SELinux及Iptables/firewalld。

在工作场景中,如果有外部IP一般要打开防火墙,高并发高流量服务器可能无法开启。

6)调整文件描述符的大小,进程及文件的打开都会消耗文件描述符。

7)精简并保留必要的开机自启动服务(如crond、sshd、Network、rsyslog、sysstat、irqbalance)。

8)Linux内核参数优化/etc/sysctl.conf,执行sysctl -p生效。

9)更改系统字符集为“zh_CN.UTF-8”,使其支持中文,防止出现乱码。

10)锁定关键系统文件如/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow、/etc/inittab,处理以上内容后把chattr、lsattr改名为oldboy并转移,这样就安全多了。

11)清空/etc/issue、/etc/issue.net,去除系统及内核版本登录前的屏幕显示。

12)清除多余的系统虚拟用户账号(不是在严苛环境下不做)。

13)为GRUB引导菜单加密码。

14)禁止主机被ping。

15)打补丁升级系统及有已知漏洞的软件。

16)全网域名和自身内网IP实现hosts对应解析。

17)安装系统默认没有的常用工具。

18)提升命令行操作安全性(超时和历史记录)。