nginx基本設定

nginxの設定を書いていきます。
nginxっとは軽量で高速で数年前から徐々にシェアをのばしつつwebサーバーです。

インストール

まずインストールなんですが、過去記事に書いたのでそちらの方を見てください。
webサーバー初期設定 - Linux編 - 城好きwebプログラマーの生態メモ - 仕事編

設定

実際に作成したwebアプリ「個人売買掲示板」において使った設定ファイルを使って説明します。
一部見せるとまずい部分があるのでそこは省略、改変してあります。
特定のポートでwebアプリを動かし、nginxをリバースプロキシとしてそのポートに流すということをしています。

設定ファイルの場所なんですが、/etc/nginx/conf.d/以下に.conf拡張子をつけておきます。
特殊な事情がなければ、ドメインごとに設定ファイルを作った方が管理が楽だと思います。
ファイル名も分かりやすくドメイン名を入れて。

# vim /etc/nginx/conf.d/kojinbaibai.bundlebox.jp.conf 

ファイルを開くと中身はこうなってます。

server {
    listen       80;
    server_name  kojinbaibai.bundlebox.jp;

    access_log  /var/log/nginx/kojinbaibai.bundlebox.jp/access.log main;
    error_log   /var/log/nginx/kojinbaibai.bundlebox.jp/error.log;

    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

    client_max_body_size 10M;

    location ~ ^/resource/(.*) {
        alias /var/www/bundlebox/data/kojinbaibai/$1;
    }

    location /static {
        alias /var/www/bundlebox/BundleBoxKojinbaibai/BundleBoxKojinbaibai/root/static;
    }

    location /favicon.ico {
        alias /var/www/bundlebox/BundleBoxKojinbaibai/BundleBoxKojinbaibai/root/favicon.ico;
    }
	
    location / {
        proxy_pass http://127.0.0.1:1234;
    }

1つ1つ説明していきます。

listen       80;
server_name  kojinbaibai.bundlebox.jp;

これは、ポートとドメイン名になります。
ポートは普通のHTTPアクセスなら80です。
ドメイン名は取得したドメイン名を書いてください。

server_name  localhost;

もしこう書いた場合は

# hostname

で設定してあるホスト名になります。


access_log  /var/log/nginx/kojinbaibai.bundlebox.jp/access.log main;
error_log   /var/log/nginx/kojinbaibai.bundlebox.jp/error.log;

アクセスログの場所を指定してあります。
これもドメイン単位で作成しておくといいと思います。


client_max_body_size 10M;

ボディサイズの上限です。
デフォルトでは1Mになっています。
最近はスマホの写メでさえ1Mこえるので、画像、音声、動画などを使う場合は変更しましょう。


location /static {
    alias /var/www/bundlebox/BundleBoxKojinbaibai/BundleBoxKojinbaibai/root/static;
}

特定のパスにアクセスされた場合の処理になります。
上記の例で言うと、http;//kojinbaibai.bundlebox.jp/static/ 以下にアクセスされた場合、
/var/www/bundlebox/BundleBoxKojinbaibai/BundleBoxKojinbaibai/root/static/ 以下の静的ファイルにアクセスするようにしています。

location / {
    proxy_pass http://127.0.0.1:1234;
}

127.0.0.1は自アドレスなので、同じサーバーの1234ポートにアクセスを渡しています。

これらがngixnの基本設定です。
変更後は再起動することによって反映されます。

# /etc/rc.d/init.d/nginx restart


本当はプロキシキャッシュやブラウザ判別などイロイロやってるんですが、そこは別で紹介します。

ハイパフォーマンスHTTPサーバ Nginx入門

ハイパフォーマンスHTTPサーバ Nginx入門

daemontoolsによるwebアプリケーション管理

作成したアプリケーションのデーモンを管理していく方法を紹介します。
アプリケーションだけではなくログ監視ツールなど、デーモン化しないといけないものを管理するのに長けています。

インストール

以前パッケージによるインストール方法は紹介しました。
webサーバー初期設定 - Linux編 - 城好きwebプログラマーの生態メモ - 仕事編

今回はyumによるインストールの仕方を紹介します。
まずyumレポジトリにはデフォルトとして入っていないので追加します。

# wget http://download.opensuse.org/repositories/home:/weberho:/qmailtoaster/CentOS_CentOS-6/home:weberho:qmailtoaster.repo
# mv home\:weberho\:qmailtoaster.repo /etc/yum.repos.d/qmailtoaster.repo

# vim /etc/yum.repos.d/qmailtoaster.repo
enabled=0

あとはインストールするだけです。

# yum install --enablerepo=home_weberho_qmailtoaster daemontools

導入

実際にdaemontoolsの使い方を書いていきます。

まずディレクトリ作成。今回はwebアプリということで/var/www以下に作ります。

# mkdir -p /var/www/daemon/sample_daemon/log/main

実行ファイルを作成します。
実行したい内容なので人それぞれになると思います。
ここでは例としてシェルファイルを起動させています。

# vim /var/www/daemon/sample_daemon/run
#!/bin/sh
exec 2>&1
exec /var/www/sample/Sample/script/sample_production.sh


ログ実行ファイルを作成します。

# vim /var/www/daemon/sample_daemon/log/run
#!/bin/sh
exec 2>&1
exec setuidgid root multilog t ./main

ログファイルは例えば

exec setuidgid root multilog t s5000000 n50 ./main

こんな感じでログファイルの数を操作できます。


あとは実行権限をつけて/service以下にシンボリックリンクを貼ります。

# chmod +x /var/www/daemon/sample_daemon/run /var/www/daemon/sample_daemon/log/run
# mkdir /service
# ln -s /var/www/daemon/sample_daemon /service

/serviceディレクトリ以下にあるすべてのデーモンに対してsuperviseによるデーモンの監視をするためsvscanをかけます

# svscan /service &

サーバー再起動時も起動しておきたい場合は以下を追加してください。

# vim /etc/inittab
SV:123456:respawn:/command/svscanboot    

これで完了です。
以下のコマンドを参考に管理してください。

デーモンの起動

$ svc -u /service/sample_daemon/

デーモンの停止

$ svc -d /service/sample_daemon/

デーモンの再起動

$ svc -t /service/sample_daemon/

perlによるwebアプリケーション作成手順 - Catalyst編 - その2

続きです。

perlによるwebアプリケーション作成手順 - Catalyst編 - その1 - 城好きwebプログラマーの生態メモ - 仕事編

前回はSampleというアプリを作成して試しに起動させるところまで出来ました。
今回はアプリで処理を書き始める前の初期設定を書いていきます。

ログの設定

Catalystの場合は

use Catalyst qw/-Debug/;

こうするとデバッグ用のログが出力されます。
デフォルトでこの設定になってるはずです。
しかし必ずしもデバッグ用のログが必要かといわれればそうではありません。
環境によって変えられるようにしておきます。

$ cd /path/to/Sample
$ vim lib/Sample.pm

ファイルを開くと以下の記述があると思います。

use Catalyst qw/
    -Debug
    ConfigLoader
    Static::Simple
/;

extends 'Catalyst';

__PACKAGE__->setup();

これを以下に書き換えます。

use Catalyst;
extends 'Catalyst';

our @PLUGINS = qw/
    ConfigLoader
    Static::Simple
/;
push @PLUGINS, '-Debug' if $ENV{SAMPLE_DEBUG};

__PACKAGE__->setup(@PLUGINS);

これで環境変数によってデバッグログを出力するかどうか変更できるようになりました。

$ export SAMPLE_DEBUG=1

これでデバッグオン

$ export SAMPLE_DEBUG=0

これでデバッグオフです。

デバッグオフで起動させてみてください。
先ほどとログが違ってると思います。

config設定

こちらもコンフィグファイルを環境によって変えられるようにしましょう。

まずデフォルトで作られてるコンフィグファイルはいらないので削除しちゃいます。

$ rm sample.conf

そして新しく環境別のコンフィグファイルを作ります。
ディレクトリ作成

$ mkdir config

共通

$ vim config/sample.pl
{
    name => "Sample",
}

本番用

$ vim config/sample_production.pl
{
    name => "Sample_production",
}

デバッグ用

$ vim config/sample_debug.pl
{
    name => "Sample_debug",
}

これは共通のファイルを各環境のファイルでオーバーライドする形になります。

$c->config->{name}

と呼び出した場合、デバッグの場合「Sample_debug」、本番では「Sample_production」、その他では「Sample」が取得できます。

次に、実際にコンフィグファイルを呼びだす部分を作成しましょう。

$ vim lib/Sample.pm

ファイルを開くと以下の記述があると思います。

__PACKAGE__->config(
    name => 'Sample',
    # Disable deprecated behavior needed by old applications
    disable_component_resolution_regex_fallback => 1,
    enable_catalyst_header => 1, # Send X-Catalyst header
);

これを以下に書き換えます。

__PACKAGE__->config('Plugin::ConfigLoader' => {
    file                => __PACKAGE__->path_to('config'),
    config_local_suffix => $ENV{SAMPLE_CONFIG_LOCAL_SUFFIX}
});

これで環境変数によってどのコンフィグファイルを呼び出すか変えられるようになりました。

$ export SAMPLE_CONFIG_LOCAL_SUFFIX=debug

これでデバッグ

$ export SAMPLE_CONFIG_LOCAL_SUFFIX=production

これで本番です。

上記で書いたデバッグログをオンにした状態で起動してみましょう。

[debug] Loaded Config "/path/to/Sample/config/sample.pl"
[debug] Loaded Config "/path/to/Sample/config/sample_debug.pl"

こういう記述があると思います。
これでどのコンフィグファイルが呼ばれているか確認できます。

起動スクリプト

環境変数がいっぱいでぐちゃぐちゃになってしまわないように起動スクリプトを作成しましょう。

まずデッバグ用です。

$ vim script/sample_debug.sh
#!/bin/sh

 # パス、ポートを変数に置き換え
APP_ROOT=/path/to/Sample
APP_PORT=8008
EXTLIB_ROOT=/path/to/extlib

 # モジュール呼び出し
eval $(perl -I${EXTLIB_ROOT}/lib/perl5 -Mlocal::lib=${EXTLIB_ROOT})
export PERL5LIB=${APP_ROOT}/lib:${PERL5LIB}

 # 環境変数整え
export SAMPLE_CONFIG_LOCAL_SUFFIX=debug
export SAMPLE_DEBUG=1

cd ${APP_ROOT}

 # 起動
exec \
${EXTLIB_ROOT}/bin/start_server --port ${APP_PORT} -- \
${EXTLIB_ROOT}/bin/plackup \
-s Starlet \
-E production \
--max-workers=1 \
--max-reqs-per-child=50 \
-a ${APP_ROOT}/sample.psgi

次に本番用です。

$ vim script/sample_production.sh
#!/bin/sh

 # パス、ポートを変数に置き換え
APP_ROOT=/var/www/sample/Sample
APP_PORT=8100
EXTLIB_ROOT=/var/www/sample/extlib

 # モジュール呼び出し
eval $(perl -I${EXTLIB_ROOT}/lib/perl5 -Mlocal::lib=${EXTLIB_ROOT})
export PERL5LIB=${APP_ROOT}/lib:${PERL5LIB}

 # 環境変数整え
export SAMPLE_CONFIG_LOCAL_SUFFIX=production
export SAMPLE_DEBUG=0

cd ${APP_ROOT}

 # 起動(ワーカ数は、スペック、付加、アクセス数などをもとに算出)
exec \
${EXTLIB_ROOT}/bin/start_server --port ${APP_PORT} -- \
${EXTLIB_ROOT}/bin/plackup \
-s Starlet \
-E production \
--max-workers=3 \
--max-reqs-per-child=100 \
-a ${APP_ROOT}/sample.psgi

起動スクリプトができたので実行してみます。

$ chmod +x script/sample_debug.sh script/sample_production.sh
$ script/sample_debug.sh
$ script/sample_production.sh

本番の方はエラーでましたか?
あたりまえです。本番のパスの先にはなにもないんですから。


とりあえずこれで初期設定は終了です。
Model、Controllerを作成する下地はできました。
ドンドン開発していきましょう。

次は作成したアプリを永続化してwebサーバーにのせるのですが、これは次回にでも。

新規サービス開始しました

去年末のことになってしまうんですが、会社の仲間と2人でBundleBoxというプロジェクトを開始しました。

第1弾として「個人売買掲示板」

http://kojinbaibai.bundlebox.jp/

自動車、バイク、パーツの個人間での売買を支援するサイトとなってます。

是非ご利用ください。


twitterもつぶやいてます。

https://twitter.com/BundleBox_jp

perlによるwebアプリケーション作成手順 - Catalyst編 - その1

実際にperlでwebアプリケーションを作るにあったての初期の手順を書いていきます。

perlの環境作りは以前書いた、webサーバー初期設定 - perl編 - 城好きwebプログラマーの生態メモ - 仕事編これに基づきます。

今回はフレームワークにCatalystを使います。
数年前からあるメジャーなフレームワークです。

Catalyst + PSGI + Sterlet という環境で起動させます。

まず任意のディレクトリ(今回は/path/toとする)に移動した後にモジュールをインストールするためのディレクトリを作成する。

$ cd /path/to
$ mkdir extlib

なぜローカルにモジュールをインストールするかというと、1つのサーバーで複数のアプリケーションを走らせたいため、別のサーバーに移行しやすくなるためです。

次にCatalystや他の必要なモジュールをインストール。ちょっと時間かかります。

$ cpanm -l extlib Catalyst::Devel local::lib Server::Starter Plack::Handler::Starlet

インストールしたモジュールにパスを通します。

$ export PATH=/path/to/extlib/bin:${PATH}
$ export PERL5LIB=/path/to/extlib/lib/perl5:${PERL5LIB}

アプリを作ります。今回はSampleという名前で。

$ catalyst.pl Sample

これでアプリケションの雛形が作成されました。これで完了です。
実際起動してみましょう。

$ export PERL5LIB=/path/to/Sample/lib:${PERL5LIB}
$ plackup Sample/sample.psgi -p 8008

ポート8008で起動されました。
アクセスしてみると画面が出てるはずです。
出てない場合はたぶんipの設定の問題なので任意のポートをあけるようにしてください。

次にStarletで起動してみます。

start_server --port 8008 -- \
plackup \
-s Starlet \
-E production \
--max-workers=1 \
--max-reqs-per-child=50 \
-a Sample/sample.psgi

またまたポート8008で起動されました。
アクセスしてみましょう。さっきと同じような画面が出るはずです。

これでアプリを起動できるところまでは出来ました。
次にアプリ内での初期設定なのすが、ちょっと長くなったので次回。

続きは以下
perlによるwebアプリケーション作成手順 - Catalyst編 - その2 - 城好きwebプログラマーの生態メモ - 仕事編

このブログについて

はてなブログへ移行しました。

 

webアプリケーションの開発、管理について書いていきます。

rootパスワードを忘れたら?

rootのパスワードを忘れた場合はどうしたらいいのか?
先日その状況におちいってしまったのでまとめておきます

シングルユーザーモードでパスワードを変更する

これは非常に簡単。
起動してすぐのOS選択画面でkernelの最後に半角スペースをあけて「single」と入力し普段どおり起動させるだけでいいです。
これをするとパスワード入力なしにrootとしてログインできるのでパスワードの変更を行えます。
ただし、これを行うにはシステムが起動できる状態であることが前提条件つしてあげられます。
なにかエラーがあってシステム起動が行えず、またrootパスワードを忘れた場合は次の方法をとるとよいです。

レスキューモードでパスワードを変更する

これを行うにはまずOSインストールのディスクまたはイメージが必要となります。
といっても再インストールするわけではありません。
ディスク内の起動システムを使ってパスワードを変更しようというものです。
それぞれの環境に応じてディスクをセットし起動させます、このときHDDではなくCDを先にブートさせるようにしておきます。
起動して最初の画面で

# linux rescue

と入力、するとOS設定画面が出てくるのでネットワークも含め適当に設定します。
コマンドラインに入ったら、

# chroot /mnt/sysimage

を入力、これをすることでディスクのシステムではなくサーバー内のシステムがルートディレクトリとなり操作することが出来るようになります。

chroot: execute /bin/sh: Exec format error

こんなエラーがでたらOSのbit数の問題なので正しいOSをセットしてあげましょう。
あとはパスワードの変更をして再起動すれば問題なしです。
CDを先にブートさせるようにしていた変更箇所もなおしておきましょう。


といった形でこの2種類の方法さえわかれば問題なくいけます。
パスワードを忘れないようにするのが一番なんですが、引継ぎとかイロイロで分からなくなることは多々あるのでなにかとお世話になると思います。