リロード | 新規新規 編集編集 差分差分 添付添付 バックアップバックアップ | 一覧 検索 最終更新 凍結 複製 改名 | ヘルプ | 最終更新のRSS |

 
鯖 
http://wiki.nothing.sh/264.html

█ 鯖

Last-modified: 2014-12-25 (木) 00:29:41 / Short URL: http://wiki.nothing.sh/264.html / add to hatena bookmark 0 users / add to livedoor clip - users

nothing 鯖の設定とか云々書き連ねます。最近負荷がが hidoi 状況なのです。うひー。

最近突然サーバーが止まりますが、予告なしでメンテしてます。すんません。

環境

設置場所が鹿児島って時点で負け組気分です。ヤッタネ。

回線

NTT西日本 Bフレッツ ベーシック (speedtest.flets で 51Mbps しか出ません)

ぷらら + ダブルルート (IIJ) 固定IP (219.119.223.38)

CyberBB 固定IP (43.244.234.52) -- 3/18〜

サーバスペック

CPUPentium 4 (Northwood/FSB533) 2.8GHz
RAMPC2700 1GB
HDDST380011A * 2

状況

  • PHP + PostgreSQL なページに数十万リクエスト/day
  • PHP + MySQL なページに数万リクエスト/day
  • 数〜数十MBのデータファイル配信 (mp3 や BMS)
  • その他普通のレンタルサーバとかでやりそうなこと( Perl CGI とかとか )
  • 7ドメイン + 数十サブドメイン

あー。あとDNSとメールと ...

  • Load Average が 1 切りません 昼間は切るようになりました
  • 多分メモリ 1GB じゃ足りない気がします。

現在の設定

設定とかちょっと主なところだけ。

今は vmstat やら top やら見つつちまちま調整してます。

sysctl.conf

kernel.sysrq=0
kernel.shmmax=133554432
kernel.core_uses_pid=1
net.core.rmem_max=1048576
net.core.wmem_max=1048576
net.core.rmem_default=65535
net.core.wmem_default=65535
net.ipv4.ip_forward=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_rmem=4096 87380 1048576
net.ipv4.tcp_wmem=4096 16384 1048576
net.ipv4.tcp_mem=1048576 1048576 1048576

httpd.conf

# 普通のコンテンツではやっぱ KeepAlive 必要だわ
KeepAlive on
MaxKeepAliveRequests 32
KeepAliveTimeout 3
# 最初から臨戦態勢
MinSpareServers 160
MaxSpareServers 160
StartServers 160
MaxClients 160

ちなみに KeepAlive は feena では切ってます。(画像少ないし、残しておくと接続数不足で死ぬんで) あとは mod_gzip やら mod_limitipconn (主に mp3 とか BMS 配信向け)やら入れたり。

MaxClients はこれ以上増やすとスワップで死にます。 (feena アクセスで、 Apache プロセスと同時に PostgreSQL プロセスも増えることを考えれば当然)

php.ini

PHP Accelerator インストールして設定済み

#接続数不足で死ぬので、強制 Off
mysql.allow_persistent = Off
pgsql.allow_persistent = Off
pgsql.max_links = 64

この程度かなぁ

バックアップ

  • pdumpfs により毎朝 4 時にバックアップを採っています。
  • 間違ってファイルを削除してしまったり上書きしても当日の朝 4 時の時点までのバックアップがあるので、必要であれば言ってもらえれば適当に回復します。
  • また、過去 7 日分, 過去 6 週間分(日曜日のみ), 過去 6 ヶ月分( 1 日のみ), 過去 2 年分(1 月 1 日のみ)のバックアップを残しています。

作業とかとか

この辺は思い出しつつ。

  • マシンスペックの改善

    Celeron 2GHz から Pen4 2.8GHz へ。ヘボいメモリも交換。 45k 円の出費 _| ̄|○
  • Squid

    Squid をインストール。 HTTP アクセラレータモードに設定して、Apache の mod_rewrite でローカル以外の接続を squid ポートへ転送するように設定。

    とりあえずこれで Squid が転送バッファとして働くので、エンドユーザの回線が細くても Apache のプロセスを握り続けることは防げる。資源節約。
  • PHP Accelerator

    http://www.php-accelerator.co.uk からダウンロード、 INSTALL ファイルに書かれてる通りにインストールするのみ。結果 速くなる模様。
  • Apache2 +PHP インストール

    VineSeed から Apache2 の RPM 持ってきてインストール。結局 PHP インストールするには prefork しか使えない。 /usr/sbin/apache2 のリンク先を /usr/sbin/apache2.prefork に書き換え。

    それから、 PHPA がエラーを吐くので php.ini で phpa.shm_user と phpa.shm_group を設定してやる。
  • プロバイダ変更(PPPoE 複数セッション)

    IIJ バックボーンはなんか帯域制限されてるので(上り8Mbps程度しか出ない)

    …って、コレじゃBフレッツベーシックの意味ねぇよ。ってなわけで変更しました。

    ちょっと頑張れば 30Mbps 以上程度は出るかな、って感じ。

