ApacheSSL環境の構築(OpenSSL + mod_ssl)


前回の記事で書き忘れたのですが、ApacheSSL通信を行う方法です。


Apache上でSSL通信を実現する為には、
まずSSL機能を実装しているベースプログラムとして
・OpenSSL
・SSLeay
の二つがあり、それらをApacheに組み込むモジュール
・mod_ssl
Apache-SSL
を選択してインストールする必要があります。
この内SSLeay + mod_sslの組み合わせは不可能です。
今回は技術的なトレンドに従いOpenSSL + mod_sslの組み合わせを選択しました。


OpenSSLはOSインストール時に、mod_sslLAMPスタックをインストールしたときにデフォルトで入っていたので、
鍵の作成とApacheの設定のみ行います。
まず鍵の生成です。

// 秘密鍵の生成
$ sudo openssl genrsa -des3 1024 > server.key

// 秘密鍵パスフレーズを無効(再起動時にパスフレーズの入力が求められる為)
$ sudo openssl rsa -in server.key -out server.key

// CSRの生成
$ sudo openssl req -new -key server.key > server.csr

// デジタル証明書の生成
$ sudo openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt

// 鍵&証明書の移動
$ sudo mv server.crt /etc/ssl/certs/
$ sudo mv server.key /etc/ssl/private/

CSRの生成時ですが、以下の事項を入力することになります。


国コード 例. JP:Country Name (2 letter code) [AU]:
都道府県 例. Tokyo:State or Province Name (full name) [Some-State]:
市町村区 例. Minato-ku:Locality Name (eg, city) :
組織名(会社名)Organization Name (eg, company) :
部署名:Organizational Unit Name (eg, section)
:
SSL証明を行うホスト名 例. example.com:Common Name (eg, YOUR name) :
Enterを押す:challenge password
:
Enterを押す:An optional company name []:


実際に認証局の証明書を取得する訳では無いので、別に正確に入力する必要はありません。


次にApacheの設定です。

$ vim /etc/apache2/sites-available/default-ssl

SSLEngine On
// 証明書のパス
SSLCertificateFile /etc/ssl/certs/server.crt
// 秘密鍵のパス
SSLCertificateKeyFile /etc/ssl/private/server.key

// SSLモジュールを有効にする
$ sudo a2enmod ssl

// 設定ファイルを有効にする
$ sudo a2ensite default-ssl

// 再起動
$ sudo apache2ctl graceful

なおopensslコマンドの引数についてはここを参考にしました。

Apacheの設定


Apacheの設定を行います。


まずディレクトリ構成からですが、
通常Apacheをインストールした直後は/var/www以下が公開ディレクトリとなっています。
そこで今回は複数ホスト(マルチドメイン)を分かりやすく扱う為に以下のようにディレクトリ構成の変更を行いました。


/var/www/default/public ⇒ デフォルトの公開ディレクト


こうして後はサイトが増えるごとに


/var/www/任意のサイト名/public


として、追加していきます。




次にApacheのバーチャルホストの設定を行います。
Apacheにはバーチャルホストと言って、一つのWEBサーバで複数のホストを扱う機能があります。


バーチャルホストには2種類あって、一つはIPベースのバーチャルホスト。
これは一つのサーバに複数のIPアドレスを割り当て、Apache側でIPアドレスごとに公開ディレクトリを振り分けるという方式です。
もう一つは名前ベースのバーチャルホストです。
こっちは一つのIPアドレスに向いている複数のホストをホスト名ごとに公開ディレクトリに振り分けるという方式です。
今回調べたのは名前ベースのバーチャルホストの方です。


まずVirtualHostを有効にするための宣言を行います。

$ sudo vim /etc/apache2/sites-available/exmaple
NameVirtualHost *:80
※*の部分、別にIPベースのバーチャルホストを実施している場合はサーバに割り当てらているIPアドレスの内、使いたい方のIPアドレスを記します。
(LAN接続でNAT変換を行っている場合等はローカルIPアドレス、point to pointで接続している場合とかはグローバルIPアドレスが入りますね。)


これでApacheの80番ポートにてVirtualHostが可能になりました。


次に、ホスト名がexample.comで、公開ディレクトリをexampleとした場合

// 設定ファイルを作成
$ sudo vim /etc/apache2/sites-available/exmaple

