Mini Detective NOTシステム管理者

みなさんこんにちは!



私の名前はイリヤです。 私はプログラマーであり、システム管理者というよりは永遠の企み家です。 しかし、ご存知のように、スタートアップでは、あなたは三つ編み、刈り取り、そして男の男です。 したがって、今日、私はすべての役割を果たす必要がありました。 この記事は、運命/サービスの意志により、サーバーを処理しなければならない私のような初心者の管理者を助けることができます。



私は情熱を持って書いています。熱を込めて、いくつかのチームは記憶から書きました。 私はどんな修正にも喜んでいます。



そのため、今朝午前11時35分、ミンスク時間に、マネージャーの1人がサイトが機能しなくなったと書いています。 具体的には、MySQLエラーをダンプします



なぜなら ホスティング会社はサーバーの初期セットアップに従事していたので、すぐにリクエストを書きました。 しかし、彼はゲートからターンを得ました:







まあ、これは顧客指向ではないかもしれませんが、正しいです。 すべてのクライアントがMySQLを支援できるわけではありません。 有料サービスを使いたくありませんでした。 私たちは自分自身になります。



確かに、あなたがサイトを訪れたとき、不快がありました:



SQLSTATE[HY000]: General error: 1 Can't create/write to file '/tmp/#sql_b80_0.MYI' (Errcode: 28 - No space left on device),
      
      







一見、すべてが非常に単純に見えました-MySQLが配置されている十分なディスク容量がありません。 しかし、その一方で、驚くべきことに-昨日だけそのディスクに40 GBの空き容量がありました。



SSHを介して接続されています。



 bakharevich@server:/# df -h Filesystem Size Used Avail Use% Mounted on rootfs 60G 17G 40G 30% / /dev/xvda1 60G 17G 40G 30% / /dev/xvda3 79G 57G 19G 76% /home/site2.by /dev/xvda5 69G 36G 30G 55% /home/site3.by
      
      





変です。 データベースがインストールされているディスクでは40 GBが実際に無料ですが、MySQLは確実に起動したくありません-スペースがありません。



インターネットで簡単に検索すると、結果が得られました- ディスク領域に加えて、iノードもありますが、これには0しかありません。

 bakharevich@server:/# df -i Filesystem Inodes IUsed IFree IUse% Mounted on rootfs 3932160 3932160 0 100% / /dev/xvda1 3932160 3932160 0 100% / /dev/xvda3 5242880 1122900 4119980 22% /home/site2.by /dev/xvda5 4587520 801087 3786433 18% /home/site3.by
      
      







つまり すべてのファイル、ディレクトリ、さらにはシンボリックリンクもiノードを占有します。 潜在意識のどこかで、私はこれが居るべき場所であることを確かに理解しました。 しかし、管理/ハードウェアに関する経験が不足しているため、すぐに考えることはできませんでした。 まあ、私たちは知っています! :-)当面の間は、できるだけ早くサイトを起動するためにいくつかのiノードを解放する必要があります。



