- 刚刚毕业的学生小明,进入企业已经度过了试用期,这三个月期间工做很积极,爱好学习,动手能力也很强,由于在校期间小明已经有了很不错的运维基础,加上三个月的教导,企业感受他已经可以胜任初级运维的工做了,因而,一些线上环境的构建,业务系统的上线部署,升级都在逐渐交给他来完成。
- 从一个新手到接触线上应用环境,是须要技术和经验积累的,本文要给同窗们分享的就是一个公司的服务器线上部署,基础优化的一些操做实录,固然也包含了小明的一些上线心得和体会,但愿可以帮助同窗们快速了解和掌握线上系统的部署和优化技能。
若是是自建服务器(非云服务器),那么在安装系统前,磁盘是必需要作raid的,raid能够保护系统数据安全,同时也能最大限度的提升磁盘的读,写性能。linux
那么,什么是raid呢?web
RAID每个等级表明一种实现方法和技术,等级之间并没有高低之分。在实际应用中,应当根据用户的数据应用特色,综合考虑可用性,性能和成原本选择合适的RAID等级,以及具体的实现方式。redis
那么线上服务器环境RAID如何选型呢,这里给一个参考给你们:shell
类型 | 读写性能 | 安全性 | 磁盘利用率 | 成本 | 应用方面 |
---|---|---|---|---|---|
RAID0 | 最好(因并行性而提升) | 最差(彻底无安全) | 最高(100%) | 最低 | 对安全性要求不是特别高,大文件写存储的系统 |
RAID1 | 读和单个磁盘无分别,写则要写两遍 | 最高(提供数据的百分之百备份) | 差(50%) | 较高 | 适用于存放重要数据,如服务器和数据库存储等领域 |
RAID5 | 读:RAID5=RAID0(近似的数据读取速度);写:RAID 5 < 单个磁盘(多了一个奇偶校验信息) | RAID5 < RAID1 | RAID5 > RAID1 | 中等 | 是一种存储性能,数据安全和存储成本兼顾的存储解决方案 |
RAID10 | 读:RAID10=RAID0;写:RAID10=RAID1 | RAID10=RAID1 | RAID10=RAID1(50%较高) | 较高 | 集合了RAID0,RAID1的优势,可是空间上因为使用镜像,而不是相似RAID5的"奇偶校验信息",磁盘利用率同样是50% |
所以,根据实际应用须要,咱们在部署线上服务器的时候,最好配置两组raid,一组是系统盘raid,对系统盘(安装操做系统的磁盘)推荐配置为raid1,另外一组是数据盘raid,对数据盘(存放应用程序,各类数据)推荐采用raid1,raid5或者raid10数据库
线上服务器安装操做系统推荐Centos发行版本,具体的版本推荐centos6.9或者centos7.5版本,这也是目前最经常使用的两个版本,要说为何这么推荐,缘由很简单,一些老的产品和系统基本都是运行在Centos6.x版本上,而将来的系统升级趋势确定是centos7.x系列,因此选择这两个版本确定没错。centos
最后,再说说swap,如今内存价格愈来愈便宜了,上百G内存的服务器也很常见了,那么安装操做系统的时候,swap还须要设置吗,答案是须要,缘由有二:安全
那么问题来了,swap设置多少合适呢,一个原则是:物理内存在16GB如下的,swap设置为物理内存的2倍便可,而物理内存大于16GB的话,通常推荐swap设置8GB左右便可。性能优化
- linux系统安装盘中默认自带了不少开源软件包,这些软件包对线上服务器来讲大部分是不须要的,因此,做为服务器只须要安装一个基础内核加一些辅助的软件以及网络工具便可,因此安装软件包的策略是:仅安装须要的,按需安装,不用不装。
- 在Centos6.x下,仅安装开发包,基本网络包,基本应用包便可。在Centos7.x下,选择“server with GUI”,“开发工具”便可。
Linux服务器的远程维护管理都是经过ssh服务完成的,默认使用22端口监听,这些默认的配置已经成为黑客扫描的经常使用方式,因此对ssh服务的配置须要作一些安全加固和优化。bash
ssh服务的配置文件为/etc/ssh/sshd_config,经常使用的优化选项有以下几个:服务器
Port 22221
SSH默认端口配置,修改默认22端口为1万以上端口号,避免被扫描和攻击
UseDNS no
不适用DNS反向解析,可提升ssh链接速度
GSSAPIAuthentication no
关闭GSSAPI验证,可提升ssh链接速度
PermitRootLogin no
禁止root帐号ssh登录
selinux是个鸡肋,在线上服务器上部署应用的时候,推荐关闭selinux,关闭方法以下:
Selinux的状态有以下几个:
enforcing 开启状态
permissive 提醒的状态
disabled 关闭状态
要查看当前selinux的状态,可执行以下命令:
[root@localhost ~]# sestatus
SELinux status: disabled
要关闭selinux,有两种方式,一种是临时关闭,命令以下:
[root@localhost ~]# setenforce 0
另外一种是永久关闭,修改/etc/selinux/config,将
SELINUX=enforcing
修改成:
SELINUX=disabled
在操做系统安装完成后,系统默认的软件版本(gcc,glibc,glib,openssl等)都比较低,可能存在bug或者遗漏,所以,升级软件的版本,很是重要,要快速升级软件版本,可经过yum工具实现,在升级软件以前,给系统添加几个扩展yum源。
epel源:https://fedoraproject.org/wiki/EPEL
repoforge源:http://repoforge.org/use/
安装上面两个yum源的过程以下:
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# rpm -ivh http://repository.it4i.cz/mirrors/repoforge/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo mirrors-rpmforge rpmforge.repo
CentOS-CR.repo CentOS-Media.repo epel.repo mirrors-rpmforge-extras
CentOS-Debuginfo.repo CentOS-Sources.repo epel-testing.repo mirrors-rpmforge-testing
- 线上服务器对时间的要求是很是严格的,为了不服务器时间由于在长时间运行中所致使的时间误差,进行时间同步(synchronize)的工做是很是必要的。Linux系统下,通常使用ntp服务来同步不一样机器的时间。NTP是网络时间协议(Network Time Protocol)的简称,干吗用的呢?就是经过网络协议使计算机之间的时间同步。
- 对服务器进行时间同步的方式有两种,一种是本身搭建NTP服务器,而后跟互联网上的时间服务器作校对,另外一种是经过在服务器上设置定时任务,按期去一个或多个时间服务器进行时间同步。
- 若是你同步的服务器较多(超过100台),建议在本身的网络中搭建一台NTP服务器,而后让你网络中的其它服务器都与这个NTP服务器进行同步,而这个ntp 服务器再去互联网上跟其余NTP server进行同步,经过多级同步,便可完成时间的一致性校验。
- 若是服务器较少的话,能够直接在服务器上设置crontab定时任务便可,例如,能够在本身服务器上设置以下计划任务:
10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >> /var/log/ntp.log 2>&1; /sbin/hwclock -w
- 这个计划任务是每一个小时跟阿里云时间服务器同步一次,同时将同步过程写入到ntp.log文件中,最后将系统时钟同步到硬件时钟。
- 网上可用的时间服务器有不少,推荐使用阿里云的,或者centos自带的例如0.centos.pool.ntp.org均可以使用。
- 系统运维人员有时候可能会遇到经过root用户都不能修改或者删除某个文件的状况,产生这种状况的大部分缘由多是这个文件被锁定了。在Linux下锁定文件的命令是chattr,经过这个命令能够修改ext二、ext三、ext4文件系统下文件属性,可是这个命令必须有超级用户root来执行。和这个命令对应的命令是lsattr,这个命令用来查询文件属性
对一些重要的目录和文件能够加上“i”属性,常见的文件和目录有:
chattr +i /etc/sudoers
chattr +i /etc/shadow
chattr +i /etc/passwd
chattr +i /etc/grub.conf
其中,“+i”选项即immutable,用来设定文件不能被修改,删除,重命名,设定连接等,同时不能写入或新增内容。这个参数对于文件系统的安全设置有很大帮助。
对一些重要的日志文件能够加上"a"属性,常见的有:
chattr +a /var/log/messages
chattr +a /var/log/wtmp
其中,“+i”选项即append,设定该参数后,只能向文件中添加数据,而不能删除。经常使用于服务器日志文件安全,只有root用户才能设置这个属性。
经过命令"ulimit -a"能够看到全部系统资源参数,这里面须要重点设置的是"open files"和"max user processes",其余能够酌情设置。
要永远设置资源参数,主要是经过下面两个文件来实现:
/etc/security/limits.conf
/etc/security/limits.d/90-nproc.conf(centos6.x)
/etc/security/limits.d/20-nproc.conf(centos7.x)
将下面内容添加到/etc/security/limits.conf中,而后退出shell,从新登录便可生效
* soft nproc 20480
* hard nproc 20480
* soft nofile 655360
* hard nofile 655360
* soft memlock unlimited
* hard memlock unlimited
须要注意的时,centos6.x版本中,有个90-nproc.conf文件,centos7.x版本中,有个20-nproc.conf文件,里面默认配置了最大用户进程数,这个设置不必,直接删除这两个文件便可。
Tcp_Wrappers是一个用来分析TCP/IP封包的软件,相似的IP封包软件还有iptables。Linux默认都安装了Tcp_Wrappers。做为一个安全的系统,Linux自己有两层安全防火墙,经过IP过滤机制的iptables实现第一层防御。iptables防火墙经过直观地监视系统的运行情况,阻挡网络中的一些恶意程序,保护整个系统正常运行,免遭攻击和破坏。若是经过了第一层防御,那么下一层防御就是tcp_wrappers了。经过Tcp_Wrappers能够实现对系统中提供的某些服务的开放与关闭、容许和禁止,从而更有效地保证系统安全运行。
要安装Tcp_Wrappers,可执行以下命令:
[root@localhost ~]# yum -y install tcp_wrappers
Tcp_Wrappers防火墙的实现是经过/etc/hosts.allow和/etc/hosts.deny两个文件来完成的,首先看一下设定的格式:
service:hosts [:action]
说明:
service:表明服务名,例如sshd,vsftpd,sendmail等
hosts(s):主机名或者IP地址,能够有不少个,例如192.168.12.0,www.ixdba.net
action:动做,符合条件后所采起的动做
配置文件中经常使用的关键字有:
ALL:全部服务或者全部IP
ALL EXCEPT:全部的服务或者全部IP除去指定的
例如:
ALL:ALL EXCEPT 192.168.12.189
表示除了192.168.12.189这台机器,任何机器执行全部服务时或被容许或被拒绝
了解了设定语法后,下面就能够对服务进行访问限定
在/etc/hosts.allow文件里设定容许经过的规则以下
sshd: 192.168.200.1
sshd: 192.168.200.193
sshd: www.yunjisuan.com
而后,设置不容许登录的机器,也就是配置/etc/hosts.deny文件
sshd:ALL
这两个文件/etc/hosts.allow文件优先级最高,若是不符合这里设定的规则,就会去/etc/hosts.deny文件里找
这样,一个简单的tcp_wrappers防火墙就设置完毕了。
- 在Linux下可经过history命令查看用户全部的历史操做记录,同时shell命令操做记录默认保存在用户目录下的.bash_history文件中,经过这个文件能够查询shell命令的执行历史,有助于运维人员进行系统审计和问题排查,同时,在服务器遭受攻击后,也能够经过这个命令或文件查询黑客登陆服务器所执行的历史命令操做,可是有时候黑客在攻击服务器后为了毁灭痕迹,可能会删除.bash_history文件,这就须要合理的保护或备份.bash_history文件。下面介绍下history日志文件的安全配置方法。
- 为了确保服务器的安全,保留shell命令的执行历史是很是有用的一条技巧。shell虽然有历史功能,可是这个功能并不是针对审计目的而设计,所以很容易被攻击者篡改或是丢失。下面再介绍一种方法,能够实现详细记录登陆过系统的用户、IP地址、shell命令以及详细操做时间等,并将这些信息以文件的形式保存在一个安全的地方,以供系统审计和故障排查。
将下面这段代码添加到/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=4000
DT=`date +%Y%m%d_%H%M%S`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
这段代码将每一个用户的shell命令执行历史以文件的形式保存在/usr/share/.history目录中,每一个用户一个文件夹,而且文件夹下的每一个文件以IP地址加shell命令操做时间的格式命名。下面是root用户执行shell命令的历史记录文件,基本效果以下:
[root@localhost root]# pwd
/usr/share/.history/root
[root@localhost root]# ll
total 24
-rw------- 1 root root 134 Nov 2 17:21 172.16.213.132.history.20181102_172121
-rw------- 1 root root 793 Nov 2 17:44 172.16.213.132.history.20181102_174256
保存历史命令的文件夹目录要尽可能隐蔽,避免被黑客发现后删除
- iptables是linux系统内嵌的一个防火墙软件(封包过滤式防火墙),它集成在系统内核中,所以执行效率很是的高,iptables经过设置一些封包过滤规则,来定义什么数据能够接收,什么数据须要剔除,所以,用户经过iptables能够对进出计算机的数据包进行IP过滤,以达到保护主机的目的。
- iptables是有最基本的多个表格(tables)组成的,并且每一个表格的用途都不同,在每一个表格中,又定义了多个链(chain),经过这些链能够设置相应的规则和策略。
iptables有三种经常使用的表选项,包括管理本机数据进出的filter,管理防火墙内部主机nat和改变不一样包
filter表通常用于的信息包过滤,内置了INPUT,OUTPUT和FORWARD链
INPUT链:主要是对外部数据包进入Linux系统进行信息过滤
OUTPUT链:主要是对内部linux系统说要发送的数据包进行信息过滤
FORWARD链:将外面过来的数据包传递到内部计算机中
- NAT表主要用处是网络地址转换,即Network Address Translation,缩写为NAT,它包含PREROUTING、POSTROUTING和OUTPUT链。
- PREROUTING链:是在数据包刚刚到达防火墙时,根据须要改变它的目的地址。例如DNAT操做,就是经过一个合法的公网IP地址,经过对防火墙的访问,重定向到防火墙内的其它计算机(DMZ区域),也就是说经过防火墙改变了访问的目的地址,以使数据包能重定向到指定的主机
- POSTROUTING链:在包就要离开防火墙以前改变其源地址,例如SNAT操做,屏蔽了本地局域网主机的信息,本地主机经过防火墙链接到internet,这样在internet上看到的本地主机的来源地址都是同一个IP,屏蔽了来源主机地址信息
- OUTPUT链:改变了本地产生包的目的地址
下面是一个常规的线上Linux服务器iptables配置规则:
iptables -P INPUT ACCEPT
iptables -F
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -s 1.1.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.2 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
- 这个配置规则很简单,主要是为了限制进来的请求,因此仅仅配置了INPUT链,刚开始是先打开INPUT链,而后清除全部规则,接着,对全网开启服务器上80、443端口(由于是网站服务器,因此必须对全网开启80和443),而后,针对两个客户端IP开启远程链接22端口的权限,这个主要是用于远程对服务器的维护。接着,对网络接口eth1(内网网卡)、lo(回环地址)开启所有容许进入访问。
- 接着下面是对tcp链接状态的设置,当链接状态知足“RELATED,ESTABLISHED“时,开启链接请求,当有非法链接状态时(经过tcp-flags标记),直接DROP请求。
- 最后,将INPUT链、FORWARD链所有关闭,仅开放OUTPUT链。
在对系统性能优化中,Linux内核参数优化是一个很是重要的手段,内核参数配置得当能够大大提升系统的性能,也能够根据特定场景进行专门的优化,如TIME_WAIT太高,DDOS攻击等等。
Linux内核参数调整有两种方式,分别介绍以下:
这种方式是经过修改/proc下内核参数文件内容,但不能使用编辑器来修改内核参数文件,缘由是因为内核随时可能更改这些文件中的任意一个,另外,这些内核参数文件都是虚拟文件,实际中不存在,所以不能使用编辑器进行编辑,而是使用echo命令,而后从命令行将输出重定向至/proc下所选定的文件中。
例如:将ip_forward参数设置为1,能够这样操做
[root@localhost root]# echo 1 > /proc/sys/net/ipv4/ip_forward
此种方式修改后,当即生效,可是重启系统后,该参数又恢复成默认值。所以,要想永久更改内核参数,须要将设置添加到/etc/sysctl.conf文件中。
要将设置好的内核参数永久生效,须要修改/etc/sysctl.conf文件。首先检查sysctl.conf文件,若是已经包含须要修改的参数,则修改该参数的值,若是没有须要修改的参数,在sysctl.conf文件中添加该参数便可。例如添加以下内容:
net.ipv4.ip_forward=1
保存退出后,能够重启机器使参数生效,若是想使参数立刻生效,也能够执行以下命令:
[root@localhost root]# sysctl -p
线上环境建议采用这种方式,也就是将全部要设置的内核参数加入到/etc/sysctl.conf文件中
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
特别提示:内网情况比tw_reuse稍快,公网大多慢于tw_reuse
net.ipv4.tcp_max_syn_backlog = 20000
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 80000
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 500000
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.nf_conntrack_max = 2097152
这个内核参数优化例子,能够做为一个web系统的优化标准,但并不保证适应任何环境,对每一个配置项的含义,这里不作详细介绍,你们能够参考相关资料。