ServerName exmaple.com
ServerAlias www.exmaple.com
DocumentRoot /var/www/exmaple/public

// 作成した設定ファイルを有効にする
$ sudo a2ensite exmaple

// Apacheの再起動
$ sudo apache2ctl graceful

後はブラウザでexmaple.comにアクセスして/var/www/exmaple/publicが公開ディレクトリして使用されているか確認です。


次にSSLでのバーチャルホストです。
SSLの仕組上、名前ベースのバーチャルホストではSSLの運用が不可能のように思えますが(※)
それは認証局でのSSL認証を行いたい場合での話です。
(※SSL通信ではアクセス時にまず最初にSSL認証が行われますが、この時Apache側ではホスト名はまだ分からないので、
先頭の443番のVirtualHostディレクティブに記載されているSSLCertificateKeyFileの鍵ファイルが認証に使用されてしまう為です。)
テストサイトなどで認証が不正でも別に良い場合は、80番ポートの時と同じことを繰り返せば良い訳です。


つまり

$ sudo vim /etc/apache2/sites-available/exmaple-ssl
NameVirtualHost *:443
を宣言し

$ sudo vim /etc/apache2/sites-available/exmaple-ssl

ServerName exmaple.com:443
ServerAlias www.exmaple.com:443
DocumentRoot /var/www/exmaple/public

SSLEngine On
SSLCertificateFile ****
SSLCertificateKeyFile ++++

$ sudo a2ensite exmaple-ssl

$ sudo apache2ctl graceful

ということです。


また、どうしても複数サイトでSSL認証が必要な場合はポートでサイトを分ければそれはそれでOK。
ホスト名が一緒だから認証が通って当然ですね。


一例として僕のApache設定ファイル群を記します。(備忘録として書いているだけですが。。)
サイトexmaple-a(デフォルトファイル), exmaple-bをそれぞれHTTPとHTTPSで使用しています。

$ cat /etc/apache2/sites-available/exmaple-a
## デフォルトの設定

DocumentRoot /var/www/exmaple-a/public

LogLevel warn
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log


Options FollowSymLinks
AllowOverride None


ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch


Alias /doc/ "/usr/share/doc/"

Options Indexes MultiViews FollowSymLinks


## サイト別設定

NameVirtualHost *:80


ServerName exmaple-a.com
ServerAlias www.exmaple-a.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-a/public

$ cat /etc/apache2/sites-available/exmaple-a-ssl

NameVirtualHost *443:

ServerName exmaple-a.com
ServerAlias www.exmaple-a.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-a/public

SSLEngine on
SSLCertificateFile ****
SSLCertificateKeyFile ++++

SSLOptions +StdEnvVars


SSLOptions +StdEnvVars

BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

$ cat /etc/apache2/sites-available/exmaple-b

ServerName exmaple-b.com
ServerAlias www.exmaple-b.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-b/public

$ cat /etc/apache2/sites-available/exmaple-b-ssl


ServerName exmaple-b.com
ServerAlias www.exmaple-b.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/exmaple-b/public

SSLEngine on
SSLCertificateFile XXXX
SSLCertificateKeyFile ----

SSLOptions +StdEnvVars


SSLOptions +StdEnvVars

BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0



ちなみに別のホスト名で同じ公開ディレクトリを使用したい場合(パークドメイン)を行う場合は
上記のServerNameディレクティブの下に

ServerAlias example2.com
といった感じです。


もちろんexample.comやexample2.comのDNS設定(Aレコード)は、
ドメインの管理画面だったり、LAN内のみの場合はルータの管理画面とかで別途設定が必要です。

Ubuntuのインストール。


今回は開発用サーバのセットアップについて書きます。
まあ個人的な備忘録に近いのであまり参考にならないかもしれませんが。。。


まずUbuntuサーバ版のISOファイルをここからダウンロードしてCDに焼きます。
そしてドライブに入れて再起動すれば後はインストーラ通りです。
ネットワーク部分はLAN内に配置するとは言えDHCPだと問題があるので固定のローカルIPを設定しました。
最後の方にスタック(パッケージをセットにして導入を容易にしたもの)を選択する画面が出てきます。
僕は


Basic Ubuntu server
LAMP server
Mail server、
OpenSSH srrver
PostgreSQL server


