- 剛剛畢業的學生小明,進入企業已經度過了試用期,這三個月期間工做很積極,愛好學習,動手能力也很強,由於在校期間小明已經有了很不錯的運維基礎,加上三個月的教導,企業感受他已經可以勝任初級運維的工做了,因而,一些線上環境的構建,業務系統的上線部署,升級都在逐漸交給他來完成。
- 從一個新手到接觸線上應用環境,是須要技術和經驗積累的,本文要給同窗們分享的就是一個公司的服務器線上部署,基礎優化的一些操做實錄,固然也包含了小明的一些上線心得和體會,但願可以幫助同窗們快速瞭解和掌握線上系統的部署和優化技能。
若是是自建服務器(非雲服務器),那麼在安裝系統前,磁盤是必需要作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系統的優化標準,但並不保證適應任何環境,對每一個配置項的含義,這裏不作詳細介紹,你們能夠參考相關資料。