高性能Linux架构实战 [高俊峰] 笔记摘要

一 Linux服务器安全与运维
    1.账户和登录安全
           可删除的默认无用用户:
               adm lp sync shutdown halt news uucp operator games gopher
           可删除的默认无用组:
               adm lp uucp games dip pppusers popusers slipusers
           关闭不需要的服务:
               anacron auditd autofs avahi-daemon avahi-dnsconfd bluetooth cupspeed firstboot gpm haldaemon hidd ip6tables ipsec isdn lpd mcstrans messagebus netfs nfs nfslock nscd pcscd portmap readahead_early restorecond rpcgssd rpcidmapd rstatd sendmail setroubleshoot yppasswdd ypserv.
                [chkconfig --level 345 anacron off]
            将SSH客户端生成的密钥放置服务端 启用Publickey认证
                 mkdir /home/test/.ssh
                 chmod 700 /home/test/.ssh
                 ssh-keygen -i -f test.pub >> /root/.ssh/authorized_key2
                 vim /etc/ssh/sshd_config
                     Protocol 2                                                         #仅使用SSH2认证
                     PubkeyAuthentication yes                                #启用PublicKey认证
                     AuthorizedKeysFile .ssh/authorized_key2        #PublicKey文件路径
                     PasswordAuthentication no                             #不使用口令认证
                  /etc/rc.d/init.d/sshd restart
             开放普通用户单文件特权   (使用sudo 访问无权限的文件 输入密码后获得5分钟的访问券)
                 vim /etc/sudoers
                      test01 ALL = /bin/more /etc/shadow
                       #无需密码的方式
                       test01 ALL = NOPASSWD: /etc/init.d/nagios restart 
                       #普通用户提权为超级用户并不需要密码
                        test01 ALL=(ALL) NOPASSWD: ALL
              系统登录欢迎信息
                  /etc/issue /etc/issue.net /etc/redhat-release /etc/motd
                  vim /etc/ssh/sshd_config 
                      Banner /etc/issue.net
               禁止Ctrl+Alt+Del 关机
                   centos5.x
                        vim /etc/inittab
                             ca::ctrlaltdel:/sbin/shutdown -t3 -r now           #将此行注释
                         telinit q
                    centos6.x
                         vim /init/control-alt-delete.conf
                              exec /sbin/shutdown -r now "Control-Alt-Delete pressed"   #注释此行
                 禁止telnet方式认证登录
                     vim /etc/ssh/sshd_config
                 修改shell历史记录长度
                     vim /etc/bashrc
                         HISTFILESIZE=10000
                         HISTSIZE=10000
                         HISTTIMEFORMAT='%F %T'
                         export HISTTIMEFORMAT

/etc/profile
#history
USER_IP= `who -u am i 2>/dev/null |awk '{print $NF}'|sed -e 's/[()]//g'`
HISTDIR=/usr/share/.history
if [ -z $USER_IP]
then
    USER_IP=`hostname`
fi

if [ ! -d $HISTDIR ]
then
    mkdir -p $HISTDIR
    chmod 777 $HISTDIR
fi

if [ ! -d $HISTDIR/${LOGNAME} ]
then 
    mkdir -p $HISTDIR/${LOGNAME}
    chmod 300 $HISTDIR/${LOGNAME}