を選択しました。
実はいろいろあって3回くらいOSの再インストールをしており、1回目は一個一個コンパイルして導入していたのですが、2回目にはaptでインストール、最後はtasksel(このスタック単位でのインストール用コマンド)で入れていました。。。
ここで選択していなくてもOSのインストール完了後、前述したtaskselコマンドでいつでも導入できます。


導入後、まず最初にしたのがSSHのログイン方式を公開鍵暗号方式への変更です。
この方法は以前の記事で書いたので今回は割愛します。


次にファイアーウォール(iptables)の設定を行います。
本サーバはLAN内でのみ公開しているので必要無い気もしますが、一応設定します。


// 設定用のシェルスクリプトを設定する。
$ vim iptables.sh
#!/bin/bash

# ファイアウォール初期化
sudo /sbin/iptables -F

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
sudo /sbin/iptables -P INPUT DROP
sudo /sbin/iptables -P FORWARD ACCEPT
sudo /sbin/iptables -P OUTPUT ACCEPT

# ループバック
sudo /sbin/iptables -A INPUT -p tcp -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
sudo /sbin/iptables -A INPUT -p udp -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

# LAN内のホストからのみpingを許可
sudo /sbin/iptables -A OUTPUT -p icmp --icmp-type 0 -d 192.168.1.0/255.255.255.0 -j ACCEPT
sudo /sbin/iptables -A INPUT -p icmp -s 192.168.1.0/255.255.255.0 --icmp-type 8 -j ACCEPT

# エフェメラルポートの解放
sudo /sbin/iptables -A INPUT -p tcp --dport 32768:65535 -j ACCEPT
sudo /sbin/iptables -A INPUT -p udp --dport 32768:65535 -j ACCEPT

# SSH接続はLAN内のホストからのみ接続を許可。その他は全て解放する。
sudo /sbin/iptables -A INPUT -p tcp -s 192.168.1.0/255.255.255.0 --dport 22 -j ACCEPT
sudo /sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT
sudo /sbin/iptables -A INPUT -p tcp --dport 53 -j ACCEPT
sudo /sbin/iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo /sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
sudo /sbin/iptables -A INPUT -p tcp --dport 123 -j ACCEPT
sudo /sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo /sbin/iptables -A INPUT -p tcp --dport 587 -j ACCEPT

// 実行権限を与え、設定を行う。
$ chmod 705 iptables.sh
$ bash iptables.sh

以上でファイアーウォールのセットアップは完了です。
主にこのサイトを参考にしました。


今回はサーバのセットアップの内セキュリティ部分の設定を行いました。

vimを使う。


前回に引き続き開発用サーバのセットアップで、vimの設定を行います。


vimはviから派生したテキストエディタで、viの拡張版という位置づけです。
emacsを選ばなかった理由は特にありません。
普段サーバ上で仕事する時にviを使っていたっていうのと、
正直どっちが優れているとか僕は全然分からないので、とりあえずvimを使う事にしました。


ソフトウェア開発におけるエディタの性能は開発効率に大きく影響します。
そこで今回はvimを(個人的に)使いやすくする基本的なカスタマイズを行います。
まずvimをインストールします。

$ sudo apt-get install vim


ユーザごとの設定ファイルを作成します。

$ vim ~/.vimrc
" viとの互換性をとらない(vimの独自拡張機能を使う為)
set nocompatible
" 改行コードの自動認識
set fileformats=unix,dos,mac
" ビープ音を鳴らさない
set vb t_vb=
" バックスペースキーで削除できるものを指定
" indent : 行頭の空白
" eol : 改行
" start : 挿入モード開始位置より手前の文字
set backspace=indent,eol,start
" コメントから改行した時に、次の行頭に自動でコメントが入らないようにする
set formatoptions-=ro
"----------------------------------------------------
" バックアップ関係
"----------------------------------------------------
" バックアップをとらない
set nobackup
" ファイルの上書きの前にバックアップを作る
" (ただし、backup がオンでない限り、バックアップは上書きに成功した後削除される)
set writebackup

"----------------------------------------------------
" 検索関係
"----------------------------------------------------
" コマンド、検索パターンを100個まで履歴に残す
set history=100
" 検索の時に大文字小文字を区別しない
set ignorecase
" 検索の時に大文字が含まれている場合は区別して検索する
set smartcase
" 最後まで検索したら先頭に戻る
set wrapscan
" インクリメンタルサーチを使わない
set noincsearch