最初に削除することにしたのは、PHPからのセッションです。 はい、承認は人々のために飛びますが、それはそれほど怖くない、なぜなら サイトは機能しません。 セッションはディスクに保存されます。 したがって:



 rm -rf /var/lib/php5/*
      
      







また、 php.iniの別のディスクへの保存を再構成します。



 session.save_path = "/path/to/new/dir/"
      
      







inodがどれだけリリースされたかを調べます。



 bakharevich@server:/home# df -i Filesystem Inodes IUsed IFree IUse% Mounted on rootfs 3932160 32928660 3500 100% / /dev/xvda1 3932160 3932160 0 100% / /dev/xvda3 5242880 1122900 4119980 22% /home/site2.by /dev/xvda5 4587520 801087 3786433 18% /home/site3.by
      
      







3500のみ:-(しかし、これはMySQLを起動するのに十分である可能性があるため、一時的にサイトの作業を復元します。



MySQLを再起動してみてください。



 bakharevich@server:~$ sudo service mysql start [ ok ] Starting MySQL (Percona Server) database server: mysqld . . ..
      
      







素晴らしい、サイトは獲得しました! しかし、iノードの数は減少し続けています。 約10分後、再び0になります。



引き続きファイルを削除します。 直感的に、私は/ var / log / і / var / cache /で始めました:



 du --max-depth=1 /var/log/ | sort -n -r du --max-depth=1 /var/cache/ | sort -n -r
      
      







不要なものを削除しました。 約3,000個のAinodになりましたが、これはまだごくわずかです。 一般に、だれが約150万のiノードを使用するほど多くのファイルを作成できますか?







さらに検索すると、フォルダー/ var / spool / exim4 / inputが見つかりましたExim4は、私が理解しているように、Debianに付属しているメールサーバーです。 ディレクトリ内のファイルの数を数えようとしましたが、結果が長時間表示されませんでした。 したがって、そこにあるファイルは本当に非常に多くあります。



 ls -l /var/spool/exim4/input | wc -l
      
      







インターネットで簡単に検索したところ、このディレクトリでキュー内の文字が検索されました。 私たちのサイトはどれもローカルメールサーバーを使用していないので、これは興味深いです。 すべてがDomainおよびGoogleのYandex.Mailに翻訳されました。 さて、後でこれに戻ります。 今のところ、iノードを解放する必要があります!



ディレクトリ内のファイルを削除したくないだけです。 正しい削除方法を探しており、似たようなものを見つけています。



 exim -bp | exiqgrep -i -f $user | xargs exim -Mrm
      
      







私はそれを始めています。 しばらく待って、iノードが解放されないことを理解しています。 これは、キュー内の文字を最初にリストする最初のexim -bpコマンドが原因である可能性が高いとすぐに思います。 100万を超える文字があるため、出力には長い時間がかかります。



さらに、この時点までに、無料のiノードはすでに終了しています。 サイトが再び停止しました。 マネージャーが書き込みを開始し、サイトの動作不能に関するSMSを1つずつ送信し、電話が鳴ります...状況は激化しています。 わかった! タフに行動する必要があります。 直接削除します:



 rm -rf /var/spook/exim4/input/*
      
      







しかし、そこにありました。 Ainodsはリリースされていません。 ファイルが削除されているかどうかもわかりません。100万を超えるボリュームでは、ファイルをすばやく計算できません。 ほとんどの場合、rm *は最初にディレクトリ全体を読み取ってから削除を開始します。



OK、より厳しいオプションを試してください:



 rm -r /var/spool/exim4/input/
      
      







...そして最後に、アイノダは数千人によって解放されます。 私は小さな戦いで勝ったと感じていますが、敵は約1か月で再編成と別の攻撃のために森に入りました:-)



すでに穏やかで賢明な彼は、 Eximログを調べ始めました。 まず、何もおもしろくありません...突然次のような場合:



 2015-07-31 13:58:41 1ZIwuU-0007a9-Rm ** joan_galloway@site.by R=dnslookup T=remote_smtp: retry time not reached for any host after a long failure period 2015-07-31 13:58:41 1ZIwuU-0007a9-Rm joan_galloway@site.by: error ignored 2015-07-31 13:58:41 1ZIwuU-0007a9-Rm Completed
      
      







おもしろい! すでに書いたように、ローカルメールサーバーは使用しません。 さらに、 site.byは私たちのものではありません。 サーバーに一時的に配置するだけです。 彼がすることは誰にも知られていません。



私はサイトの構造を見ます:







おなじみの何か。 index.phpを見てみましょう。







うん、Joomla! そして2013年から。 おそらく、古いバージョンの脆弱性を利用しました。



このサイトがあまり人気がないことを大いに期待して、Webサーバーのログを開いて疑わしいものを見つけます。 すぐに、メール"joan_galloway"で検索を行いますこれは、Eximログで見つかりました。 しかし、何もありません...私たちはさらに探しています。 写真、スタイルファイルのリクエスト...そして突然:



 50.62.177.108 - - [31/Jul/2015:14:37:41 +0300] "POST /components/com_weblinks/views/categories/system.php HTTP/1.1" 404 2056 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.7.6)"
      
      







とても面白い! 特定のsystem.phpファイル。 POST要求があったため、要求パラメーターはアドレスに表示されません。 名前は非常に疑わしいです。 子供の頃には、自宅のコンピューターにもそのようなディレクトリがありました:-)



ファイル自体を見ます:







なるほど! 敵が見つかりました。 Eximログのファイルと無音セットの名前を再度変更します。 最後に、未来の妻が約10分前に私の近くに置いた食べ物に触れることができます:-)



次は囚人の尋問です。



-どのようにしてサーバーにアクセスしましたか?

-他のサイト/ディレクトリに共犯者はいますか?



また、あなたは私たちの領土について理解する必要があります:



-フォルダーのアクセス許可を確認する

-自動空き容量チェックに加えて、無料のiノードチェックを設定します

-Eximを構成します(たとえば、SMTPをブロックします)。



他の何かがおそらく必要です。 私はあなたの練習からのコメント/訂正/物語に喜んでいるでしょう。



誰かがこの記事をお役に立てば幸いです。



ご清聴ありがとうございました!



All Articles