#!/bin/bash

Author: guop

centos7初始化脚本

PASSWD=password HOSTNAME=EIFM DNS1=119.29.29.29 DNS2=223.5.5.5

cat << EOF +------------------------------------------------------------------+ | ********** Welcome to CentOS 7 System init ********** | +------------------------------------------------------------------+ EOF

[ whoami != "root" ] && echo "please use root" && exit 1

function format() { echo -e "\033[32m Success!!! \033[0m\n" echo "#########################################################" }

###修改root用户密码 echo "set root passwd" echo $PASSWD | passwd root --stdin &> /dev/null format

###修改主机名 echo "set hostname" hostname $HOSTNAME && echo "HOSTNAME=$HOSTNAME" >> /etc/sysconfig/network format

###配置DNS解析 echo "set DNS" echo "" > /etc/resolv.conf
echo "nameserver $DNS1" > /etc/resolv.conf echo "nameserver $DNS2" >> /etc/resolv.conf ping -c 3 www.baidu.com &> /dev/null || echo "请检查网络连接,此脚本需要访问外网" || exit 3 format

###关闭Selinux服务 echo "disable selinux" [ getenforce != "Disabled" ] && setenforce 0 &> /dev/null && sed -i s/"^SELINUX=.*$"/"SELINUX=disabled"/g /etc/sysconfig/selinux format

###更新yum源为阿里云 echo "set yum repo" mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &> /dev/null yum makecache &> /dev/null format

###锁定重要配置文件 echo "chattr files" chattr +i /etc/passwd chattr +i /etc/inittab chattr +i /etc/group chattr +i /etc/shadow chattr +i /etc/gshadow chattr +i /etc/resolv.conf chattr +i /etc/hosts chattr +i /etc/fstab #chattr -i /etc/passwd format

###设置字符集为中文 echo "set LANG" echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf format

###自动更新服务器时间 echo "set ntptime" yum install ntpdate -y cp -fr /usr/share/zoneinfo/Asia/Shanghai /etc/localtime cat >> /etc/crontab << EOF #sync time */30 * * * * /usr/sbin/ntpdate pool.ntp.org &> /dev/null && /sbin/hwclock -w &> /dev/null EOF sed -i "/server/d" /etc/chrony.conf echo 'server ntp.aliyun.com iburst &>/dev/null' >> /etc/chrony.conf format

###内核参数优化 echo "Set sysctl.conf" cat > /etc/sysctl.conf << EOF net.ipv4.ip_forward = 0
#开启路由功能 net.ipv4.conf.all.rp_filter = 1 #加强入站过滤和出站过滤 net.ipv4.conf.default.rp_filter = 1 #开启反向路径过滤 net.ipv4.conf.default.accept_source_route = 0 #处理无源路由的包 kernel.sysrq = 0 #控制系统调试内核的功能要求 kernel.core_uses_pid = 1 #用于调试多线程应用程序 net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 kernel.msgmnb = 65536 #所有在消息队列中的消息总和的最大值 kernel.msgmax = 65536

指定内核中消息队列中消息的最大值

kernel.shmmax = 68719476736 #于定义单个共享内存段的最大值,64位linux系统:可取的最大值为物理内存值-1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为64GB物理内存,可取6410241024*1024-1=68719476735 kernel.shmall = 4294967296 #inux共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是 16G,那么需要共享内存页数是16GB/4KB=16777216KB /4KB=4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求(几乎是原来设置2097152的两倍) net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv4.neigh.default.gc_stale_time = 120 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2 ###内存资源使用相关设定 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 65536 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 8388608 8388608 8388608 ##应对DDOS攻击,TCP连接建立设置 net.ipv4.tcp_syncookies = 1 #防止syn flood攻击 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_max_syn_backlog = 262144 #SYN队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数 ##应对timewait过高,TCP连接断开设置 net.ipv4.tcp_max_tw_buckets = 10000 #默认是180000。表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息 net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速收回功能,默认为 0 ,表示关闭。 net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的 TCP 连接,默认为 0 表示关闭 net.ipv4.tcp_timestamps = 0 #时间戳可以避免序列号的卷绕 net.ipv4.tcp_fin_timeout = 5

表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些

net.ipv4.ip_local_port_range = 4000 65000

表示用于向外连接的端口范围

###TCP keepalived 连接保鲜设置 net.ipv4.tcp_keepalive_time = 1200 #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟 net.ipv4.tcp_keepalive_intvl = 15

当探测没有确认时,重新发送探测的频度。缺省是75

net.ipv4.tcp_keepalive_probes = 5

在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应

###其他TCP相关调节 net.core.somaxconn = 262144 #isten(函数)的默认参数,挂起请求的最大数量限制。web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 EOF sysctl -p format

#安装必要的软件包 echo "install pack" yum -y install make gcc gcc-c++ cmake snmp asciidoc libxslt-devel libxslt flex kernel-headers kernel-devel autoconf automake psmisc bzip2 bzip2-devel libxml2 libxml2-devel openssl openssl-devel libcurl libcurl-devel pcre pcre-devel libaio libmcrypt libmcrypt-devel mhash mhash-devel git zip unzip pigz ntpdate telnet nmap-ncat rsync vim-enhanced openssh-clients nfs-utils jemalloc screen mailx haveged xz iotop iotop tcpdump sysstat wget vim lsof bash-completion &> /dev/null format

read -p "系统初始化完毕,是否需要重启(y/n)?" if [ "$TT" == "y" ];then reboot elif [ "$TT" == "n" ];then exit 4 else echo "请输入y/n" fi