[Apache] 最新版のインストール, mod_rewrite その1

意外に知らないことが多かったので、適当に調べてメモしておく。
.htaccessではなく、confファイルへの記述であることに注意。
なお、本環境は CentOS 6.4をminimalインストールし、ネットワーク設定完了後から始めている。


Apacheのインストール


デフォルトのApacheは 2.2.15 なので、 2.2系の最新をインストールする。
コンパイルとかして、rpm作ってもいいけど、動作実績がある、外部リポジトリの追加のほうが楽なので
そちらで対応


CentALTリポジトリの追加


epel に依存しているようなので、epel, CentALTをインストールする


yum install wget
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
wget http://centos.alt.ru/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm
rpm -ivh centalt-release-6-1.noarch.rpm

なお、最新のcentalt-release-6-*.noarch.rpmはここより探す


それぞれ、enabled=1になっているので、enabled=0にする


sed -ie "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo
sed -ie "s/enabled=1/enabled=0/g" /etc/yum.repos.d/centalt.repo

Apacheのインストール


enablerepo=CentALTとしてインストール


yum install httpd --enablerepo=CentALT

Apacheの設定


今回は検証用なので、デフォルトをベースに適当に設定。


cd /etc/httpd/conf/
mv httpd.conf httpd.conf.org
wget -O httpd.conf http://namakesugi.web.fc2.com/httpd.conf.txt
cd ../conf.d
mkdir org
mv *.conf org/
mv README org/
cd /var/www
mkdir org
mv cgi-bin/ org/
mv error/ org/
mv icons/ org

検証用のファイルの設置


mkdir -p /var/www/dummy
echo "dummy" > /var/www/dummy/index.html
echo "example.com" > /var/www/html/index.html

wwwへのリライト


基本的な使い方で、wwwなしをwwwありへリライトする場合


vi /etc/httpd/conf.d/httpd-vhosts.conf

NameVirtualhost *:80

<VirtualHost *:80>
ServerName dummy.example.com
DocumentRoot /var/www/dummy
</VirtualHost>

<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com$1 [R=301,L]
</VirtualHost>

wwwありへのリダイレクトの説明


RewriteCondで RewriteRuleを適用するための条件を指定している。
この場合は, HTTP_HOSTが example.comで始まる場合は、その下のRewriteRuleを適用するという意味となる。


RewriteRuleは (.*)にマッチするリクエストであれば、(ようするに全部のリクエスト)は
www.example.com$1へ301リダイレクトさせるという意味。
つまり、http://example.com/foo/bar へのアクセスは、 http://www.example.com/foo/barへ301リダイレクトされる。


ここで、$1 には `/foo/bar` が設定される。
最後の `R=301`は 301リダイレクトを意味する。


なお、301リダイレクトの場合は、
Google等のインデックスにexample.comのドメインの掲載されなくなり、www.example.comのドメインのみとなる。

ここを`R=302`とすると302リダイレクトとなり、インデックスの中身はwww.example.comだが、URLのドメイン自体はexample.comで掲載される。


メンテナンス表示用のリライト


ここを参考にしている。


example.comへアクセスされた際に、メンテナンス表示をするリライトルールの書き方。
なお、このように書いておくと、Google等がクロールしてきても、インデックスされなくなり、安全。
※もし、200レスポンスでメンテナンス表示を返却してしまった場合は、メンテナンス表示の内容がインデックスされてしまい、掲載順位とか色々おかしくなる。


cat "maintenance" > /var/www/html/maintenance.html

vi /etc/httpd/conf.d/httpd-vhosts.conf

<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/html
ErrorDocument 503 /maintenance.html

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com$1 [R=301,L]

RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^ - [R=503,L]
</VirtualHost>

なお、引用元では、IPアドレスベースで指定されたIPアドレスからのアクセスの場合はメンテナンス画面を表示しないようにしていたりする。


リクエスト先のURIがが /maintenance.html でなければ、503リダイレクトをする
という意味となる。
ここで、ErrorDocument 503 /maintenance.html と指定してあるため、
Apacheがすべてのリクエストのレスポンスとして /var/www/html/maintenance.html を返すようになる。


curlを使うと以下の様なレスポンスとなる。


curl -v http://www.example.com/
< HTTP/1.1 503 Service Temporarily Unavailable
< Date: Sat, 04 May 2013 17:37:34 GMT
< Server: Apache
< X-Frame-Options: SAMEORIGIN
< Last-Modified: Sat, 04 May 2013 17:21:22 GMT
< Accept-Ranges: bytes
< Content-Length: 12
< Connection: close
< Content-Type: text/html; charset=UTF-8
<
maintenance

RewriteRuleの`Lオプション`について


