ラベル Apache の投稿を表示しています。 すべての投稿を表示
ラベル Apache の投稿を表示しています。 すべての投稿を表示

2014年4月11日金曜日

MacでDockerにMonitを入れてApacheを動かす

Dockerで起動したCentOS上にMonitをインストールしてApacheを起動させます。

Monitとは、プロセス監視ツールです。
なぜ、このMonitを利用するかというと、、、Dockerは起動時に1つしかプロセスを起動するコマンドが使えないためです。
このMonitを利用すると、プロセスが立ち上がっていない場合Monitがかわりに起動してくれる様な設定が可能です。
なので、Dockerの起動時に立ち上げるプロセスをMonitにしておけば、Monitに監視させている他のプロセス(ApacheやSSHなど)をMonitが立ち上げてくれるんです!

それではインストールの仕方と設定方法を書いていきます。
・用意するもの
Dockerがインストールされた環境のみ。
もし、DockerがインストールされていなければMacでDockerを動かすでインストールしてみてください。

・まずはDockerを使ってcentosを起動
$ docker run -i -t centos /bin/bash

・続いて、とりあえずサーバを最新化します
$ yum update

・Monitのインストール
$ rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
$ rpm -ivh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
$ yum install --enablerepo=rpmforge monit

・Apacheのインストール
$ yum install httpd
・index.html作成
$ echo test > /var/www/html/index.html

・一旦、centosをコミットしておく(ここは飛ばしてもOK)
$ exit
上記で、Dockerから抜ける。
$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 20cafcb9639e        centos:6.4          /bin/bash           3 days ago          Exit 0                                  grave_shockley       
$ docker commit 20c ak220/centos 
・コミット確認
$ docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
 ak220/centos        latest              d83459021df6        3 days ago          668 MB 
commitしたimageが存在することを確認。
・commitした状態の続きを操作するの
$ docker run -i -t ak220/centos /bin/bash

・Monitの設定
$ vi /etc/monit.conf 
変更項目は下記
変更前
set httpd port 2812 and
    use address localhost
    allow localhost
    allow admin:monit
    allow @monit
    allow @users readonly
変更後
set httpd port 2812 and
    use address 0.0.0.0
    allow admin:monit
続いて、MonitにApacheを監視させる。
$ vi /etc/monit.d/httpd.conf
check process httpd with pidfile /var/run/httpd.pid
    start program = "/etc/init.d/httpd start" with timeout 60 seconds
    stop program  = "/etc/init.d/httpd stop"
    if failed port 80 protocol http
    then restart
    group apache

・Monitの設定ファイルが正しいかを確認
$ monit -t
Control file syntax OK #と表示されればOK

・Monit起動
$ service monit start
Starting monit: Starting monit daemon with http interface at [0.0.0.0:2812]
                                                           [  OK  ]
もし「/etc/init.d/monit: line 18: /etc/sysconfig/network: No such file or directory」というエラーがでたら、下記のコマンドを実行して下さい。
$ touch /etc/sysconfig/network
Apacheが起動していることを確認する。ApacheのプロセスがあればOK。
$ ps -ef | grep httpd
root        53     1  0 14:10 ?        00:00:00 /usr/sbin/httpd
apache      55    53  0 14:10 ?        00:00:00 /usr/sbin/httpd
apache      56    53  0 14:10 ?        00:00:00 /usr/sbin/httpd
apache      57    53  0 14:10 ?        00:00:00 /usr/sbin/httpd
ここまでできたら、Dockerから抜けます。
$ exit


・構築したコンテナをコミットして、Monitを起動
$ docker ps -l
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS               NAMES
d99e2f8dc5bc        ak220/centos:latest   /bin/bash           3 days ago          Exit 0                                  hungry_engelbart    
$ docker commit d99e2f ak220/centos
Dockerで構築したimageをコミットしたので、このイメージをRunさせるときにMonitのプロセスを実行します。
ついでに、localhost:10080をDockerのCentOSで稼働しているApacheの80番ポートに紐付けます。
$ docker run -d -t -p 10080:80 -p 12812:2812 ak220/centos /usr/bin/monit -I

で、http://localhost:10080にアクセスすると、、、ん、見れない。EC2上ではうまく行ったのに・・・。
だいぶ困った。同じ設定なのに。
EC2上とMac上でのDockerの起動の違いはMacではboot2docker上でDockerが起動していること。VirtualBoxのポートフォワードが犯人でした。
ということで、boot2dockerの設定をします。
$ ./boot2docker stop
$ for i in {49000..49900}; do
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";
done
$ ./boot2docker start
$ docker run -d -t -p 49080:80 -p 49812:2812 ak220/centos /usr/bin/monit -I
http://localhost:49080/
で「test」っていう文字がブラウザに表示されたらOK。(このtestはecho text > /var/www/html/index.htmlで書き込んだやつ)
・Monitの管理画面
http://localhost:49812/
これでMonitの管理画面が見れます。プロセスの停止、起動が出来たりします。

