問題
1.在生產環境下面,如果存在較多的ssh連接,無論是人連接上去的還是代碼建立的連接,都會消耗宿主機上面的資源。會造成宿主機的卡頓,IO增大。
2.頻繁地建立ssh連接,需要不停地輸入密碼。
目的
我們需要把大量的連接數降低到一個合理的範圍內。
解決方案
- 複用連接
這個方案可以第一步解決這種問題,具體的命令:
ssh -o ControlPath=/home/$user/.ssh/$local_path/%L-%h:%p -o ControlMaster=yes -o ControlPersist=yes $user_name@$host_name
上面的命令裏面的local_path 可以隨便創建,只是方便管理而已
ControlMaster 和 ControlPersist 這兩個參數必須加上,如果不加上的話,不會創建unix socket來監聽本地ssh連接。
這個的原理我感覺應該是
這個創建的unix socket 當代理,ControlMaster這個進程擁有這個unix socket,之後所有想要複用這個ssh連接,都會跟unix socket連接,然後unix socket 再把信息發到真正的ssh 連接。
- 設置MaxStartups
這個變量是在
/etc/ssh/sshd_config
文件裏面,用冒號分割了三個數字,含義如下:
第一個數字:可以同時存在的沒有授權的ssh連接數
第二個數字:如果同時存在的沒有授權的ssh連接數超過了第一個數字,那麼後面沒有授權的ssh登錄請求有 (第二個數字/100)%的機率拒絕掉。
第三個數字:如果同時存在的沒有授權的ssh連接數到達了這個數字,那麼後面所有沒有授權的ssh登錄請求都會被拒絕掉。
遇到的問題
- 遇到過unix socket name too long這種錯誤,這個是ControlPath裏面的unix socket 名字太長了,在儘量保證unix socket name 唯一性的前提下,最好儘量縮短unix socket name,限制不太清楚,好像是104-108char
- 如果想複用連接,後面的連接必須要指定ControlPath才能使用原來的連接。
- MaxStartUps這個變量,man裏面說的是沒有授權,現在還不太理解沒有授權是什麼概念。