"----------------------------------------------------
" 表示関係
"----------------------------------------------------
" タイトルをウインドウ枠に表示する
set title
" 行番号を表示
set nu
" ルーラーを表示
"set ruler
" タブ文字を CTRL-I で表示し、行末に $ で表示する
" set list
" 入力中のコマンドをステータスに表示する
set showcmd
" ステータスラインを常に表示
set laststatus=2
" 括弧入力時の対応する括弧を表示
set showmatch
" 対応する括弧の表示時間を2にする
set matchtime=2
" シンタックスハイライトを有効にする
syntax on
" 検索結果文字列のハイライトを有効にする
set hlsearch
" コメント文の色を変更
highlight Comment ctermfg=DarkCyan
" コマンドライン補完を拡張モードにする
set wildmenu

" 入力されているテキストの最大幅
" (行がそれより長くなると、この幅を超えないように空白の後で改行される)を無効にする
set textwidth=0
" ウィンドウの幅より長い行は折り返して、次の行に続けて表示する
set wrap

" 全角スペースの表示
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray
match ZenkakuSpace / /

" ステータスラインに表示する情報の指定
set statusline=%n\:%y%F\ \|%{(&fenc!=''?&fenc:&enc).'\|'.&ff.'\|'}%m%r%=<%l/%L:%p%%>
" ステータスラインの色
highlight StatusLine term=NONE cterm=NONE ctermfg=black ctermbg=white

"----------------------------------------------------
" インデント
"----------------------------------------------------
" オートインデントを無効にする
set noautoindent
" タブが対応する空白の数
set tabstop=4
" タブやバックスペースの使用等の編集操作をするときに、タブが対応する空白の数
set softtabstop=4
" インデントの各段階に使われる空白の数
set shiftwidth=4
" タブを挿入するとき、代わりに空白を使う
set expandtab

"----------------------------------------------------
" 国際化関係
"----------------------------------------------------
" 文字コードの設定
" fileencodingsの設定ではencodingの値を一番最後に記述する
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,euc-jp,cp932,iso-2022-jp
set fileencodings+=,ucs-2le,ucs-2,utf-8

"----------------------------------------------------
" オートコマンド
"----------------------------------------------------
if has("autocmd")
" ファイルタイプ別インデント、プラグインを有効にする
filetype plugin indent on
" カーソル位置を記憶する
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
endif

"----------------------------------------------------
" その他
"----------------------------------------------------
" バッファを切替えてもundoの効力を失わない
set hidden
" 起動時のメッセージを表示しない
set shortmess+=I

~/.vimrcの内容はここを参照(というかほとんどコピペ)しました。
ちなみにこの設定ファイルの内容をコピペする時は、vimコマンドで


:set paste
としてからペーストして下さい。


とりあえず今回はこれだけです。


まだvimの使い方を全然分かっていないので、何か便利な技とか見つけ次第書いていきます。

開発環境一新。


新期なので、開発環境を一新することにしました。


今まではWindows上のエディタで開発を行い、
FTP/SFTPクライアントでサーバにアップする、というやりかたでした。
エディタもがりがりマクロ等でカスタマイズしてそれなりに効率は良かったと思いますが、
もっとUNIX(まあ今回はLinuxですが)について詳しくなりたかったとか
UNIXでのcを書く機会が増えたとか色々理由はあるのですが、
結局vi使いが格好良いという思い込みで
新しい開発環境ではLAN内に開発用のサーバを一台用意することにしました。


OSはUbuntu 8.10 Server Editionです。
もともと普段使っているCentOSDebianにしようかで迷っていたのですが
流行りということもありUbuntuにしました。
ディレクトリ構成とかはDebianとほとんど同じなので、あまり導入に苦労はありませんでした。


ターミナルはPuTTYです。
PuTTYを選んだ理由は
・paygent等のサポートツールが充実している。
・ポータブル可能。
という2点です。


僕は開発環境自体を持ち運びたいと考えていまして
現在パーティション分けしたDドライブに

                                                                                  • -