fi
export HISTSIZE=10000
DT=`date +%Y%m%d_%H%M%s`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DY"
export HISTTIMEFORMAT="{%Y.%m.%d %H:%M:%S}"
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
-------------------------------------------------------------
                    文件权限检查
                         任何用户都有写权限
                              find / -type f -perm -2 -o -perm -20 |xargs ls -al
                              find / -type d -perm -2 -o -perm -20 |xargs ls -al
                          含有s位的程序
                               find / -type f -perm -4000 -o -perm -2000 -print |xargs ls -al
                          查询含有suid和sgid文件
                                find / -user root -perm -2000 -print -exec md5sum {} \;
                                find / -user root -perm -4000 -print -exec md5sum {} \;
                           查询没有属主的文件
                                find / -nouser -o nogroup 
                        /tmp单独分区时安全的挂载方式
                            LABEL=/tmp    /tmp    ext4    rw,nosuid,noexec,nodev    0 0
                        /tmp是目录的安全挂载方式 [启动loopback文件系统]
                            dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000
                            mke2fs -j /dev/tmpfs
                            cp -av /tmp /tmp.old
                            mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp
                            chmod 1777 /tmp
                            mv -f /tmp.old/* /tmp
                            rm -rf /tmp.old
                            vim /etc/fstab 
                                /dev/tmpfs /tmp ext4 loop,nosuid,noexec,rw 0 0
                         /dev/shm 安全挂载方式
                             vim /etc/fstab
                                 tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0

                  文件级rootkit
                      检查文件完整性:Tripwire aide
                      后门检测工具 chkrootkit
                              避免chkrootkit依赖的工具被污染提前备份一份完整所需工具至指定目录
                                     mkdir /usr/share/.commands
                                     cp `which --skip-alias awk cut echo find egrep id head ls netstat ps strings sed uname` /user/share/.commands 
                                     chkrootkit -p /usr/share/.commands/
                       检测工具2 RKHunter            
                               #./installer.sh --layout default --install
                               rkhunter -c
                               rkhunter --check --skip-keypress     #静默检查
                               09 3 *** root rkhunter --check --cronjob
                  pidof 
   2.网络安全运维
            Ntop:嗅探网络数据包类型,分析区分数据流量
            Ntopng 
            iperf:网络性能评估工具
                    iperf3 -c 192.168.12.168
                    iperf3 -c 192.168.12.168 -t 20 -i 5
                    iperf3 -c 192.168.12.168 -i 10 -n 5000000000  #每隔十秒发送5G的数据
                    iperf3 -c 192.168.12.168 -F test.tar.gz -i 5 -t 20 -f M
                    iperf3 -c 192.168.12.168 -u -b 100M -f M -i 3
             nmap:网络发现工具
                    nmap 39.106.125.107
                    nmap -T4 -A -v 39.106.125.107
                    nmap -sn -PE -PS22,80 -PU53 www.baidu.com
                            PE:发送ICMP echo 报文     PS:发送TCP SYN/ACK的形式侦探主机    PU:以UDP形式侦探
                    nmap -sU -sS -F www.myblogsite.top   
                    nmap -O --osscan-guess 192.168.3.1-254
     3.数据安全
            DRDB
                     yum -y install kmod-drbd83 drbd83
                     modprobe drbd
                     lsmod|grep -i drbd
                     modprobe -l|grep -i drbd
             dd创建空数据: dd if=/dev/zero of=/mnt/testblack.tmp bs=10M count=20
             数据恢复extundelete:  Linux常用恢复工具:debugfs R-Liunx ext3grep extundelete等.extundelete与ext3grep比较常用,两款工具原理较为相似.前者功能更强大.
              通过分析文件系统的日志,解析出所有文件的indoe信息,从而可以恢复Linux下主流的ext3 ext4文件系统下被误删除的文件.而ext3grep仅支持ext3文件系统,此外在恢复速度上前者要更快,是通过扫描inode和数据恢复同时进行,且支持单文件 单目录 inode恢复 block恢复与完整磁盘恢复.而ext3grep略显笨拙需要扫描所有inode信息然后开始恢复数据,速度上相对比较慢且不支持目录 时间恢复等.
                     前置安装e2fsprogs与e2fsprogs-libs
                     1.误操作删除需要立即将分区卸载.
                     2.extundelete /dev/sdc1 --inode 2
                     3.extundelete /dev/sdc1 --restore-file passwd   #单文件恢复
                     4.extundelete /dev/sdc1 --restore-directory /ganglia-3.4.0  #单目录恢复
                     5.extundelete /dev/sdc1 --restore-all  #全部文件恢复
                     6.extundelete --after 1379146740 --restore-all /dev/sdc1  #恢复一小时内文件   当前 date +%s-3600
        4.Linux系统运维故障排查思路
               Linux系统常见无法启动
                   a.文件系统受损 [ext3 ext4文件系统都是具备日志记录功能的日志文件系统,并且可以进行 简单的容错与纠错.日志文件系统并 不是将数据实时写入到磁盘,而是定期批量写入,但文件系统的所有读写操作都会实时 记录到日志文件中,当系统发生掉电等错误导致数据没有写入磁盘时可以通过日志文件的记录 回滚发生故障的读写操作,从而保证数据和文件系统的 一致性,但是由于实际环境复杂多样导致文件系统不能每一次都可以成功自我修复,这是就需要运维人员手动介入修复.]
                        掉电开机提示:  /dev/sda6 contains a file system with errors,check forced
                                             /dev/sda6:UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY
                                             (or type Control-D to continue):
                                              give root password for maintenance
                       输入root密码后进入修复模式,使用fsck命令修复.
                        fsck.ext3 -y /dev/sda6           [无法恢复的数据会存放在文件系统lost+found目录中]    (fsck -A -y)
                        若忘记root密码
                            centos6.x
                                1.引导参数中增加  init=/bin/bash 载入系统.
                                2.mount -o remount,rw /             #重挂根
                                3.passwd                                       #修改密码
                                4.重启输入root密码继续修复.
                             centos7.x
                                 1.引导参数中增加  rd.break console=tty0  载入系统
                                 2.mount remount,rw /sysroot        #重挂根
                                 3.chroot /sysroot                            #切换根
                                 4.passwd          
                                 5.touch /.autorelabel                          
                                 6.exit
                                 7.reboot
                   b.系统文件配置不当或/etc/fstab文件丢失
                        开机提示: starting system logger
                           1.开机使用引导介质进入救援模式  [linux rescue]
                           2.e2label 可查看每个分区对应的挂载点 
                           3.查找出原系统的跟分区目录查找出对应分区 如 /dev/sda3
                           4.创建一个目录 /rescue_tmp 将原根挂载至此    mkdir /rescue_tmp ;mount /dev/sda3 /rescue_tmp
                           5.vim /rescue_tmp/etc/fstab
                           6.恢复完成后重启系统.
                   c.Linux内核丢失或崩溃
                   d.引导程序出错
                   e.硬件故障
                   f.无响应分析
                       系统硬件问题: SCSI卡 主板 RAID卡 HBA卡 网卡 硬盘等硬件设备导致,通过更换硬件解决
                       外围硬件问题: 主要为网络问题导致.网络设备 网络参数等方面查找
                              软件问题: 系统内核bug 应用软件bug 驱动程序bug等  通过升级内核 修复程序bug 更新驱动程序解决
                       系统设置问题: 防火墙配置 开机启动不正确等.
                           iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT 
                           iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

    5.常见故障案例
           su 切换普通用户时报错.
               报错提示: su: warning: cannot change directory to /home/oracle: Permission denied
                              su: /bin/bash: Permission denied 
               排查思路:
  • 用户目录权限存在问题
        ls -ld /home/oracle 
  • su   程序权限存在问题
        ll /bin/su
  • 程序依赖的共享库问题
        ldd /bin/su 
  • SELinux问题
        grep "SELINUX" /etc/selinux/config
  • 系统根分区问题
         检查剩余容量
         检查根分区权限
                           
               创建文件提示: Cannot make directory: file:/www/data/html          [Read-only file system]
                   原因比较多,可能是文件系统数据块出现不一致导致,也可能是磁盘故障导致.可以尝试fsck修复
                    1.卸载无法写入的磁盘.
                    2.若有占用则查询占用端口  fuser -m /dev/sdb1    查找出占用进程
                    3.停止进城后卸载目录
                    4.进行修复   fsck -V -a /dev/sdb1
                    5.重新挂会

                操作大量文件时遇到 Argument list too long     getconf ARG_MAX  控制传递参数
                      手动分批删除
                       find传递删除
                       shell脚本循环删除
                       重新编译linux内核  include/liunx/binfmts.h文件 #define MAX_ARG_PAGES 32   将32改为64或128.重新编译
                 
                 inode消耗殆尽 
                       dumpe2fs -h /dev/sda3|grep 'Inode count'

                 文件删除后空间不释放:  文件存放分为数据部分和指针部分,指针部分位于文件系统的meta-data中,将数据清除后指针从meta-data中被清除.将数据对应的指针清除后空间随之释放.
                       进程占用不断的写数据导致

                  Too many open files 
                         ulimit -n              [/etc/security/limits.conf]
                                                     www soft nofile 65535
                                                     www hard nofile 65535
                              内核文件大小限制
                              进程数据块大小限制
                              shell进程创建文件大小限制
                              可加锁内存大小限制
                              常驻内存集的大小限制
                              打开文件句柄数限制
                              分配堆栈的最大大小限制
                              CPU占用时间限制用户最大可用的进程数
                              shell进程所能使用的最大虚拟内存限制

                       No speace left on device:mod_rewrite:could not create rewrite_log_lock Configyration Failed  
                              信号量占尽.  ipcs -s |grep nobody|perl -e 'while (<STDIN> { @a=split(/\s+/); print `ipcrmsem $a[1]`})'


6.轻量级运维利器pssh pdsh mussh
    并行ssh运维工具pssh   parallel-ssh  支持文件并行复制/远程并行执行命令/杀死远程主机进程等
        &  需要保证本地主机与管理服务器之间单向信任
        &  Python版本大于2.4
        &  附带5个主程序 
                 ssh(pssh)          远程主机并行运行命令
                 scp(pscp)          复制文件至远程多台主机
                 rsync(prsync)    使用rsync协议将文件从本地同步到远程多台主机
                 nuke(pnuke)     在远程主机并行killall某进程
                 slurp(pslurp)     将文件从远程主机复制到本地
        查看user002 003的时间
            pssh -H [email protected].com:9529 -P date
            pssh -H user003.bestbook.com -i date
        批量管理列表  /etc/pssh/hosts
        批量下发命令
            获取运行时间 
                pssh -i -O "StrictHostKeyChecking=no" -h /etc/pssh/hosts "uptime"        -O "StrictHostKeyChecking=no"  让远程主机自动接受本地hostkey
            解压文件
                passh -i -h /etc/pssh/hosts "tar -xzvf test.zip"
            连接指定端口
                passh -i -x "-l opsuser" "-p 9529" -h /etc/pssh/hosts -o /etc/pssh/info "uptime;name-a"                          
        本地文件推送给批量远端
                pscp -h /etc/pssh/hosts /etc/ssh/ssh_config /tmp
                pscp -h /etc/pssh/hosts -r /etc/httpd/conf /tmp  
         本地拉取远端文件
                pslurp -h /etc/pssh/hosts -L /home/opsuser/test > /home/opsuser/gmond.conf gmond1.conf
                pslurp -h /etc/pssh/hosts -r -L /home/opsuser/test > /home/opsuser/gmond gmond1
         本地文件同步到远程主机
                prsync -h /etc/pssh/hosts -l opsuser -a -r /etc/httpd /tmp
                prsync -h /etc/pssh/hosts -l opsuser -az -r /var/log/httpd /tmp               #压缩传输
         杀死远端进程
                punke -h /etc/pssh/hosts httpd

    分布式运维工具pdsh  parallel distributed shell  适用于大批量服务器配置/部署/文件复制/运维等操作
            &  需要保证本地主机与管理服务器之间的单向信任
            &  默认rsh方式  支持ssh mrsh qsh mqsh krb4 xcpu 等多种rcmd模块
            &  --with-ssh  --with-dshgroups  --with-machines  --with-dshgroups
            &  传输文件时 本地与远端都必须安装pdcp
            批量统计信息
                pdsh -w ssh:192.168.16.[1-3]  "uname -n"
                pdsh -w ssh:user00[1-5] -x user003 "uptime"
                pdsh -w ssh:user00[10-31],/15/ "uptime"
            文件批量调用
                /etc/pdsh/machines
                pdsh -R ssh -a uptime
                pdsh -R ssh -g userhosts uptime
                pdsh -R ssh -a -X userhosts uptume
            交互模式
                 pdsh -R ssh -w user001
            文件传输
                 pdcp -R ssh -g userhosts /home/opsuser/mysqldb.tar.gz /home/opsuser
                 pdcp -R ssh -w userhosts -r /home/opsuser/webdata /home/opsuser

        多主机ssh封装mussh  MUltihost SSH Wrapper
                &  需要保证本地主机与管理服务器之间的单向信任
                 批量命令:
                         mussh -h opsuser@user01 opsuser@user02 -c uptime
                 文件批量命令       /home/opsuser/myhosts
                         mussh -H myhosts -l opsuser -c uptime
                 本地脚本远端执行
                         mussh -o "port=22" -H myhosts -s /usr/bin/python -C "/home/opsuser/checkos.py"


7.分布式监控
        Ganglia HPC(高性能计算集群) 采集CPU 内存 硬盘使用率 I/O负载 网络流量等情况汇总到gmetad守护进程下,使用rrdtool存储数据.以曲线方式展示
                &  gmond: ganglia monitoring daemon 守护检测进程默认监听8649
                &  gmetad:ganglia meta daemon 数据汇聚守护进程,将数据存储至RRD引擎中
                &  webfrontend:从gmetad中读取RRD数据通过rrdtool生成图表
                gmetric -n disk_used -v 40 -t int32 -u '% test' -d 50 -s '8.8.8.8:cloud1'
                 

8.高性能Nginx服务器
        HTTP/IMAP/POP3/SMTP代理服务器
        --with-http_stub_status_module    #开启nginx status功能 监控状态
        --with-http_gzip_static_module     #开启Gzip压缩功能
        select          标准工作模式1
        poll             标准工作模式2
        kqueque     高效工作模式1
        epoll           高效工作模式2
        rtsig            
        /dev/poll
        max_client=worker_processes * worker_connections(默认1024)   #ulimit -n 65536
        sendfile  on; tcp_nopush on ; tco_nodelay on;
        开启ngin运行状态
            localtion /NginxStatus {
                            stub_status                 on;
                            access_log                  logs/NginxStatus.log;
                            auth_basic                  "NginxStatus";
                            auth_basic_user_file   ../htpasswd;
             }
             htpasswd -C htpassswd password
         信号处理:
             QUIT:  15   处理完当前请求关闭进程
              HUP:         重载配置,关闭原由进程开启新进程,不中断请求
              USR1:        Nginx日志切割
              USR2:        平滑升级
              WINCH:     从容关闭
          rewrite重写 来自www.taob.com的请求至www.tb.com 
              service {
                             service_name  www.taob.com;
                             rewirte ^/(.*)$  http://www.tb.com/$1 permanent;   #301 redirect 302
               }
           基于核心变量$host实现重定向
                service {
                             server_name  www.tb.com www.taob.com;
                             if ($host != 'www.tb.com') {
                                     rewirte ^/(.*)$ http://www.tb.com/$1 permanent;
                              }
                }
           禁止访问特定资源
                  location ~* \.(txt|doc)$ {
                              root /data/www/wwwroot;
                              deny all;
                   }
            Nginx内置变量
                    $args                       与请求行的参数相等
                    $document_root     当前root命令指定的值
                    $uri                          当前request中的URI
                    $document_uri        同等$uri
                    $host                       与头部"Host"行的值一致
                    $limit_rate               限制连接速率
                    $request_method    同等于request的method GET或POST
                    $remote_addr          客户端IP
                    $remote_port           客户端端口
                    $remote_user           用户名  ngx_http_auth_basic_module认证
                    $request_filename    当前请求的文件的路径名,由root或alias与URI request组合而成
                    $request_uri              参数完整的初始URI
                    $query_string            与$args一致
                    $server_name            请求到达的服务器名
                    $server_port               请求到达的端口号
               location ~ ^/best/ {
                        rewirte ^/best/(.*)$ /test/$1 break;
                        proxy_pass http://www.taob.com;
                }

                location / {
                          proxy_pass http://127.0.0.1:8080/;
                          set $query $query_string;
                          rewrite /dade /wordpress?$query?;
                 }
                 可将http://www.tb.com/wp/?p=160的页面重写到www.tb.com/wordpress/?p=160
                 
                 service {
                          listen             80;
                          server_name www.tb.cn  www.taob.com;
                          if ($host != 'www.tb.cn') {
                                  rewirte ^/(.*)$ http://www.tb.cn/error.txt  bread;
                                  rewirte ^/(.*)$ http://www.tb.cn/$1 permanent;
                          }
                  }

                 nginx 编译时注释 auto/cc/gcc 的  CFLAGS="$CFLAGS -g"
                 --with-cc-opt='-O3'
                 --with-cpu-opt=CPU  [pentinm pentiumpro pentium3 pentium4 athlon opteron adm64 sparc32 sparc64 ppc64]     cat /proc/cpuinfo  |grep "model name"

     TCMalloc 优化Nginx性能 
              1.安装libunwind库
              2.安装google-perftools
              3.重新编译nginx 添加参数 --with-google_perftools_module
              4.添加google-perftools线程目录  0777 权限
              5.nginx主配置文件pid处写入 google_perftools_profiles /tmp/tcmalloc;
              6.重启nginx 验证

     针对nginx的内核优化   /sbin/sysctl -p
               net.ipv4.tcp_max_tw_buckets = 6000               #timewait数量  默认180000
               net.ipv4.ip_local_port_range = 1024 65000     #允许系统打开的端口范围
               net.ipv4.tcp_tw_recycle = 1                              #启用timewait快速回收
               net.ipv4.tcp_tw_reuse = 1                                 #允许TIME-WAIT sockets
               net.ipv4.tcp_syncookies = 1                             #SYN等待队列溢出时启用cookies处理
               net.core.somaxconn = 262144                         #tcp并发连接 默认 128
                net.core.netdev_max_backlog = 262144          #网口数据包速率比内核处理快时允许等到的队列大小
               net.ipv4.tcp_max_orphans = 262144                #设定最大套接字不被关联到任何用户文件句柄上
                net.ipv4.tcp_max_syn_backlog = 262144          #记录尚未收到客户端确认信息的连接请求最大值
               net.ipv4.tcp_synack_retries = 1                         #内核放弃连接之前发送SYN+ACK包的数量
               net.ipv4.tcp_syn_retres = 1                               #内核放弃建立连接前发送SYN包的数量
               net.ipv4.tcp_fin_timeout = 1                             #保持FIN-WAIT-2状态的时间 默认60
               net.ipv4.tcp_keepalive_time = 30                      #keepalive启动时tcp发送的频度 默认2

 











            























猜你喜欢

转载自blog.csdn.net/u010842538/article/details/80343719