CentOS 7 營運最佳化

來源:互聯網
上載者:User
CentOS 7 營運最佳化

一般的,我們安裝CentOS mini和其他相應服務後,就能正常工作了。但工作一段時間後,伺服器會出現不穩定、被入侵、甚至在突然的高並發時直接癱瘓狀況。這些問題大多都是由於我們考慮其實際的抗壓性和安全性的原因。所以,在這裡提供一些營運最佳化的建議。 1.關閉不需要的服務

眾所周知,服務越少,系統佔用的資源就會越少, 所以應當關閉不需要的服務。建議把不需要的服務關閉掉,這樣做的好處是減少記憶體和CPU資源佔用。首先可以看下系統中 存在著哪些已經啟動了的服務。

// 安裝ntsysvyum install -y ntsysv// 設定啟動的服務ntsysv

下面列出的是需要啟動的服務,未列出的服務一律關閉。 crond : 自動計劃任務。 network:Linux系統的網路服務,很重要,若不開啟此服務的話,伺服器就不能連網。 sshd: OpenSSH 伺服器守護進程。 rsyslog:Linux的日誌系統服務(CentOS5.8下此服務名稱為syslog),必須要啟動。 2.關閉不需要的TTY

可用vim編輯器開啟檔案

vim /etc/init/start-ttys.conf// 內容如下:start on stopped rc RUNLEVEL=[2345]env ACTIVE_CONSOLES=/dev/tty[1-6]env X_TTY=/dev/tty1taskscript    . /etc/sysconfig/init    for tty in $(echo $ACTIVE_CONSOLES) ; do        [ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue        initctl start tty TTY=$tty    doneend script

這段代碼使 init 開啟了6個控制台,可分則用 ALT + F1 到 ALT + F6 控制台預設都駐留在記憶體中。用ps aux 命令即可看到,命今如下:

ps aux | grep tty | grpe -v grep

命令顯示結果如下所示:

root         1211  0.0  0.2 115520  2048 tty1root         1213  0.0  0.2 115520  2048 tty2root         1214  0.0  0.2 115520  2048 tty3root         1217  0.0  0.2 115520  2048 tty4root         1219  0.0  0.2 115520  2048 tty5

事實上沒有必要使用這麼多,那如何關閉不需嬰的進程呢。
通常保留兩個控制台就可以了。

vim /etc/init/start-ttys.conf
3.對TCP/IP網路參數進行調整

調整TCPⅡP網路參數,可以加強對抗 SYN Flood 的能力,命令如下:

echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.confsysctl -p
4.修改SHELL命令的 history 記錄個數
// 用Vim編輯器開啟vim /etc/profile// 找到HISTSIZE=1000 並改為 100;HISTSIZE=100// 立即生效source /etc/profile
5.定時校正伺服器的時間
yum install -y ntpcrontab -e// 加入一行*/5 * * * * /usr/sbin/ntpdate ntp.api.bz

ntp.api.bz是一組NTP伺服器叢集,之前是6台伺服器,位於上海電信;現在是3台伺服器,分散於上海和浙江電信,可以用 dig 命令查看

dig ntp.api.bz
6.停止IPV6網路服務

在 CentOS64 預設的狀態下,IPv6 是被啟用的。

// 可用如下命令查看:lsmod | grep ipv6

有些網路和應用程式還不支援 IPv6 ,因此,禁用 IPv6 可以說是一個非常好的選擇: 加強系統的安全性,並提高系統的整體效能。不過,首先要確認一下:IPv6是不是處於動的狀態,命令如下:

// 列出全部網路介面資訊ifconfig -a// 修改相應的設定檔,停止 IPv6 ,命令如下:echo "install ipv6 /bin/true" > /etc/modprobe.d/disable-ipv6.conf# 每當系統需要載入IPv6時,強制執行 /bin/true 來替代實際載入的模組echo "IPV6INIT=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0# 禁用基於IPv6網路,使之不會被觸發啟動
7.調整 Linux 的最大檔案開啟數

要調整一下 Linux 的最大檔案開啟數,否則運行 Squid 詛服務的機器在高負載時執行效能將會很差;另外,在 Linux 下部署應用時,有時候會遇上 “Too many open files” 這樣的問題,這個值也會影響伺服器的最大並發數。其實 Linux 是有檔案控制代碼限制的。但預設值下是很高,一般是1024,生產伺服器很容易就會達到這個值,所以需要改動此值。