VirtualBoxのポートフォワードにははめられました。みなさん気をつけて下さい。

2010年3月15日月曜日

バーチャルホストの設定

1つのサーバで2つ以上ドメインを使いたいと思うことがあると思います!

そんな時に使うのがApacheのバーチャルホストです。

使い方は簡単で、下記の記述をhttpd.confに記述します。
NameVirtualHost *:80
<VirtualHost *:80>
ServerName xxxxx
DocumentRoot "/opt/xxxx"
</VirtualHost>

<VirtualHost *:80>
ServerName hogehoge
DocumentRoot "/opt/hoge"
</VirtualHost>


ドメインがServerNameに一致する場合、その中に記述されている内容が適用されます。
今回で言うと、ServerNameによってDocumentRootが変わります。

詳しくは
http://httpd.apache.org/docs/2.2/ja/vhosts/examples.html
を見るといいかもしれません。

2010年2月28日日曜日

PukiWikiのインストール

pukiwikiはPHPで出来ているため、PHPをインストールする必要があります。

■PHPのインストール
PHPをインストールするためには、Flexとlibxml2 が必要です。
まずはこれらをインストールしてしまいましょう!
$ yum -y install flex libxml2-devel


PHPの最新版を取得し、インストールして行きます。
$ cd /opt/local/src/
$ wget http://www.php.net/get/php-5.3.1.tar.gz/from/jp.php.net/mirror
$ tar zxvf php-5.3.1.tar.gz
$ cd php-5.3.1
$ ./configure --prefix=/opt/local/php --enable-mbstring --with-apxs2=/opt/local/apache/bin/apxs
$ make
$ make install


Apacheのhttpd.confに下記設定が追加されていることを確認する。追加されていなかったら追加してください。
LoadModule php5_module modules/libphp5.so


index.phpをDirectoryIndexに登録します。
すでにindex.htmlという記述があるので、その後に"index.php"を追記してください
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>


続いて、*.php,*.phtmlをPHPファイルとして認識させるために
"IfModule mime_module"内に下記記述を追記してください
<IfModule mime_module>
・・・・
AddType application/x-httpd-php .php .phtml
</IfModule>


これで、PHPの設定が終わったのでApacheの設定ファイルのテストをしてみましょう!
$ ./bin/apachectl configtest
httpd: Syntax error on line 100 of /opt/local/apache/conf/httpd.conf: Cannot load /opt/local/apache/modules/libphp5.so into server: /opt/local/apache/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied

きっと、このようなエラーメッセージがでるはずです。
(でなければ、インストールが終わっているので飛ばしてください)
このエラーはSELinuxが邪魔をしているのため出ています。
特にSELinuxは使わないのであれば、下記設定を行い再起動すれば解決できます。
$ vi /etc/sysconfig/selinux
SELINUX=enforcing

SELINUX=disabled
$ reboot


サーバが起動したらApacheを起動しましょう!
$ cd /opt/local/apache
$ ./bin/apachectl configtest
Syntax OK
$ ./bin/apachectl start


■pukiwikiのインストール
pukiwikiホームページよりutf-8バージョンの最新をダウンロード。
$ cd /opt/local/apache/htdocs
$ wget "http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fpukiwiki%2F12957%2Fpukiwiki-1.4.7_notb_utf8.zip"
$ unzip pukiwiki-1.4.7_notb_utf8.zip
$ mv pukiwiki-1.4.7_notb_utf8 wiki

これで下記URLにてpukiwikiのページが表示されるはずです。
http://192.168.1.xx/wiki/

もし表示できなかった場合は、pukiwiki関連のファイル、ディレクトリのパーミッションを正しく設定してください。

pukiwikiの詳しい設定は
pukiwikiのインストール手順ページで確認してください

■Basic認証
pukiwikiを公開すると、誰でも編集できてしまいます。
pukiwikiの認証を使ってもいいのですが、今回はApacheのBasic認証を使用してみましょう!
$ mkdir -p /opt/local/apache/conf/basic/
$ cd /opt/local/apache/bin
// ./htpasswd -c パスワードファイル 認証ID
$ ./htpasswd -c /opt/local/apache/conf/basic/wiki_auth aa
New password:
Re-type new password:
Adding password for user aa