wwwあり、なしの統一及びメンテナンス表示用のリライトの記述の仕方を試したが、
以下のようにした場合と、もとの場合でどう違うのかを調べてみる。


  RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com$1 [R=301] # Lオプションを除去

RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^ - [R=503,L]

curlを使ってLオプションのあり、なしにおけるLocaitionヘッダーの中身は以下のようになる。


# Lオプションありの場合
curl -v http://example.com
> HTTP/1.1 301 Moved Permanently
> Location: http://www.example.com/

# Lオプション無しの場合
> HTTP/1.1 301 Moved Permanently
> Location: http://www.example.com/maintenance.html

どちらも301リダイレクトとなっているが、リダイレクト先が Lオプション無しの場合は
http://www.example.com/maintenance.htmlとなってしまっている。


次回はより複雑な設定について

スポンサーサイト

[CentOS6]リポジトリ追加

CentOS6 における各種リポジトリ追加メモ


epel repository


追加リポジトリを入れる際に、依存となっている事が多いリポジトリ


CentOS 6 64bitの場合


rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm

CentOS 6 32bitの場合


rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm

デフォルトでは使わないようにする


vi /etc/yum.repos.d/epel.repo

enabled=1となっているところを以下のように0にする


enabled=0

iuscommunity repository


PHP5.4系を使いたい場合はiusを追加するのが簡単。
MySQL5.5系、Pythonは3.2系がインストール可能。
epelに依存しているので、epelリポジトリを追加後にやること。


CentOS 6 64bitの場合


rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/ius-release-1.0-10.ius.el6.noarch.rpm

CentOS 6 32bitの場合


rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/i386/ius-release-1.0-10.ius.el6.noarch.rpm

デフォルトでは使わないようにする


vi /etc/yum.repos.d/ius.repo

enabled=1となっているところを以下のように0にする


enabled=0

remi repository


MySQL5.5系、PHP5.3系を入れる場合に使う。(iusでも十分だが)


CentOS 6 64bitの場合


rpm -ivh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6-1.el6.remi.noarch.rpm

CentOS 6 32bitの場合


rpm -ivh http://rpms.famillecollet.com/enterprise/6/remi/i386/remi-release-6-1.el6.remi.noarch.rpm

デフォルトでは使わないようにする


vi /etc/yum.repos.d/remi.repo

enabled=1となっているところを以下のように0にする
(おそらく初期状態でなっているはず)


enabled=0

各種インストールメモ


PHP5.4系の追加


yum --enablerepo=ius install php54 php54-mbstring

PHP5.4系の各種ライブラリの検索


yum --enablerepo=ius search php54

mcryptとか、mbstringとか、mysql, gdとか見つかるはず


MySQL 5.5系の追加


iusの場合
iusの場合はmysql55という名前になっている。


yum --enablerepo=ius install mysql55-server mysql55-devel

remiの場合


yum --enablerepo=remi install mysql-server mysql-devel

Python3.2系


yum --enablerepo=ius install python32

使い方

# python --version
Python 2.6.6

iusでいれたPython3.2


# python3 --version
Python 3.2.3

memcached


OS標準でもmemcachedはインストール可能。
しかし、remiを使ったほうが若干新しい
※執筆時点でbaseだと 1.4.4-3, remiだと1.4.15-2


yum --enablerepo=remi install memcached

redis


epelでも入るが、remiのほうがバージョンが新しい。
※執筆時点ではepelだと2.4.10-1, remiだと2.6.7-1


yum --enablerepo=remi,epel install redis

依存パッケージがepelにあるので、epelもenablerepoに追加すること。
--enablerepo=remiだけだとインストール出来ない


mongoDB


epelでも入るが、2.0系なので、mongoDBの公式を参考にmongo10genのリポジトリ追加をするのが無難
mongo10gen


Hadoop


こちらはcdh3を使うと良い。
一応本家の手順通りに


cd /tmp
wget http://archive.cloudera.com/redhat/6/x86_64/cdh/cdh3-repository-1.0-1.noarch.rpm
yum --nogpgcheck localinstall cdh3-repository-1.0-1.noarch.rpm

vi /etc/yum.repos.d/cloudera-cdh3.repo

以下を追加


enabled=0

初めて触る人は、Pseudo-Distributed Modeをインストールすればいろいろ簡単に試せる。


yum --enablerepo=cloudera-cdh3 install hadoop-0.20-conf-pseudo

Hadoop徹底入門

分散オブジェクトストレージシステム「STF」をインストールしてみたよ [導入編]

STFを動作させる


いよいよlivedoorさんのSTFをインストールし、動作させてみたいと思います
とりあえずのゴールはSTFのdispatcherに対してHTTPリクエストを送り、オブジェクトを保存できるようにすることと、管理画面が見えるようになることです