// 開啟配置  vim /etc/security/limit.conf// 在最後一行添加如下* soft nofile 65535* hard nofile 65535// 再開啟配置vim /etc/rc.local// 添加如下內容ulimit -SHn 65535 

另外,ulimit -n 命令並不能真正看到檔案的最大檔案開啟數。可用如下指令碼查看:

#!/bin/bashfor pid in `ps aux |grep nginx |grep -v grep|awk '{print $2}'`docat /proc/${pid}/limits |grep 'Max open files'done
8.啟動網卡

在配置 CentOS 7 網卡 IP 位址時,容易忽略的一項是Linux在啟動時未 啟動網卡,其後果很明顯,那就是該 Linux 機器永遠也沒有 IP 位址。

// 查看乙太網路代號(也可用ifconfig命令)ip address// 修改網卡設定檔vim /etc/sysconfig/network-scripts/ifcfg-enp1s0// 修改如下內容(如果沒有,請自行添加)# 系統啟動時就啟動網卡裝置ONBOOT=yes# 允許用從DHCP處擷取的DNS覆蓋本地的DNSPEERDNS=yes# 不允許普通使用者修改網卡USERCTL=no
9.關閉寫磁碟I/O功能

Linux檔案預設有3個時間,分別如下所示。 atime:對此檔案的訪問時間。 ctime:此檔案inOde發生變化的時間。 mtime:此檔案的修改時間。

如果有多個小檔案(比如 Web 服務器的頁面上有多個小圖片),通常是沒有必要記錄檔案的訪問時間的,這樣就可以減少寫磁碟的 I/O ,可這要如何配置呢。

// 修改檔案系統的設定檔vim /etc/fstab// 然後,在包含大量小檔案的分區中使用 noatime 和 nodiratime 這兩個命令。例如:  /dev/sda5 /data/pics ext3 noatime,nodiratime 0 0 這樣檔案被訪問時就不會再產生寫磁碟的 I/O 了。 
10.修改SSH登入配置

SSH服務配置最佳化,請保持機器中至少包含一個具有sudo許可權的使用者,下面的配置禁止root遠程登入,代碼內容如下所示:

# 禁止root遠程登入sed -i 's@#PermitRootLogin yes@PermitRootLogin no@' /etc/ssh/sshd_config# 禁止空密碼登入sed -i 's@PermitEmptyPasswords no@PermitEmptyPasswords no@' /etc/ssh/sshd_config# 關閉SSH反向查詢,以加快SSH的訪問速度sed -i 's@UseDNS yes@UseDNS no@' /etc/ssh/sshd_config /etc/ssh/sshd_config
11.增加具有SUdO許可權的使用者

添加使用者的步驟和過程比較簡單這裡略過,由於系統已經禁止了root遠程登入,因 此需要一個具有sudo許可權的admin使用者,許可權跟root相當。

vim /etc/sudoers## Allow root to run any commands anywhereroot    ALL=(ALL)   ALL# 然後添加如下內容:admin   ALL=(ALL)   ALL# 如果在進行sudo切換時不想輸入密碼,可以做如下更改:admin   ALL=(ALL)   NOPASSWD:ALL
12.最佳化Linux下的核心TCP參數以提高系統效能

核心的最佳化跟伺服器的最佳化一樣,應本著穩定安全的原則。下面以Squid伺服器為例來說明,待用戶端與伺服器端建立 TCP/IP 串連後就會關閉Socket,伺服器端串連的連接埠狀態也就變為 TIME_WAIT 了。那是不是所有執行主動關閉的SOCket都會進入TIME_WAIT 狀態呢。有沒有什麼情況可使主動關閉的Socket直接進入CLOSED狀態呢。答案是主動關 閉的一方在發送最後一個ACK後就會進人 TIME_WAIT 狀態,並停留2MSL(報文最大生存)時間,這是 TCP/IP 必不可少的,也就是說這一點是“解決”不了的。

TCP/IP 護設計者如此設計,主要原因有兩個: 防止上一次串連中的包迷路後重新出現,影響新的串連經過 2MSL 時間後,上一次串連中所有重複的包都會消失。 為了可靠地關閉TCP串連。主動關閉方發送的最後一個ACKFN有可能會丟失,如果丟失,被動方會重新發送Fm,這時如果主動方處於CLOSED狀態,就會q 應RST而不是ACK。所以主動方要處於TIM巳唚IT狀態,而不能是CLOSED」態。另外,TIME_WAIT 並不會佔用很大的資源,除非受到攻擊。

// 在Squid伺服器中可輸入如下命令查看當前串連統計數: netstat -n | awk '/^tcp/ {++S[$NF]} END{for(a in S)} print a, S[a]}'  