FirefoxPortable(WEBブラウザ
ThunderbirdPortable(メーラー
FileZillaPortable(FTP/SFTPクライアント)
さくらエディタ(テキストエディタ
PortForwarder(ポート転送ツール)
Putty(ターミナル)
OpenOffice.org Portable(オフィススイート)
DBDesigner(ER図作成ツール)
SilentNight MicroBurner(DVD/CDライター)
UltraDefrag(デフラグツール)

                                                                                  • -

等入れてそのうちSSDとかでポータブル環境を構築しようとしているので
ポータブル可能かどうかは非常に重要だったわけです。
ちなみにThunderbirdPortableはGmailに代替できそうですが、
使い勝手の部分やたまに落ちたりするのが気になってなかなか移行できません。
とりあえずThunderbirdIMAPクライアントにしようかとか色々考えています。


PuTTYを使っているとやたらと接続が切れたりして良い印象を持っていなかったのですが、
「セッションをアクティブに保つためのnullパケットの送信間隔(秒)」を調整する事で解決したので導入に迷いはありませんでした。


そして開発用のサーバにはvimApacheMySQLPostgreSQLPHPRuby&RoR(with mod_rails)、Subversion(クライアントとして)あたりを入れてみようかと思います。
(話からはずれますが、MySQLと言えばSunがOracleに買収されたとかで今後の動向が気になります。。。)


次回からはこの開発用サーバのセットアップについて書いていきます。

OpenXの導入


OpenX AdServerとはPHPで開発されているオープンソースGPLライセンス)の広告配信システムです。
インストールしたサーバ内で配信するローカル配信、リモートのサーバに配信するリモート配信が可能です。
広告配信における各種設定、充実した統計機能などオープンソースなのが不思議なくらい多機能なシステムです。
※詳しくはOpenXの日本語サイト(公式?非公式??)でどうぞ。



システム要件としましては、ApachePHPMySQL or PostgreSQLでWEBを公開している事くらいです。
なお各ミドルウェアのバージョンについては公式サイト(英語)をのマニュアル等を参考にして下さい。
こちらではApache2.2・PHP5.2・MySQL5.0の環境で導入しました。



インストールといってもPHPなのでサーバに設置してパーミッションを適切に設定するだけです。
後は良くできているインストール画面でインストールは完了します。
ここなんかがインストールから設定を含め詳しく解説してくれています。


それでこのOpenXですが、リモートのサーバに広告を貼る時にテキスト広告ですとJavaScriptぐらいしかやり方が無いように思えます。
XML-RPCはデフォルトでオンになっていないし、オンにしてもXMLRPCのライブラリをインクルードしているのでローカル用に思えます。)


そこで今回はPHPで設置タグを貼れるように機能追加することにしました。


まず下記のPHPスクリプト]を(OpenX設置ディレクトリ)/plugins/invocationTags/oxInvocationTagsにadphp.class.phpというファイル名でアップします。(パーミッションは707)

translate("PHP Tag");
}

/**
* Return the English name of the plugin. Used when
* generating translation keys based on the plugin
* name.
*
* @return string An English string describing the class.
*/
function getNameEN()
{
return 'PHP Tag';
}

/**
* Check if plugin is allowed
*
* @return boolean True - allowed, false - not allowed
*/
function isAllowed($extra)
{
$isAllowed = parent::isAllowed($extra);
return $isAllowed;
}

function getOrder()
{
parent::getOrder();
return 9;
}

/**
* Return list of options
*
* @return array Group of options
*/
function getOptionsList()
{
if (is_array($this->defaultOptions)) {
if (in_array('cacheBuster', $this->defaultOptions)) {
unset($this->defaultOptions['cacheBuster']);
}
}
$options = array (
'spacer' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'what' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
//'clientid' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'campaignid' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'block' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'target' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'source' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'withtext' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'blockcampaign' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD,
'charset' => MAX_PLUGINS_INVOCATION_TAGS_STANDARD
);

return $options;
}