なお、インストール先は(推奨場所とかがよくわからないので)、/var/www/以下としてします
また、ミドルウェア(MySQL5.1 with Q4M, Memchached, Perlbrew等)のインストールについてはこちらをご参照ください
※Nginxのインストールを上記でしていますが、今回は使いません


STFのダウンロードとcpanmによる依存ライブラリのインストール


cd /var/www
git clone git://github.com/stf-storage/stf.git
cd stf
cpanm --installdeps .

これまたすごく時間がかかります


DBD-mysql-4.020がFailでると思いますので、以下のように修正します


Fetching http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.020.tar.gz ... OK
==> Found dependencies: DBI
--> Working on DBI
Fetching http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.616.tar.gz ... OK
Configuring DBI-1.616 ... OK
Building and testing DBI-1.616 ... OK
Successfully installed DBI-1.616
Configuring DBD-mysql-4.020 ... OK
Building and testing DBD-mysql-4.020 ... FAIL
! Installing DBD::mysql failed. See /root/.cpanm/build.log for details.
! Bailing out the installation for Test-mysqld-0.14. Retry with --prompt or --force.

cpanm --prompt --installdeps .

以下のように表示されますのでlを入力します


Configuring DBD-mysql-4.020 ... OK
Building and testing DBD-mysql-4.020 ... FAIL
Testing DBD-mysql-4.020 failed.
You can s)kip, r)etry, f)orce install, e)xamine build log, or l)ook ? [s] l

以下のようにDBD-mysql-4.020のworkingディレクトリに移動しますので
mysql.xsを修正します


Entering /root/.cpanm/work/1325356336.7830/DBD-mysql-4.020 with /bin/bash
# vi mysql.xs

以下の箇所を修正します(899行目)


using_322=is_prefix(mysql_get_server_info(imp_dbh->pmysql),"3.22");

修正後


using_322 = ((strncmp(mysql_get_server_info(imp_dbh->pmysql),"3.22",4) == 0) ? 1 : 0 );

make && make test && make installを実行してインストールします
再度STFのホームディレクトリへ移動し、cpanm --installdeps .を実行します
以下のように出ればOKです


# cpanm --installdeps .
--> Working on .
Configuring /var/www/stf ... OK
<== Installed dependencies for .. Finishing.

なお、Plack::Middleware::Reproxyがfailになることがあるようですが、再度実行すればきちんと入るようです


参考: http://dqn.sakusakutto.jp/2011/09/perl_dbdmysql_is_prefix.html


STF用のデータベースの作成


Q4M用にインストールしたMySQL5.1上にデータベースを作成します


/usr/local/q4m/bin/mysql -uroot

stfとstf_queueというデータベースを作成します


create database stf default character set utf8;
create database stf_queue default character set utf8;

stf用のテーブルを定義します


/usr/local/q4m/bin/mysql -uroot stf < /var/www/stf/misc/stf.sql

stf_queue用のテーブルを定義します
※q4m用のMySQLの場合は、FUNCTIONの定義等が完了しているようなので
sqlの上の部分を以下のようにコメントアウトします


vi /var/www/stf/misc/stf_q4m.sql

#INSTALL PLUGIN queue SONAME 'libqueue_engine.so';
#CREATE FUNCTION queue_wait RETURNS INT SONAME 'libqueue_engine.so';
#CREATE FUNCTION queue_end RETURNS INT SONAME 'libqueue_engine.so';
#CREATE FUNCTION queue_abort RETURNS INT SONAME 'libqueue_engine.so';
#CREATE FUNCTION queue_rowid RETURNS INT SONAME 'libqueue_engine.so';
#CREATE FUNCTION queue_set_srcid RETURNS INT SONAME 'libqueue_engine.so';
#CREATE FUNCTION queue_compact RETURNS INT SONAME 'libqueue_engine.so';

最後にsqlを流し込みます


/usr/local/q4m/bin/mysql -uroot stf_queue < /var/www/stf/misc/stf_q4m.sql

各種アプリケーションの起動


環境変数が多すぎて非常に面倒...
ということで適当にsh化して適当に動かす(まったく綺麗じゃないけど)


以下を適当なディレクトリにenvironment.inc(なんでincにしたのかは知らん)として保存
環境にあわせてコメントアウトの解除と設定の変更をしてください


export STF_HOST_ID=101
export STF_HOME=/var/www/stf
#export STF_QUEUE_TYPE=Schwartz
#export STF_DEBUG=1
#export STF_TIEMR=1

## Nginx
#export STF_NGINX_STYLE_PROXY=1
#export STF_NGINX_STYLE_REPROXY_ACCEL_REDIRECT_URL=/path/to/reproxy
#export USE_PLACK_REPROXY=1