これで認証用の設定ファイルの作成が完了しました!

では、Apacheの設定をします!
下記記述をApacheのhttpd.confの一番最後にでも追加してください。
<Directory "/opt/local/apache/htdocs/wiki">
AuthType Basic
AuthName "aa"
AuthUserFile /opt/local/apache/conf/basic/wiki_auth
Require user aa
</Directory>


追記したら、Apacheを再起動しましょう!
$ ./apachectl configtest
Syntax OK
$ ./apachectl restart


それでは、wikiのページにアクセスしてみてください!
きっと、認証を求められるハズです!

ApacheとTomcatの連携

mod_proxy_ajpを使用してTomcatとApacheの連携をします。

■前提条件
Tomcatのインストールが終わっていること
今回は、
Tomcatのインストール
Apacheのインストール
にてインストールしたものを使います。

■mod_proxy系のインストール
前回Apacheをインストールした時に、mod_proxy系はインストールしませんでした。
よって、mod_proxy系のモジュールのインストールを行います。(DSOを使います)
(インストール済みの人は飛ばしてください)

mod_proxy系のコンパイル
$ cd /opt/local/src/httpd-2.2.14/modules/proxy
$ /opt/local/apache/bin/apxs -i -c mod_proxy.c proxy_util.c
$ /opt/local/apache/bin/apxs -i -c mod_proxy_http.c proxy_util.c
$ /opt/local/apache/bin/apxs -i -c mod_proxy_ajp.c ajp*.c


ファイルが作成されている事を確認してください
$ ls -ltr /opt/local/apache/modules/mod_proxy*


httpd.confに下記記述を足してmod_proxy_ajpを使えるようにしてください
$ su -
$ vi /opt/local/apache/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so


ちゃんと組み込めたかを確認する
$ cd /opt/local/apache/bin
$ ./apachectl configtest
Syntax OK

"Syntax OK"と表示されればOKです!
これで、Apacheへの組み込みが終了しました。

■TomcatとApacheの連携
まずはTomcatの設定を見ます。
$TOMCAT_HOME/conf/server.xml
の"AJP/1.3"の部分のポート番号を見つけてください。
<!-- Define an AJP 1.3 Connector on port 8009 -->
<connector port="8009" protocol="AJP/1.3" redirectport="8443">
</connector>

今回はデフォルトの8009ポートです。

ではApacheとの連携を行います。

下記設定ファイルを作成します。
$ su -
$ cd /opt/local/apache/conf/extra
$ vi httpd-proxy.conf
<Location /examples/>
ProxyPass ajp://localhost:8009/examples/
</location>


この作成した設定ファイルをApacheに読み込ませる必要があるので、下記1文を最終行にでも書いてください。
$ su -
$ cd /opt/local/apache/conf
$ vi httpd.conf
Include conf/extra/httpd-proxy.conf


設定が終わったので、エラーがないかを確認しましょう!
$ su -
$ cd /opt/local/apache/bin
$ ./apachectl configtest
Syntax OK

"Syntax OK"とでればOKです!

Apacheを再起動してみましょう!
$ su -
$ cd /opt/local/apache/bin
$ ./apachectl restart


Tomcatが起動していることを確認して自分のWEBサーバにアクセスしてください。
http://192.168.1.xx/examples/

画面が見れたら、ApacheとTomcatの連携ができました!
※URLの最後に"/"を入れないと、ちゃんとマッピングしてくれません
※最後の"/"がなくてもいいように素るにはRewriteルールなどを使ってやってみてください

本当にApacheを経由しているか確認したければ、下記ファイルを見てリクエストがきた事を確認してください。
$ cd /opt/local/apache/logs
$ cat access_log

2010年2月27日土曜日

Apacheのインストール

いろいろと紹介する前に、基本のApacheの設定を書いておきます。

■前提条件
・OS
CentOS5.3
(別にFedoraでもいいです。RedHat系が好きです)
・インストール場所
/opt/local/apache

■ソースダウンロード
・Apacheホームページ
http://httpd.apache.org
downloadページへいって"Unix Source"を取得します

■インストール方法
$ su -
$ cd /opt/local/src
$ wget http://ftp.riken.jp/net/apache/httpd/httpd-2.2.14.tar.gz
$ tar zxvf httpd-2.2.14.tar.gz
$ cd httpd-2.2.14
$ ./configure --enable-mods-shared=most --enable-so --enable-rewrite=shared --prefix=/opt/local/apache
$ make
$ make install

