わかってきた事

On 2009年10月28日, in Apache, by タカ

今現在、以下の3パターンでロードアベレージなどを調べています。

  1. Apache+mod_phpのみ
  2. 静的コンテンツはwokerのApache,動的コンテンツはApache+mod_php
  3. 静的コンテンツはwokerのApache+mod_cache,動的コンテンツはApache+mod_php

仮想で2CPUで検証中。

最初は、どれも大して差がありません。
むしろ、分けている方がロードアベレージ高いです。

ただ、負荷が上がってくるとだんだんmod_php+Apacheが悲鳴をあげてきます。

ある時を境に、1のmod_php+Apacheが突然落ちます。(ログに出ないけどtopから消えてJMeterが止まる)

同じ負荷でも、2はちゃんとアクセスをさばいています。(若干重くなってはいるが表示はされる)

3はまだ検証していません。

ここらへんの結果から、静的コンテンツと動的コンテンツで分ける手法は
同一サーバ内でも有効だという仮説が立ちます。

負荷を軽減するというよりは、マシンパワーを余すことなく使いしっかりとアクセスをさばいている感じです。

ここはもう少し深堀していきます。

余裕が出たらJMeterの使い方や負荷テストの手順とかも書きたいなぁ。

Tagged with:  

※ProxyPreserveHost Onを設定すると発生しない??

リクエストをプロキシされる側で問題が発生する場合がある。

今回遭遇したのは、$_SERVERに関する部分。

プロキシ:example.jpの80番ポート
APサーバ:example.jpの30080番ポート

とすると、
APサーバにて、$_SERVER['HTTP_HOST']を表示させると

example.jp:30080

となっている。
普通に考えればこれは当然なんだけど、

example.jp:80

になって欲しい。
他にも、 $_SERVER['REMOTE_ADDR']と$_SERVER['SERVER_NAME']も
APサーバ側の情報になる。

そんな時の対処法としては、

$_SERVER['HTTP_HOST'] = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST']:$_SERVER['HTTP_HOST'];
$_SERVER['REMOTE_ADDR'] = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
$_SERVER['SERVER_NAME'] = isset($_SERVER['HTTP_X_FORWARDED_SERVER']) ? $_SERVER['HTTP_X_FORWARDED_SERVER']:$_SERVER['SERVER_NAME'];

という感じで、HTTP_X_FORWARDED系の情報を使い、プロキシ側に書き換えます。

これを使って、mojaviとかも上手く動くようになりました。

※グローバル変数を書き換えるのは危険な気もするけど…。

Tagged with:  

Xenとリバースプロキシ

On 2009年10月16日, in 未分類, by タカ

とある環境にて、Xenとリバースプロキシを利用して
ちゃんと環境を作ろうと画策中。

年内にはすっきりさせたい!

Tagged with:  

画像のリクエストを別httpdに任せたい。

理由は、負荷対策。
というわけで、手順を書いておく。

・実行用ユーザ作成

# groupadd -g 1001 www
# useradd -d /home/www -g www -s /sbin/nologin -u 1001 www

・apacheをソースからインストール(workerとして)

# ./configure --prefix=/usr/local/apache_proxy --enable-mods-shared=all --enable-proxy --enable-proxy-http --with-suexec-caller=www --with-expat=builtin --with-mpm=worker
# make
# make install

・起動スクリプト作成

# vim /etc/rc.d/init.d/apache_proxy

・以下の内容を書き込み

#!/bin/sh
#
# Startup script for the Apache Web Server
#
# chkconfig: 345 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#              HTML files and CGI.
# processname: httpd
# pidfile: /usr/local/apache/logs/httpd.pid
# config: /usr/local/apache/conf/httpd.conf
APACHECTL=/usr/local/apache_proxy/bin/apachectl
PID=/usr/local/apache_proxy/logs/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
# See how we were called.
case "$1" in
  start)
        echo -n "Starting apache_proxy: "
        daemon $APACHECTL start
        echo
        ;;
  stop)
        echo -n "Shutting down apache_proxy: "
        daemon $APACHECTL stop
        rm -f $PID
        echo
        ;;
  status)
        status httpd
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
esac

exit 0

・実行権付与

# cd /etc/init.d
# chmod +x apache_proxy
# chkconfig --add apache_proxy

・リバースプロキシ設定

# cd /usr/local/apache_proxy/conf/
# vim httpd.conf
Listen 80

ProxyRequests Off
ProxyPreserveHost On
ProxyPassReverse / http://localhost:30080/

RewriteEngine On
RewriteRule ^/(images |css|js)/ - [L]
RewriteRule ^/(.*) http://localhost:30080/$1 [P,L,QSA]

・APサーバ設定変更(/usr/local/apacheにインストールされていると仮定)

# cd /usr/local/apache/conf
# vim httpd.conf
Listen 30080

ちなみに、リバースプロキシはworkerにする。
理由は、こちら