## MySQL
export STF_MYSQL_DSN=dbi:mysql:stf:127.0.0.1:13306
export STF_MYSQL_USERNAME=root
export STF_MYSQL_PASSWORD=''
export STF_QUEUE_DSN=dbi:mysql:dbname=stf_queue:127.0.0.1:13306
export STF_QUEUE_USERNAME=root
export STF_QUEUE_PASSWORD=''

## Storage
# ここは自分でディレクトリを作る(書き込みできること)
export STF_STORAGE_ROOT=/var/www/stf_storage
export STF_STORAGE_PORT=8888

## Admin Interface
export STF_ADMIN_PORT=9000

以下をadmin.shとして保存


#!/bin/sh

. environment.inc
cd $STF_HOME
plackup -p $STF_ADMIN_PORT -a $STF_HOME/etc/admin.psgi

以下をstorage.shとして保存


#!/bin/sh

. environment.inc
cd $STF_HOME
plackup -p $STF_STORAGE_PORT -a $STF_HOME/etc/storage.psgi

以下をdispatcher.shとして保存


#!/bin/sh

. environment.inc
cd $STF_HOME
plackup -a $STF_HOME/etc/dispatcher.psgi

とここまで書いてdispatcher.shのほうにはポート指定がなかったことに気づいたけど
デフォルトの5000でいいやと思ってそのままにする


で最後にshを全部&つけて実行しておしまい
とりあえず動いたっぽいけど、dispatcher動いているのかな。。。
workerを動作させないとなんともよくわからない


Apache設定


管理画面はApacheで稼働させることにしてみます


miscをみるとdispatcher, storage共にApacheのmod_balancerを使っているようですが、
とりあえずは、Dispatcher Proxy等は動作させないでやってみたいと思います


Apacheの設定


virtualhostの設定に以下を追加します
大事なのはDocumentrootをstf/htdocsにすることとproxyの設定のところです


<VirtualHost *:80>
ServerName stf.namakesugi.net
DocumentRoot /var/www/stf/htdocs
<Directory "/var/www/stf/htdocs" >
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

<Location />
Order allow,deny
Allow from all
</Location>

ProxyRequests Off
ProxyPass /static/ !
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
</VirtualHost>

Apacheを再起動させれば、一応Adminの画面が見えるようになります


管理画面は以下から参照できます
http://stf.namakesugi.net/
ID: namakesugi, PW: namakesugi


STFにファイルを格納する


githubのREADME通りにやってみます


bucketという名前のbucketを作成(わかりにくい)
以下を入力した後にCtrl + Dで抜けます(PUTだけど何か送る必要はない)


lwp-request -m PUT http://localhost:5000/bucket

bucketにobjectという名前のobjectを作成
適当に文字を入れて入力完了後にCtrl + Dで抜けます


lwp-request -m PUT http://localhost:5000/bucket/object

ここでは namakesugi[改行].[改行]net[改行][改行]と入れて見ました


bucketのobjectというobjectを取得


lwp-request http://localhost:5000/bucket/object

/var/www/stf_storage(stfのオブジェクトの保存先)に以下のようなファイルができていることを確認
/var/www/stf_storage/x/y/q/v/xyqvxbaphwcsqgtfvbipwugtaqwdog.dat


レプリケーションとかがまだだけどできたっぽいね!
一応上記管理画面からこのファイルがあることを確認できるかと思います
なお、Apache(Nginx)にproxyの設定をすれば、外部からこのSTFにオブジェクトを設置できるようになります


メモ


Dispatcherについて


DB(MySQL)操作ができないといけない
基本的にはデータベースへの書き込み,リクエストされたオブジェクトのURLを返却する
呼び出すのはlib/STF/API以下
lib/STF/Context.pm等を起動時に読み込む


Storageについて


Storage関連の操作をする
実際にファイルの書き込み、返却をするのはこいつ?
HTTP経由で操作可能


Workerについて


Q4M用のデータベースの中身を元に該当の操作用APIをコールする


よくわかっていないところ


オブジェクトを削除した場合はDispatcherは削除対象のobjectをobjectテーブルから削除し
deleted_objectテーブルにobjectテーブルの中身を移す
wokerはqueue_delete_objectテーブル(Queue)を取り出して該当のオブジェクトIDのデータを削除するAPIをコールする(この場合はlib/STF/API/Storage.pmかな?)
ここで,deleted_objectに入っているものをキューに登録するのはどの子なんだろうか、、、
ObjectHealth.pmあたりかな、、、enqueしているのあったし、、、でもrepairは見つけたけど他のはあったのかな
とソースを眺めている最中


STF関連の記事



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。