/**
* Return invocation code for this plugin (codetype)
*
* @return string
*/
function generateInvocationCode()
{
$aComments = array(
'SSL Delivery Comment' => '',
'Comment' => $this->translate(''),
);
parent::prepareCommonInvocationData($aComments);

$conf = $GLOBALS['_MAX']['CONF'];
$mi = &$this->maxInvocation;

$buffer = $mi->buffer;


if (isset($mi->withtext) && $mi->withtext != '0') {
$mi->parameters['withtext'] = "withtext=1";
}
if (isset($mi->block) && $mi->block == '1') {
$mi->parameters['block'] = "block=1";
}
if (isset($mi->blockcampaign) && $mi->blockcampaign == '1') {
$mi->parameters['blockcampaign'] = "blockcampaign=1";
}
if (!empty($mi->campaignid)) {
$mi->parameters['campaignid'] = "campaignid=".$mi->campaignid;
}
unset($mi->parameters['cb']);


$script = MAX_commonConstructPartialDeliveryUrl($conf['file']['js'], true);
$param = (count($mi->parameters) > 0) ? '&' . implode('&', $mi->parameters) : '';

$buffer .=<<<BUNNER
<?php
// HTTP出力時の文字コードを設定して下さい
mb_http_output('UTF-8');

\$uri = 'http' . (isset(\$_SERVER['HTTPS']) ? 's' : '') . ':{$script}'
. '?cb=' . rand(10000000000, 99999999999)
. '{$param}'
. '&charset=' . mb_http_output()
. '&loc=http' . (isset(\$_SERVER['HTTPS']) ? 's' : '') . '://' . \$_SERVER['HTTP_HOST'] . '/' . parse_url(ltrim(\$_SERVER['REQUEST_URI'], '/'), PHP_URL_PASS)
. (isset(\$_SERVER['REFERER']) ? '&referer=' . \$_SERVER['REFERER'] : '');

\$options = array(
'http' => array(
'method' => 'GET',
'header' => 'User-Agent: ' . \$_SERVER['HTTP_USER_AGENT'] . "\\r\\n"
. 'Cookie: OAID=' . uniqid('') . "\\r\\n"
)
);

if (\$ad = @file_get_contents(\$uri, null, stream_context_create(\$options))) {
\$ad = explode('\\n', \$ad);
if (preg_match('/.*\+\=\s\"(.*)\\.*/', strtr(\$ad[0], array('"+"' => '', '\\\' => '')), \$matches)) {
\$ad = \$matches[1];
}
}
print \$ad;
?>
BUNNER;

return $buffer;
}

function setInvocation(&$invocation) {
$this->maxInvocation = &$invocation;
$this->maxInvocation->canDetectCharset = true;
}
}
?>

そして設定ファイル=(OpenX設定ディレクトリ)/var/(ホスト名).conf.phpの366行目あたりにあるoxInvocationTagsセクションの最下行にisAllowedAdphp=1の一行を追加します。


これでゾーン設定の広告表示コード生成時にPHP Tagという選択肢が表示されるようになります。
(※このスクリプトによって損等が生じたとしても一切の責任は負いかねます。)


後、このシステムを使っていると時々広告が配信されない事があります。
それで色々原因を調べてみたら各手法(JavaScript, XML-RPC等)での配信ファイル内の_adSelect関数に問題があるっぽいので以下の様に変更しました。
例えばJavaScriptで配信を行っているとして(OpenX設定ディレクトリ)/www/delivery/ajs.phpの2821行目付近
return;

return $aLinkedAd;


この関数は選択した広告を優先順位に基づくアルゴリズムを用いて配信するかどうかを判定するものだと思うのですが、
問題はこの関数の外側で取得出来なかった時の再取得を実装していないとかじゃないかと思います。


これは仕様かもしれないし、勘違いかもしれないし、別の設定で回避できるのかもしれません。
というかこの変更を行った事により優先順位付けの機能が無効になっているかも・・。


また色々調べて別の解決方法とかあれば書きたいと思います。
てか誰か何か知っていたら教えてください。

NAGIOSの導入〜NRPEのインストール


NRPE(Nagios Remote Plugin Executor)とは、
Nagiosにてリモート監視を行うためのプラグインです。
ローカルのみ監視をする場合には必要無いですが、
リモートサーバのリソース監視を行いたい場合などには必須のモジュールです。

Nagiosサーバ側


# 最新版をダウンロード
$ wget []http://downloads.sourceforge.net/nagios/nrpe-2.12.tar.gz[]
$ tar zxvf nrpe-2.12.tar.gz
$ cd nrpe-2.12

# コンパイル
$ ./configure
$ make check_nrpe
$ make install-plugin


# NagiosにNRPEプラグインを登録
$ cp ./src/check_nrpe /usr/local/nagios/libexec
$ vi /usr/local/nagios/etc/objects/commands.cfg
// 以下を追記
# 'check_nrpe' command definition
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

# サービスを登録
$ vi /usr/local/nagios/etc/objects/templates.cfg
define service{
use generic-service
host_name (ホスト名)
service_description (サービス名)
check_command check_nrpe!(リモートで実行したいNagiosコマンド名:リモート側で設定されていなければならない)
}

# 再起動
$ /etc/init.d/nagios restart

リモートホスト側(あらかじめNagiosサーバ側からのポートを開放しておく)

  • NRPEのインストール


# 準備
$ /usr/sbin/useradd nagios
$ mkdir /usr/local/nagios /usr/local/nagios/bin /usr/local/nagios/libexec /usr/local/nagios/etc

# 最新版をダウンロード
$ wget []http://downloads.sourceforge.net/nagios/nrpe-2.12.tar.gz[]
$ tar zxvf nrpe-2.12.tar.gz
$ cd nrpe-2.12

# コンパイル
$ ./configure --prefix=/usr/local/nagios
$ make

# プログラム・設定ファイルのコピー
$ cp ./src/nrpe /usr/local/nagios/bin
$ cp ./sample-config/nrpe.cfg /usr/local/nagios/etc

# インストールファイルの削除
$ cd ../
$ rm -rf nrpe-2.12.tar.gz nrpe-2.12

  • NagiosPluginのインストール


# 最新版をダウンロード
$ wget []http://downloads.sourceforge.net/nagiosplug/nagios-plugins-1.4.13.tar.gz?modtime=1222335829&big_mirror=0[]
$ tar zxvf nagios-plugins-1.4.13.tar.gz
$ cd nagios-plugins-1.4.13

# コンパイル
$ ./configure --prefix=/usr/local/nagios
$ make
$ make install

# スタンドアロンプラグインをコピー
$ cp contrib/* /usr/local/nagios/libexec/
$ chmod 705 /usr/local/nagios/libexec/*

# インストールファイルn削除
$ cd ../
$ rm -rf nagios-plugins-1.4.13 nagios-plugins-1.4.13.tar.gz

# メモリ監視プラグインの改変
$ vi /usr/local/nagios/libexec/check_mem.pl
// この一行をコメントアウトして、
$command_line = `vmstat | tail -1 | awk '{print \$4,\$5}'`;
// この一行を追加
$command_line = `free |head -3|tail -1|awk '{print \$3,\$4}'`;

  • NRPEの設定


# コマンドの登録
$ vi /usr/local/nagios/etc/nrpe.cfg
// 任意のサービスを登録(しきい値やHDDのパーティションは環境に合わせて変える)
command[check_load]=/usr/local/nagios/libexec/check_load -w 9.0,7.0,6.0 -c 10.0,8.0,7.0
command[check_disk]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /
command[check_mem]=/usr/local/nagios/libexec/check_mem.pl -f -w 20 -c 10
$ chmod 644 /usr/local/nagios/etc/nrpe.cfg

# 起動設定(xinetに登録)
$ vi /etc/services
// 以下を追記
nrpe 5666/tcp # NRPE
$ vi /etc/xinetd.d/nrpe
// 以下を記述
service nrpe
{
flags = REUSE
socket_type = stream
port = 5666
wait = no
user = nagios
group = nagios
server = /usr/local/nagios/bin/nrpe
server_args = -c /usr/local/nagios/etc/nrpe.cfg --inetd
log_on_failure += USERID
disable = no
only_from = 127.0.0.1
only_from = (NAGIOSサーバのIPアドレス)
}

# xinetの再起動(NRPEの起動)
$ /etc/rc.d/init.d/xinetd restart





※追記
後日別のVPSサーバ(リモートホスト側)でNRPEのインストールを行うとエラーが・・・。

$ ./configure --prefix=/usr/local/nagios
Cannot find ssl headers
ググるとlibssl-devが無いとかなんとか・・。

$ yum install libssl-dev
Nothing to do
??

$ yum install libssl-devel
Nothing to do
??

$ yum search ssl


openssl-devel.x86_64


$ yum install openssl-devel
これで再度コンパイルを行ったところインストールに成功しました。