これでApacheのインストールは終了です。
ちなみに、configureのログは下記で見れます
$ cat /opt/local/src/httpd-2.2.14/config.log


では、Apacheを起動してみましょう!
$ cd /opt/local/apache
$ ./bin/apachectl start

公開出来ているでしょうか?
IP確認しましょう!
$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 01:30:1B:BD:7A:E5
inet addr:192.168.1.13 Bcast:192.168.1.255 Mask:255.255.255.0

では、私のApacheをインストールしたマシンは192.168.1.13ということがわかったので
http://192.168.1.13/
をブラウザのURLに入力しましょう!

きっと、ファイヤーウォールを有効にしている場合はアクセス出来ないと思います。

■ファイヤーウォールの設定
Apacheの使用する80番ポートを開放します。
(Apacheのポート番号は$APACHE_HOME/conf/httpd.confに"Listen 80"こんな風に書いてあります)
下記手順でiptablesに1文を追加してください。
$ cd /etc/sysconfig/
$ vi iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

これで、設定ファイルの修正が終わりました。
これだけだと、設定ファイルを修正をしただけなので、ファイヤーウォールの再起動をします。
$ /etc/rc.d/init.d/iptables restart
ファイアウォールルールを適用中: [ OK ]
チェインポリシーを ACCEPT に設定中filter [ OK ]
iptables モジュールを取り外し中 [ OK ]
iptables ファイアウォールルールを適用中: [ OK ]
iptables モジュールを読み込み中ip_conntrack_netbios_ns [ OK ]

では、先程のURLを入力してみましょう!
画面に"It works!"と表示されると思います!


これで、Apacheのインストール終了です。

■外部公開
これまでの設定だと、家の中(イントラ環境)からしかアクセスできません。
外から(職場とか、学校とか)見れるようにするためには、ルータの設定をする必要があります。

今回は、固定IPを持っていない動的IP環境での設定を記述します。
(固定IPを持っていても、この設定でいけますが)

動的IPとは、接続する度にIPアドレスが変化するモノをいいます。
通常のプロバイダ契約だと、動的IPになっていると思います。

IPが動的に変わるのに、どうやって自分のサイトにアクセスするんだよ?
って感じると思いますが、世の中にはダイナミックDNS(以下、DDNSとする)というサービスを提供してくれている人がいます。
今回はこのサービスで、しかも無料のものを使って設定したいと思います。

DDNSについて詳しく知りたければ、ググってください。

ちなみに、私は"Dynamic DO!.jp"様のサイトを利用させていただいています。
なので、以下の説明も"Dynamic DO!.jp"の設定になります。

まずは、サイトにてドメインを取得してください。
このドメインと、自宅のIPを常にマッピングし続ける必要があります。
マッピング自体はDDNSにてやってもらえますが、自宅のIPアドレスを定期的に教えてあげる必要があります。

そのため、この様なシェルを作りましょう!
※"Dynamic DO!.jp"用の設定になるので、他のサービスを利用している場合は、別の方法でやってください。
※/home/apahe/binにシェルを置いた場合の設定です。

cd /home/apache/bin
vi ddns.sh
#!/bin/bash

HOME="/home/apache"

cd $HOME/bin
source ../.bashrc

wget -O - 'http://free.ddo.jp/dnsupdate.php?dn=ドメイン名&pw=パスワード'


このシェルを定期的に実行することによって、ドメインと、このリクエストを飛ばしたIP(要するに自宅のIP)をマッピングしてもらえます。

定期的に、自分でこのシェルを実行してもいいのですが、寝ているあいだとかは無理なのでcron登録しましょう。
下記コマンドを実行し、下記1文を記述しましょう!
$ crontab -e
*/20 * * * * /home/apache/bin/ddns.sh >/dev/null 2>&1


これで、20分毎にこのシェルを実行してもらえます!

以上がDDNSの設定になります。

ただ、これで終わりではありません!

これだけだと、きっと自宅のルータに邪魔をされています。
ファイヤーウォールの設定と同じように、ルータにもポートフィルタリング機能があるため、ルータの80番ポートも開放する必要があります。

この設定自体はルータによって違うので、説明書を読んでみてください。
普通は(192.168.1.1とか192.168.0.1)にブラウザからアクセスするとできると思います。

基本的には、80番ポートへのアクセスを、内部のIPアドレス(今回で言うと192.168.1.13)の80番ポートにマッピングします。
この設定はGUI上でできるので、簡単にできると思います。

これで、外部から自宅のWEBサーバへアクセスすることができます!
外に出て、登録したドメイン名でアクセスしてみましょう!
(めんどくさかったら携帯電話からアクセスしてみてください)