シェルスクリプトの特殊な値
メモ
- $0 => 起動スクリプト名(ファイル名)を表示
- $1 => スクリプト実行時の1つ目の引数を表示
- $2 => スクリプト実行時の2つ目の引数を表示
- ${10} => スクリプト実行時の10個目移行の引数を表示
- $@ => 引数全部を配列形式で表示
- $# => 引数の数を表示
ELASTIC LOAD BALANCERS(ELB)経由を使った場合のリクエスト元を取得する
Apacheのログフォーマットの形式についてもあまり知らなかったからログフォーマットの学習もかねてみた。
特にログフォーマットとか気にせずロードバランサー経由でも アクセス元のIPを表示したい場合は以下の参考にしたURLでも紹介している ELB配下のEC2アクセスログについてあれこれの最初に書かれている以下のコードを書けば良い。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined ↓ #このように変更 LogFormat "%h %l %u %t %D \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %{X-Forwarded-For}i %{X-Forwarded-Proto}i" combined
上記のように変更するとそれぞれのパラメータは以下のようになる。 Apache モジュール mod_log_configを参照するともっと理解できる思う
リクエストURL : http://example.com/index.php
- %h ・・・ ELBのIPが表示される
- %l ・・・ 「-」
- %u ・・・ 「-」
- %t ・・・ [15/Dec/2012:20:25:40 +0900]
- %D ・・・リクエストを処理するのにかかった時間、マイクロ秒単位
- %r ・・・ GET /index.php?=PHP~~(文字列) HTTP/1.1
- %s ・・・ ステータス(例200) ( 最後のステータスは %>s )
- %b ・・・ 「レスポンスのバイト数(例2130)」
- %{Referer}i ・・・リクエストURL(例 : http://example.com/)
- %{User-Agent}i ・・・ユーザーエージェント(例 : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/522.21 (KHTML, like Gecko) Chrome/23.0.1111.90)
- %{X-Forwarded-For}i ・・・ アクセス元IP(例 : 111.11.111.11)
- %{X-Forwarded-Proto}i ・・・ プロトコル(例 : http)
参考にしたURL
AWS Elastic Beanstalkをコマンドラインから作成してアップロードまで
AWS Elastic Beanstalkとは
Elastic Beanstalk(以下,EB)はHerokuや、phpfogのようなPaaSの一つ。
サーバーに関して知識が無くてもブラウザのGUIコンソールから
アクセスが増えたときはサーバーを増やして対応するなど設定次第で
自動でスケールアウト出来るから色々お手軽にサービスを提供できる。
EBにコマンドラインツールを使ってアップしてRailsでデプロイすることが書かれている
記事もあり、Railsでやってみたい方は以下の記事を参考にすると良いと思う。
AWS Elastic Beanstalk と Rails で Hello World してみる【11日目】
基本的に以下のURLを一通りやれば良いだけ
http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/command-reference-get-started.html
EBは以下のように色々な言語に対応しているが今回はPHPを選択した。
しかし最初はほとんどコマンドだけで言語とかあまり関係なく
ただサーバーを立ち上げたときデフォルトでPHPの環境が出来ているだけ
だと思うので直接サーバーをいじる事が出来ればあまり気にしなくて良いと思う。
(間違っていたらごめんなさい)
実行環境
Mac OSX 10.8
AWS Elastic Beanstalk Command Line Toolを使えるようにする
とりあえずさっきも書いたAWS Elastic Beanstalk Command Line Toolからzip形式であるAWS Elastic Beanstalk Command Line Toolをダウンロードする。
ダウンロードしたzipファイルをとりあえず適当なところに置く。
自分は「~/.aws」というディレクトリを作ってそこにzipファイルを置いて
ターミナルから以下のようにして解凍
$ unzip <ダウンロードしたファイル.zip>
解凍したあとはEBをコマンドで使えるようにするために使う「eb」コマンドまでの
パスを環境変数に保存。
ちなみに
ここでは
$ export PATH=$PATH:<path to unzipped EB CLI package>/eb/linux/python2.7/
ここまでやれば「eb」コマンドが使えるようになっている。
デプロイ ~Hello, EB~を表示させる
とりあえず作業ディレクトリを作ってgitレポジトリを作る。
$ mkdir EB $ cd EB $ git init
ここで先ほどダウンロードして解凍したAWS DevToolsの中に入っている
AWSDevTools-RepositorySetup.shを実行する。
これはgitにaws用に拡張をつけるもので最終的にgit aws.pushでEBにpushする。
参考URL
http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/GettingStarted.GetSetup-devtools.html
EBディレクトリ
$ sh <path to unzipped EB CLI package>/AWSDevTools/Linux/AWSDevTools-RepositorySetup.sh
次にEBの環境を作る。
$ eb init
上記を行うと以下の事が対話形式で聞かれるので
自分の環境にあったもの、構築するものを選択する。
聞かれる内容
- AWS Access Key ID
- AWS Secret Access Key
- Available service regions are(自分の使っているリージョン)
- AWS Elastic Beanstalk application name(特に名前を気にしなくてよいならそのままEnterして大丈夫, ディレクトリ名がデフォルトでつく)
- AWS Elastic Beanstalk environment name(特に名前を気にしなくてよいならそのままEnterして大丈夫, 「ディレクトリ名-env」がデフォルトでつく)
- Available solution stacks are:(今回は64bit Amazon Linux running PHP 5.3を選択)
上記の処理を終えたら以下のコマンドを実行するとEC2インスタンスが作成されたり
色々処理が始まりデプロイされる。
$ eb start
以下のコマンドで表示されるものの中にURLがあるので、
それをブラウザに入力するとページがデフォルトで用意されているページがブラウザに表示される。
$ eb status --verbose
index.phpでファイルを作る
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>Hello, <?php echo 'EB'; ?></h1> </body> </html>
その後git add, git commit
ファイルを作ったら以下のようにしてEBにpushして
同じページをリロードするとさっきのファイルが表示される。
$ git aws.push
cronからだと環境変数の値が期待通りに返ってこない
メモ
はじめの方に「export $PATH」的なことをやったらうまくいった
コマンドから実行するとexample.sh内で定義している
変数current_dirにはそのファイル自身(example.sh)があるディレクトリまでのパスを取得できる。
$ sh example.sh
#example.sh current_dir=$PWD
しかしcrontab -eから実行するとrootユーザーで実行した場合
$PWDは/rootが表示される。
解決法としてdirnameコマンドを使ってファイルまでのパスを取得するようにした。
ちなみにシェルスクリプト内で自分自身のファイル名は「$0」で取得できる。
cronで実行された example.sh
#example.sh current_dir=`dirname $0`
他にも色々と参考にした記事をみると、相対パスで色々処理したい場合cdで移動して
目的のファイルまで移動して処理するのが良いみたい。
絶対パスを使えば関係ないけど。