運維工作會經常面臨着服務器上架的情況,服務器第一步當然是最小化安裝,第二步就是要優化了,不優化的操作系統是不能交付使用的,那就是給自己運維工作添堵啊。我現在的運維工作基本都是腳本自動化執行,這裏我就把我腳本里面的東西在這裏寫成博客與大家分享一下。
原創博文來自:www.51niux.com 博主:忙碌的柴少
這些優化基本與其他一些博客裏面的優化大致相同,這都是大家的經驗總結嘛,撐死是表述有些差別,但是內部的意思是差不多的。
好了,我這裏以Centos 6.4 64位的操作系統舉例,Centos 5.8的優化跟這個差不多,細節上有區別,在博客中會有意的點一下。
1.優化第一步:精簡開機自啓動服務
先扯兩句,爲什麼要精簡開機自啓動服務呢,服務起的越多系統就越危險,也不方便維護管理當你服務器運行一段時間安裝的東西你就分不清哪些進程是有用的那些事沒用的了,到時候想關進程都不敢關了。還有當你係統被***時候你就知道了,當你係統被***的時候你想看又什麼異常進程,到時候運行的程序太多了,亂的很排查起來很費勁,所以一定要精簡開機啓動。
LANG=en #我們默認安裝系統是支持中文的所以是中文字符集,得先這樣搞一下不然下面的命令不起作用
for sun in `chkconfig --list|grep 3:on|awk '{print $1}'`; do chkconfig --level 35 $sun off;done
#我們先將所有的服務器都變爲開機不啓動
for system in crond sshd network rsyslog ;do chkconfig --level 35 $system on;done #然後我們將我們制定要啓動的服務添加爲開機啓動,注意Centos 5.8要將rsyslog改爲syslog
2. 優化第二步:關閉selinux
先扯兩句,selinux是個很雞肋的東西,這個東西是人家外國研究出來保護系統安全的,但是在咱們國內,這個服務對於咱們來說吧很噁心,因爲我們在安裝東西的時候經常會莫名的出錯,配置啥的都沒問題,後來selinux一關就OK了。所以,不就有這句口頭禪嘛,你問別人我這個服務咋不成呢,經常會得到兩個反問,是不是防火牆設置有問題,selinux關了沒。
sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config #一般我們第一次優化完之後是要重啓的,所以執行到這裏就可以了,但是有很多哥們是服務器運行之後才關selinux,所以就需要下面的命令了。
[root@client ~]# getenforce #我們先用這個命令查看自己的selinux是否爲啓動狀態
Enforcing #這表示是啓動的
[root@client ~]# setenforce 0 #這個命令,就是將selinux的級別變成了Permissive
[root@client ~]# getenforce #我們查看級別變了,其實這只是忽略,現在基本就沒啥影響了。
Permissive #這個就是處於開啓和關閉中間的那個級別
ps:所以我們還是要更改配置文件,等着有機會重啓服務器,就徹底關了selinux了
[root@client ~]# cat /etc/selinux/config#下面是截取的部分內容,注意是三個級別
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
3. 優化第三步:更改yum源
如果是集羣環境我建議還是自建yum源服務器吧,我前面的博客也有寫,就在yum源裏面放一些自己需要的軟件就行,我們公司就是自建yum源服務器爲百臺服務器服務。而且我們大部分服務器是內網服務器並不能出網的,所以自建本地yum源服務器是很有必要的。我前面已經有博客寫到了如何自建本地yum源和其他服務器如何設置這裏就不多說了。
下面是面對很多服務器可能比較少,就採用國內yum源服務器就行。
我們偶然要yum安裝東西,這個Centos默認是國外的yum源,這樣下載多少會有影響,這個還不是很明顯,如果用過git的就知道不換成淘寶的鏡像站,很多東西下載如蝸牛,鄙人維護過一年的git是深有體會啊。國內比較知名的的yum源站點是sohu和163,我這裏就用163的yum源舉例吧,不過搭建過公網yum源服務器的就知道了,就是把人家國外的鏡像站rsync一份供國內使用。
cd /etc/yum.repos.d/
/bin/mv CentOS-Base.repo CentOS-Base.repo.bak20150418
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
yum clean all #清空yum緩存
yum makecache #建立yum緩存
至此,yum源更換操作完畢,自己yum一個軟件測試一下是否成功了。
4. 優化第三步:安裝幾個必要的好用的軟件
yum install lrzsz ntpdate sysstat tree -y
#lrzsz 是一個很好用的上傳下載軟件,但是CRT用這個傳輸大文件有問題,Xshell傳輸大文件沒問題
#ntpdate 是時間同步的軟件,一般系統都會裝,安裝一下以防萬一,以後都是腳本話,儘量不單機操作
#tree 是一個很好的看目錄結構的軟件,最小化安裝系統一般不帶這個工具的
#sysstat是用來檢測系統性能及效率的工具,主要是用iostat看CPU啊看磁盤IO啊
5. 優化第五步:添加定時任務服務器進行時間同步
我們一般都會自建ntp時間服務器,因爲集羣裏面有大量的不能上外網的服務器需要進行時間同步,博客也有文章來講,這裏就以同步公網的時間服務器舉例。
echo
'*/30 * * * * /usr/sbin/ntpdate time.nist.gov ;hwclock–w >/dev/null 2>&1'
>>/
var
/spool/cron/root #
hwclock–w
同步時間並寫入blos硬件時間
#Centos 5系列的命令全路徑是/sbin/ntpdate
6. 優化第六步:優化ssh登錄策略
我們一般在操作前,要多打開一個窗口以防止操作出問題,出問題還能在備窗口上進行修改。
vi /etc/ssh/sshd_config #修改一些配置
Port 52114 #更改ssh登錄端口從22改爲52114
PermitRootLogin no #由yes變成no禁止root遠程登錄
PubkeyAuthentication yes #前面的註釋去掉開啓key登錄
AuthorizedKeysFile .ssh/authorized_keys #指定公鑰位置
PermitEmptyPasswords no #註釋去掉禁止空密碼登錄
PasswordAuthentication no #禁止密碼登錄,必然很可能要遭到密碼暴力破解
#GSSAPIAuthentication yes #這兩行一開始不是註釋的,註釋掉不GSS驗證
#GSSAPICleanupCredentials yes
到這裏,配置文件修改結束
/etc/init.d/sshd restart #重啓sshd服務
7.優化第七步:優化用戶與登錄策略(近接第六步操作)
useradd wroot #添加代替root登錄和操作的普通用戶
vi /etc/sudoers #更改此普通用戶的權利(visudo命令也可以)
wroot ALL=(ALL) NOPASSWD:ALL #給wroot用戶root所擁有的一切權利
至此用戶授權完畢
su - wroot #切換到wroot用戶
ssh-keygen -t rsa #生成私鑰公鑰對
[wroot@client ~]$ cd .ssh/
[wroot@client .ssh]$ cat id_rsa.pub >>authorized_keys #生成公鑰
[wroot@client .ssh]$ chmod 644 authorized_keys
[wroot@client .ssh]$ sz id_rsa #將私鑰下載下來
下面是一些測試結果,我們再登錄192.168.1.201這臺機器試一下
我們下來把祕鑰key上傳到另一臺服務器
我在工作中,一般會設置一個普通用戶只用來登錄,然後再用密碼切換到對應的用戶。
8.優化第八步:開啓防火牆
我在工作中,在調試防火牆的時候會先加定時任務一段時間會關閉防火牆防止自己調試出錯,然後防火牆一般是隻開啓必須的端口,其餘端口都是禁止掉的。像ssh這種登錄呢,只允許我的跳板機內網過來,其他服務器是不允許ssh過來的,跳板機一般只允許辦公網IP登錄。比如現在192.168.1.202就是我的跳板機,我們一般都會跳板機主備的,所以應該是允許兩個IP能ssh登錄。
iptables -F #清空防火牆規則
iptables -A INPUT -p tcp --dport 52114 -s 192.168.1.202 -j ACCEPT #只允許某個IP能訪問52114端口
iptables -A INPUT -p tcp --dport 52114 -j DROP #其餘連接52114端口的全部不予響應
/etc/init.d/iptables save #保存防火牆規則
/etc/init.d/iptables restart #重啓防火牆
這就是效果,被允許連接的ip可以ssh登錄,其餘全部不響應請求,這樣登錄策略進一步安全。
9. 優化第九步:禁止Ctrl+Alt+Delete重啓命令
普通用戶是不能執行reboot或者halt等命令的,但是它如果是圖形界面登錄的話,可以執行Ctrl+Alt+Delete重啓服務器,這就比較噁心了,要禁止掉,防患於未然。
vi /etc/init/control-alt-delete.conf
#exec /sbin/shutdown -r now "Control-Alt-Delete pressed" #像這樣註釋掉就可以了
10. 優化第十步:歷史命令記錄數量調小
歷史記錄history,是把雙刃劍,一方面可以幫我們記錄我們曾經做了哪些操作,另一方面也可以讓別人知道你做了哪些操作,坑啊。我感覺至少我們的跳板機要將歷史命令記錄值調的儘量小,因爲我們登錄集羣服務器的其他機器都是通過跳板機內網跳轉的,雖然人家可以通過網絡命令來查內網中的其他服務器的ip地址,但是歷史記錄這塊可以pass掉了。
sed -i "s/HISTSIZE=1000/HISTSIZE=10/" /etc/profile #將歷史記錄值由1000變爲10
source /etc/profile #使生效
[root@client ~]# history |wc -l #看下效果
10
11. 優化第十一步:修改系統默認字符集
我安裝系統的時候默認就是UTF-8字符集,但是以防萬一也是要優化一下的。
vi /etc/sysconfig/i18n
LANG="zh_CN.UTF-8" #這裏改成你想要的字符集,如果想搞成gbk就這樣LANG="zh_CN.GB18030"
source /etc/sysconfig/i18n #使生效
12. 優化第十二步:調整文件描述符大小
爲什麼調整文件描述符大小呢。默認是1024,維護過nginx服務器或者squid服務器的運維朋友都瞭解,這裏必須得調大,不然打開文件的數量太少了,要狂報錯的。這裏呢因爲是統一優化也不知道此服務器將要用於什麼用途,可以先調成10240或者35655之類的,不要一下子就調到最大65535。
echo '* - nofile 10240' >>/etc/security/limits.conf #添加到文件裏面去
ulimit -HSn 10240 #用命令暫時是文件描述符從1024變成10240
由於已經將修改添加到配置文件裏面去了,再退出窗口重新登錄就能看到變化了,如果沒有第一步添加文件的操作,退出窗口重新登錄後,文件描述符又會變成1024.
13. 優化第十三步:內核參數優化
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 = 4096 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
net.ipv4.ip_conntrack_max = 25000000
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
sysctl –p #使配置文件生效
#net.ipv4.tcp_fin_timeout = 2 表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2的狀態時間,單位是秒,這個就是四次斷開的最後一下,減少等待時間。
#net.ipv4.tcp_tw_reuse = 1 表示開啓重用。允許TIME-WAIT套接字重新用於新的TCP鏈接。默認是0表示關閉。
#net.ipv4.tcp_tw_recycle = 1 表示開啓TCP連接中的TIME-WAIT套接字的快速回收,默認是0表示關閉
#net.ipv4.tcp_syncookies = 1 表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookie來處理,可防範少量的SYN***。默認爲0,表示關閉。
#net.ipv4.tcp_keepalive_time =600 表示當keepalive啓用時,TCP發送keepalive消息的頻率,默認是2小時,這裏改爲10分鐘
#net.ipv4.ip_local_port_range = 4096 65000 #表示向外連接的端口範圍,默認很少,32768~65535
#net.ipv4.tcp_max_syn_backlog = 16384 表示SYN隊列的長度,默認爲1024,加大隊列長度爲16384,可以容納更多等待連接的網絡連接數。
#net.ipv4.tcp_max_tw_buckets = 36000 示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數 字,TIME_WAIT套接字將立刻被清除並打印警告信息。默認爲180000,改爲36000。對於Apache、Nginx等服務器,前面介紹的幾個參 數已經可以很好地減少TIME_WAIT套接字數量,但是對於Squid來說,效果卻不大。有了此參數就可以控制TIME_WAIT套接字的最大數量,避 免Squid服務器被大量的TIME_WAIT套接字拖死。
#net.ipv4.route.gc_timeout = 100 路由緩存刷新頻率,當一個路由失敗後多長時間跳到另一個默認是300秒
#net.ipv4.tcp_syn_retries = 1 對於一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄。不應該大於255,默認值是5,對應於180秒左右。
#net.ipv4.tcp_synack_retries = 1 對於遠端的連接請求SYN,內核會發送SYN + ACK數據報,以確認收到上一個 SYN連接請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這裏決定內核在放棄連接之前所送出的 SYN+ACK 數目。不應該大於255,默認值是5,對應於180秒左右時間。
#net.core.somaxconn = 16384 用來限制監聽(LISTEN)隊列最大數據包的數量,超過這個數量就會導致鏈接超時或者觸發重傳機制。web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認爲511,所以有必要調整這個值。對繁忙的服務器,增加該值有助於網絡性能。默認是128.
#net.core.netdev_max_backlog = 16384 每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目,對重負載服務器而言,該值需要調高一點。默認是1024
#net.ipv4.tcp_max_orphans = 16384 系統所能處理不屬於任何進程的TCP sockets最大數量。假如超過這個數量﹐那麼不屬於任何進程的連接會被立即reset,並同時顯示警告信息。之所以要設定這個限制﹐純粹爲了抵禦那些簡單的 DoS ***﹐千萬不要依賴這個或是人爲的降低這個限制。如果內存大更應該增加這個值。默認值是8192.
#一下參數是對iptables防火牆的優化,防火牆不開會有提示,可以忽略不理。
#net.ipv4.ip_conntrack_max = 25000000 系統支持的最大ipv4連接數,默認65536,同時這個值和你的內存大小有關,如果內存128M,這個值最大8192,1G以上內存這個值都是默認65536
#net.nf_conntrack_max = 25000000
#net.netfilter.nf_conntrack_max = 25000000
#net.netfilter.nf_conntrack_tcp_timeout_established = 180 已建立的tcp連接的超時時間,默認432000,也就是5天,這個值過大將導致一些可能已經不用的連接常駐於內存中,佔用大量鏈接資源,從而可能導致NAT ip_conntrack: table full的問題,這裏調小了
#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
14. 第十四步優化:修改ip地址,dns,主機名
IP地址我們按要求設置成固定的IP地址
dns我們是內建的dns服務器,因爲服務器之間比如說跟mysql通信啊什麼的,很多是以域名的形式通信,這樣我們就要在/etc/hosts裏面制定,如果內建dns呢,只要把服務器的dns改爲我們的dns服務器,以後直接內部訪問域名就可以了。
vi /etc/resolv.conf #這個文件修改dns服務器
nameserver 192.168.1.116 #比方說這個內網地址就是我們的dns服務器
當然,你服務器不是集羣,就是想單純的上網的話,就可以
nameserver 202.106.0.20 #就可以設置成你與你網絡服務商對應的公網dns服務器就可以了
如果要永久有效:vi /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1=202.106.0.20 #添加這麼一條
[root@client ~]# /etc/init.d/network restart #重啓網卡使生效
主機名這個是很關鍵的,我們要設置成與我們服務相關的主機名,這樣不僅登錄上來後一眼通過主機名就能瞭解大概此服務器是負責什麼的,另外在我們批量管理,比如說用puppet批量管理的時候,就可以通過主機名進行分類,進行細緻化的管理。
vi /etc/sysconfig/network #這裏設置主機名稱
HOSTNAME=img.aivideo.com #比方說我們這是圖片服務器,就設置以img開頭的主機名稱
[root@client ~]# hostname img.aivideo.com
15. 第十五步優化:對關鍵文件進行加固
下面這步我一般都是環境搭建完畢,如web服務什麼的已經在運行基本不會再設計到添加用戶什麼操作之類的時候,再做。
chattr +i /etc/passwd
chattr +i /etc/inittab
chattr +i /etc/group
chattr +i /etc/shadow
chattr +i /etc/gshadow