CentOS 7 運維優化

CentOS 7 運維優化nginx

2017年12月25日 18:05:27vim

閱讀數:644api

CentOS 7 運維優化

通常的,咱們安裝CentOS mini和其餘相應服務後,就能正常工做了。但工做一段時間後,服務器會出現不穩定、被入侵、甚至在忽然的高併發時直接癱瘓情況。這些問題大多都是因爲咱們考慮其實際的抗壓性和安全性的緣由。因此,在這裏提供一些運維優化的建議。安全

1.關閉不須要的服務

衆所周知,服務越少,系統佔用的資源就會越少, 因此應當關閉不須要的服務。建議把不須要的服務關閉掉,這樣作的好處是減小內存和CPU資源佔用。首先能夠看下系統中 存在着哪些已經啓動了的服務。bash

// 安裝ntsysv
yum install -y ntsysv
// 設置啓動的服務
ntsysv
  • 1
  • 2
  • 3
  • 4

下面列出的是須要啓動的服務,未列出的服務一概關閉。服務器

  • crond : 自動計劃任務。
  • network:Linux系統的網絡服務,很重要,若不開啓此服務的話,服務器就不能聯網。
  • sshd: OpenSSH 服務器守護進程。
  • rsyslog:Linux的日誌系統服務(CentOS5.8下此服務名稱爲syslog),必需要啓動。

2.關閉不須要的TTY

可用vim編輯器打開文件cookie

vim /etc/init/start-ttys.conf
// 內容以下:
start on stopped rc RUNLEVEL=[2345]
env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script
    . /etc/sysconfig/init
    for tty in $(echo $ACTIVE_CONSOLES) ; do
        [ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
        initctl start tty TTY=$tty
    done
end script
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

這段代碼使 init 打開了6個控制檯,可分則用 ALT + F1 到 ALT + F6 控制檯默認都駐留在內存中。用ps aux 命令便可看到,命今以下:網絡

ps aux | grep tty | grpe -v grep
  • 1

命令顯示結果以下所示:併發

root         1211  0.0  0.2 115520  2048 tty1
root         1213  0.0  0.2 115520  2048 tty2
root         1214  0.0  0.2 115520  2048 tty3
root         1217  0.0  0.2 115520  2048 tty4
root         1219  0.0  0.2 115520  2048 tty5
  • 1
  • 2
  • 3
  • 4
  • 5

事實上沒有必要使用這麼多,那如何關閉不需嬰的進程呢? 
一般保留兩個控制檯就能夠了。運維

vim /etc/init/start-ttys.conf
  • 1

3.對TCP/IP網絡參數進行調整

調整TCPⅡP網絡參數,能夠增強對抗 SYN Flood 的能力,命令以下:

echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.conf
sysctl -p
  • 1
  • 2

4.修改SHELL命令的 history 記錄個數

// 用Vim編輯器打開
vim /etc/profile
// 找到HISTSIZE=1000 並改成 100;
HISTSIZE=100
// 當即生效
source /etc/profile
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5.定時校訂服務器的時間

yum install -y ntp
crontab -e
// 加入一行
*/5 * * * * /usr/sbin/ntpdate ntp.api.bz
  • 1
  • 2
  • 3
  • 4

ntp.api.bz是一組NTP服務器集羣,以前是6臺服務器,位於上海電信;如今是3臺服務器,分散於上海和浙江電信,能夠用 dig 命令查看

dig ntp.api.bz
  • 1

6.中止IPV6網絡服務

在 CentOS64 默認的狀態下,IPv6 是被啓用的。

// 可用以下命令查看:
lsmod | grep ipv6
  • 1
  • 2

有些網絡和應用程序還不支持 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網絡,使之不會被觸發啓動
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

另外,ulimit -n 命令並不能真正看到文件的最大文件打開數。可用以下腳本查看:

#!/bin/bash
for pid in `ps aux |grep nginx |grep -v grep|awk '{print $2}'`
do
cat /proc/${pid}/limits |grep 'Max open files'
done
  • 1
  • 2
  • 3
  • 4
  • 5

8.啓動網卡

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

// 查看以太網代號(也可用ifconfig命令)
ip address
// 修改網卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-enp1s0
// 修改以下內容(若是沒有,請自行添加)
# 系統啓動時就啓動網卡設備
ONBOOT=yes
# 容許用從DHCP處獲取的DNS覆蓋本地的DNS
PEERDNS=yes
# 不容許普通用戶修改網卡
USERCTL=no
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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 了。
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

11.增長具備SUdO權限的用戶

添加用戶的步驟和過程比較簡單這裏略過,因爲系統已經禁止了root遠程登陸,因 此須要一個具備sudo權限的admin用戶,權限跟root至關。

vim /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)   ALL
# 而後添加以下內容:
admin   ALL=(ALL)   ALL
# 若是在進行sudo切換時不想輸入密碼,能夠作以下更改:
admin   ALL=(ALL)   NOPASSWD:ALL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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]}'
  • 1
  • 2

命令顯示結果以下所示:

LAST_ACK 14
SYN_RECV 348
ESTABISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

命令中的含義分別以下。

  • 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 = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

如下將簡單說明上面各個參數的含義:

  • 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
  • 1

若是是用於Apache 或 Nginx 等 Web 服務器,則只須要更改如下幾項便可。

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10000 65000

// 執行如下命令使內核配置立馬生效
/sbin/sysctl -p
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

若是是Post6x郵件服務器,則建議內核優化方案以下:

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10000 65000
kernel.shmmax = 134217728

// 執行如下命令使內核配置立馬生效
/sbin/sysctl -p
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

固然這些都只是最基本的更改,你們還能夠根據本身的需求來更改內核的設置,好比咱們的線上機器在高併發的狀況下,常常會出現 ‘‘TCP:too many orpharned sockets 」 的報錯儘可能也要本着服務器穩定的最高原則。若是服務器不穩定的話,一切工做和努力就都會白費。  若是以上優化仍沒法知足工做要求,則又可能須要定製你的服務器內核或升級服務器硬件。

相關文章
相關標籤/搜索