Apache2 → Apache1 に戻す (2004-03-20 (土) 03:36:49)

時々 Apache のプロセスが暴走してメモリを食い尽くす…その所為で Load Average が 60 越え _| ̄|○

原因を色々探ってて、とりあえず PHP Accelerator が Apache の error_log に大量に notice メッセージを残してたり。
あんまり関係ないかも知れないけど気持ち悪い。公式サイトの Forums も "me too" だらけで結局解決策はない模様。

[Thu Mar 18 09:18:08 2004] [notice-phpa] Acquiring cache : uid 48 gid 48 perms 
666 (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] PHPA 1.3.3r2 on linux_i686_glibc2.1.3 
(pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Initialised 16MB cache at 0x40dbc000 w
ith 512 process entries (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Lock thresholds 10/10 (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Acquiring cache : uid 48 gid 48 perms 
666 (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] PHPA 1.3.3r2 on linux_i686_glibc2.1.3 
(pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Initialised 16MB cache at 0x40dbc000 w
ith 512 process entries (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Lock thresholds 10/10 (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Acquiring cache : uid 48 gid 48 perms 
666 (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] PHPA 1.3.3r2 on linux_i686_glibc2.1.3 
(pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Initialised 16MB cache at 0x40dbc000 w
ith 512 process entries (pid 29628)
[Thu Mar 18 09:18:08 2004] [notice-phpa] Lock thresholds 10/10 (pid 29628)

しかもログに残る時間は一定。他のログは時間進んでるのに、このメッセージだけずっと同じ時間で表示されてるのでログが過去に戻ってる気分。

とりあえず色々 Apache 2.0.48 がダメくさいので Apache 1.3.29 に戻す。どうせ prefork しか使えないし、メモリ食うみたいだし。
…と、折角苦労してインストールした Apache2 を止めて、 service httpd start

しばらくして、何かパケロスするようになった。あーもー、プロバイダ不調? とか思ってたら、何か /var/log/messages に

Mar 20 02:34:44 evergreen kernel: ip_conntrack: table full, dropping packet.
Mar 20 02:34:44 evergreen last message repeated 9 times
Mar 20 02:34:49 evergreen kernel: NET: 310 messages suppressed.
Mar 20 02:34:49 evergreen kernel: ip_conntrack: table full, dropping packet.
Mar 20 02:34:54 evergreen kernel: NET: 211 messages suppressed.
Mar 20 02:34:54 evergreen kernel: ip_conntrack: table full, dropping packet.

なんじゃこりゃーーー。アタックでも受けてるのか !? と思って色々やってみる。無駄に chkrootkit も掛けてみる。何も無し。

結局、 Apache2 になってから IP 設定した feena.jp の squid 転送で

  1. 誰かが feena.jp へリクエスト
  2. (IPを見て)ローカルからの接続じゃないので feena.jp:81 にリダイレクト
  3. feena.jp:81 (squid サーバ) にリクエスト
  4. squid が Apache にリクエスト
  5. (IPを見て)ローカルなのに外部と勘違いして feena.jp:81 へリダイレクト
  6. 3に戻る

DoS 状態 _| ̄|○ ばかー

w3m が賢く "リダイレクトループだよ" と警告してくれたので発見しました。うひゃー。

Squidは (2004-03-22 (月) 03:13:55)

10MB 単位の大きいファイルには向かない…。

何か転送途中で突っかかってしまう。そーなるとユーザー側はリロードの嵐。余計負荷が。勉強になった。

あと何か知らないけど CPU 食いまくり。そーゆーもん?

分割 (2004-04-11 (日) 21:05:55)

結局前の余ったパーツで鯖をもう一台立てました (shadow) 。んでもって、 Squid をそっちで動かし、本鯖上の Squid は停止。

Apache肥満

どうもApacheを起動したまま放っておくと、太りまくってメモリを圧迫しまくるので、毎日午前 4 時に restart させてみることに。

どうなるやら。

Kernel 2.4.26(2004-04-23 (金) 13:18:08)

どうやら 〜2.4.25 のカーネルにはセキュリティーホールがあるらしく、カーネル上げないとマズそうなので、あげ。

…再起動失敗。

前のプロバイダの接続設定が残ったままでした。ヒャッホウ。

Apacheログ溢れ(2004-05-12 (水) 01:51:19)

最近どうも apache の調子が悪かったらしく。 5 月入ってからなんですが。
原因判明。

-rw-r--r--    1 root     root     2147483647 Apr 30 12:05 tab_access_log

一時的にとってたアクセスログが原因でした。

やたらと

[Tue May 11 23:55:42 2004] [notice] child pid 5449 exit signal File size limit exceeded (25)

とか吐き続けるから、何だろうと思ったら。

プロバイダメンテナンス(2004-05-12 (水) 11:32:22)

うお繋がらない!とか思ったら

【フレッツ・サービスメンテナンスのご案内】

平素より、弊社サービスをご利用いただき誠にありがとうございます。
この度、フレッツ・サービス下記エリアにつきまして、ネットワーク設備の増強工事を
実施するため、下記の時間帯において断続的に通信の切断が発生致します。 

お客様には、大変ご迷惑をおかけしますが、何卒ご了承頂きたく宜しくお願い申し上
げます。

尚、メンテナンスの詳細につきましては、下記の通りとなります。

---------------------------------------------------------- 
  網終端装置の増設によるIPアドレス追加・変更について下記地区にて
  網終端装置の追加作業を行います。 
  工事の詳細は、下記の通りとなります。 
---------------------------------------------------------- 
  工事予定日時 5月11日(火) 11:00〜13:00 
  該当地区 富山エリア 
---------------------------------------------------------- 
  工事予定日時 5月12日(水) 10:30〜12:30 
  該当地区 鹿児島エリア 
----------------------------------------------------------- 
  工事予定日時 5月13日(木) 10:30〜12:30 
  該当地区 福井エリア 
----------------------------------------------------------- 
  工事予定日時 5月14日(金) 14:00〜16:00 
  該当地区 兵庫エリア 
************************************************************ 
★上記の時間帯においてインターネットに接続できない、一部ネットワークの
経路が不安定になるなどのサービス中断が発生致します。 
************************************************************ 

夜中にやってくれええええええ。

annex 復活(2004-12-30 (木) 14:57:35)

帰省ついでに。メモリ交換。現在 512MB 。

MySQL 4.1.8

MySQL 4.1.7 が日本語に関して悲惨な状況なので(機種依存文字絡み)、サーバ上 4.0 系と平行動作させていたんですが、どうやらパッチを書かれた方がいらっしゃるようで、ちゃんと使えるようになったみたいです。

http://www.mysql.gr.jp/frame/modules/bwiki/?Contrib#content_1_7

で、 4.1.8 ではどうなんだろう、というわけで普通に 4.1.8 突っ込んで試してみたんですが、何もしなくてもちゃんと "??" とか通りました。やっとまともに使える…

忘れぬうちにメモ

/etc/sysctl.conf

# もし kernel panic なんて起きても、止まらずとにかく再起動。 (5秒後)
kernel.panic=5

/etc/ppp/pppoe.conf

# 再起動後にうまく繋がらなくても諦めない
CONNECT_TIMEOUT=0
  • Apache を 1.3.31 に。ついでに SSL も使うように?。 (mod_ssl)

mod_rpaf

ネットワーク構成を変更しまして、ゲートウェイを用意、内側にサーバが来るようにしました。
しかし、 IP が 1 つしかないので、ゲートウェイが HTTP リクエスト内容からサーバを振り分ける、いわゆる L7 スイッチの役目を担っています。実際のリクエストの振り分けは、 Apache の mod_proxy + mod_rewrite の RewriteRule [P] で捌いています。

       43.244.234.52  192.168.0.254
[ Internet ] ---> [ GW ] ----+----> [ Server 1 ] 192.168.0.100
                             |
                             +----> [ Server 2 ] 192.168.0.101

このとき、 Internet から Server 1 に来るリクエストは、 REMOTE_ADDR がすべて GW (192.168.0.254) になります。一応リクエストヘッダの X-Forwarded-For にリクエスト元の IP が含まれているので、 CGI や PHP などのスクリプト IP を参照するもの (カウンターなど) では、こちらの IP を参照するようにすれば、問題は解決なのですが、サーバモジュール側 (例えば mod_limitipconn など) はそうはいきません。

で、どうしたものか、と調べていたら、ちょうどいいモジュールを発見しました。

このモジュールで、リクエスト到着時に REMOTE_ADDR を X-Forwarded-For で置き換えてくれるようになり、今まで通り直接外部からアクセスしたときと同等の動作を行うようになります。

logrotate の暴走

タイトル通り。原因突き止めにソースまで追っかけたよ…

  • まずは ls -R /var/log とかして、ログディレクトリの中が異常なファイル数になっていないか確認(なってたら明らかに不要なログ(IPごとに取られてるログとか)を削除して、設定を見直す)
  • その後、 /var/lib/logrotate.status から当該ファイルの行を削除するか、ファイルごとばっさり削除

で、解決するはず。 logrotate.status が肥大化すると、 O(n^2) で死ぬほど遅くなる。

qmail-remoteでSMTP-AUTH

nothing に割り当てられた IP 範囲が、困ったことに SORBS の Dynamic IP リストに乗っちゃってる(しかもどうしようもないらしい)ので、リモート宛のメールを直接配信することを諦めて、プロバイダのSMTPサーバに転送するように。

しかし現在利用しているプロバイダの SMTP の利用には、 SMTP 認証が必要。そのため、素のままの qmail で control/smtproutes を設定しても(当然ながら)弾かれてしまう。

というわけで、 qmail に qmail-remote-auth パッチ を。サイトの説明通りですんなりインストール完了。

2005-12-09 (金) 01:42:28 追記:
しかし上記だけでは少し問題が。
Sender が "hoge=page+age@foobar.com" なメールを relay する際に、 RCPT TO=<送信先> AUTH=<hoge=page+age@foobar.com> が Syntax Error で蹴られてしまう。仕方がないのでとりあえず、 Sender を送信しない形で ( AUTH=<> となるように) 送信するようにソースを改変。(1行コメントアウトするだけだけど)

とりあえずうまく行くようになった。 RFC 的にも特に問題ないはず。

Qgrey

SPAM対策の一環に、 Qgrey を導入してみた。
S25R + qgreylist という便利なモノ。

S25R は、接続元の FQDN パターンから、動的IPやら怪しいホストやらを弾くモノ。一時期流行った BBS の proxy 弾きみたいなもんかな。でもそれだけだと、ウチのサーバみたいに "逆引きしたら 52.234.244.43.yournet.ne.jp" なんて悲しい鯖も弾かれる対象になっちゃう。(まぁ今はプロバイダのメール鯖経由ですが)

それだと実運用に耐えないので、引っかかっちゃった接続元には、これまた最近流行りの greylisting を適用して救済を図る。 greylist では、知らない IP からの 1 回目の接続は temporary error で蹴ってしまう。 SPAMMER 御用達の自前 SMTP クライアントは、基本的に 1 回しか送信チャレンジしないので、これで大方の SPAM-MTA は諦めてしまう。でもまともな MTA (qmail や Postfix, Sendmail 等) なら、時間を空けつつ何度か送信してくれるので、(一定時間後に送られてきた) 2 度目以降のメールは受け取ってあげる、というモノ。これで、 "マトモ" なメールは間違いなく救済できる。

まぁ、詳しくは Qgrey と同じ人が書いた、 Rgrey を参照。

ただ、 qmail-vida の SMTP-AUTH が同時に利用できない。正規クライアントからの SMTP 接続も当然 greylist 対象になるので、当然なのだが、 qgreylist のサイトでは "port 587 で SMTP-AUTH するようにしろ" と書いてあるので、とりあえず言われたとおりにしてみた。

SMTP-AUTH 使ってるユーザに説明しなきゃなぁ。

pgid と はてブ/LdCカウンタ (2009-01-29 (木) 01:30:37)

  • pgid.inc.php: 2000 ページぐらいあると毎回読み込む負荷がやばくなってきた
    • キャッシュすることにしたら軽くなった
  • カウンタは Cache_Lite がうまく機能してなかった
    • memcached とか使ってみることにする

(HTML conversion costs 0.017 sec.)