命令顯示結果如下所示:

LAST_ACK 14SYN_RECV 348ESTABISHED 70FIN_WAIT1 229FIN_WAIT2 30CLOSING 33TIME_WAIT 18122

命令中的含義分別如下。 CLOSED:無恬動的或進行中的串連。 LISTEN:伺服器正在等待進入呼叫。 SYN_RECV:一個串連請求已經到達,等待確認。 SYN_SENT:應用已經開始,開啟一個串連。 ESTABLISHED;正常資料轉送狀態。 FIN_WAT1:應用說它已經完成。 FIN_WAT2:另一邊己同意釋放。 ITMED_WAIT:等待所有分組死掉。 CLOSING;兩邊嘗試同時關閉。 TIME_WAIT:另一邊已初始化一個釋放。 LAST_ACK:等待所有分組死掉。
也就是說,這條命令可以把當前系統的網路連接狀態分類匯總。
在 Linux 下高並發的 Squid 伺服器中,TCP TIME_WAIT 通訊端的數量經常可達到兩三萬,伺服器很容易就會被拖死。不過,可以通過修改Linux 核心參數來減少 Squid 伺服器的 TIME_WAIT 通訊端數量,命令如下:

vim /etc/sysctl.conf// 然後,增加以下參數net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 1200net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.ip_local_port_range = 10000 65000net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_max_tw_buckets = 5000

以下將簡單說明上面各個參數的含義: net.ipv4.tcp_syncookies = 1表示開啟SYN Cookies。當出現SYN等待隊列溢出時 啟用 Cookie 旋來處理,可防範少量的SYN 攻擊。該參數預設為0,表示關閉。 net.ipv4.tcp_tw_reuse = 1表示開啟重用,即允許將TIME-WAIT 通訊端重新用於的TCP串連。該參數預設為 0,表示關閉。 net.ipv4.tcp_tw_recycle = 1 表示開啟TCP串連中TIME-WAIT 通訊端的快速回收,該參數預設為0,表示關閉。 net.ipv4.tcp_fin_timeout = 30 表示如果通訊端由本端要求關閉,那麼這個參數將決定保持在FlN-WAIT-2 狀態的時間。 net.ipv4.tcp_keepalive_time = 1200 表示當 Keepalived 啟用時,TCP發送Keepalived 訊息的頻度改為20分鐘,預設值是2小時。 net.ipv4.ip_local_port_range = 10000 65000 表示CentOS 系統向外串連的連接埠範圍。其預設值很小,這裡改為10000到65000。建議不要將這裡的最低值設得太低,否則可能會佔用正常的連接埠。 net.ipv4.tcp_max_syn_backlog = 8192 表示SYN隊列的長度,預設值為1024,此處加大隊列長度為8192,可以容納更多等待串連的網路連接數。 net.ipv4.tcp_max_tw_buckets = 5000 表示系統同時保持TIME_WAIT 通訊端的最大數量,如果超過這個數字,TlME_WAIT 通訊端將立刻被清除並列印警告資訊,預設值為180000,此處改為5000。對於Apache、Nginx等伺服器,前面介紹的幾個參數已經可以很好地減少TIME_WAIT通訊端的數量,但是對於Squid來說,效果卻不大,有了此參數就可以控制TME_WAIT 通訊端的最大數量,避免Squid 記伺服器被大量的TIME_WAIT 通訊端拖死。

執行以下命令使核心配置立馬生效:

/sbin/sysctl -p

如果是用於Apache 或 Nginx 等 Web 服務器,則只需要更改以下幾項即可。

net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.ip_local_port_range = 10000 65000// 執行以下命令使核心配置立馬生效/sbin/sysctl -p

如果是Post6x郵件伺服器,則建議核心最佳化方案如下:

net.ipv4.tcp_fin_timeout = 30net.ipv4.tcp_keepalive_time = 300net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.ip_local_port_range = 10000 65000kernel.shmmax = 134217728// 執行以下命令使核心配置立馬生效/sbin/sysctl -p

當然這些都只是最基本的更改,大家還可以根據自己的需求來更改核心的設定,比如我們的線上機器在高並發的情況下,經常會出現 ‘‘TCP:too many orpharned sockets ” 的報錯盡量也要本著伺服器穩定的最高原則。如果伺服器不穩定的話,一切工作和努力就都會白費。
如果以上最佳化仍無法滿足工作要求,則又可能需要定製你的伺服器核心或升級伺服器硬體。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.