Techioz Blog

長すぎるメッセージとファイル記述子に関連する SSH エラーが原因で Capistrano のデプロイが失敗する

概要

所有している 5 台のサーバーにプロジェクトをデプロイするときに問題が発生します…SSHD サーバーのバージョンは OpenSSH_7.4p1、OpenSSL 1.0.2k-fips (2017 年 1 月 26 日)、CentOS サーバーであるため、SSHD サービスをアップグレードしてコンパイルしますソースからはオプションではありません

重要な SSHD サービス構成:

TCPKeepAlive yes
UseDns no
Protocol 2

Capistrano を使用してデプロイする場合、/usr/sbin/restorecon -R /u/apps/my_app/releases/20230724100000 を実行する、restorecon ステップに入るまで、いくつかのステップが通過します。

そして、さまざまなエラーが発生します。

mm_receive_fd: recvmsg: Message too long
mux_master_process_stdio_fwd: failed to receive fd 0 from client
mux_client_request_stdio_fwd: read from master failed: Broken pipe
channel_post_mux_listener: accept: Too many open files
muxclient: master hello exchange failed
mm_receive_fd: recvmsg: Message too long
mux_master_process_stdio_fwd: failed to receive fd 0 from client
mux_client_request_stdio_fwd: read from master failed: Broken pipe
Caused by:
Net::SSH::Proxy::ConnectError: command failed: ssh [email protected] -o ConnectTimeout=60 -o ControlMaster=auto -o ControlPath=/tmp/[email protected] -W server01.mydomain.com:\22

ControlMasterを削除しようとしましたが、うまくいきませんでした。また、ControlMaster を none に設定しましたが、Capistrano のすべてのステップで資格情報が要求され、コマンドが多すぎて永遠に時間がかかる可能性があります。

OpenSSH サービスを再起動しようとしました。

sudo systemctl restart sshd.service

しかし、同じエラーが発生しました

解決策

すべてのサーバー上のすべてをチェックし、ユーザーごとに異なる制限、カーネル構成のファイル記述子の制限などを確認した結果、問題は実際にはデスクトップにあることがわかりました。

ulimit -n を使用してデスクトップ上の制限を確認すると、Ventura OS の制限が 256 で、許可されるファイル記述子の数としては非常に低い値であることがわかりました。

このリンクの手順に従うことで、システム上のファイル記述子の数を更新し、問題なく展開することができました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
        <string>launchctl</string>
        <string>limit</string>
        <string>maxfiles</string>
        <string>64000</string>
        <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
    </dict>
</plist>