2010年5月31日月曜日

UIImagePickerControllerでカメラを表示(iPhone)

スズキです。

最終的には、こんな感じです。

--------【UIGetScreenImageViewController.h】--------
#import <UIKit/UIKit.h>
@interface UIGetScreenImageViewController : UIViewController {
}

@end
--------

--------【UIGetScreenImageViewController.m】--------
#import "UIGetScreenImageViewController.h"
@implementation UIGetScreenImageViewController

UIImagePickerController *imagePicker;

- (void)viewDidLoad {
  [super viewDidLoad];
  imagePicker = [[UIImagePickerController alloc] init];
  [imagePicker autorelease];
  imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
  imagePicker.showsCameraControls = NO;
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self presentModalViewController:imagePicker animated:YES];
}

@end
--------

注意点としては、
[self presentModalViewController:imagePicker animated:YES];
を"viewDidLoad"に含めてしまうと、真っ白な画面のままになります。

ですので、上記のように、"viewDidAppear"に含めるようにします。

次は、UIGetScreenImageだ!

--------
http://www.suz-lab.com

2010年5月28日金曜日

"mysqlclient15"で"libmysqlclient.so.15"をインストール

スズキです。

以下のように、CentOSにNagiosを入れたのですが、
http://blog.suz-lab.com/2010/04/centosnagios.html

下記コマンドを実行したら、エラーになってしまいました。
# /usr/lib/nagios/plugins/check_mysql -h
/usr/lib/nagios/plugins/check_mysql: error while loading shared libraries:
libmysqlclient.so.15: cannot open shared object file: No such file or directory

MySQLのパッケージはインストールしたはずなのですが、確認してみると、
"libmysqlclient.so.16"はあるのですが、"libmysqlclient.so.15"はありません。

調べてみると、下記でインストールできるようです。
# yum install mysqlclient15

インストールされるファイルは次のとおりです。
# rpm -ql mysqlclient15
/etc/ld.so.conf.d/mysqlclient15-i386.conf
/usr/lib/mysql/libmysqlclient.so.15
/usr/lib/mysql/libmysqlclient.so.15.0.0
/usr/lib/mysql/libmysqlclient_r.so.15
/usr/lib/mysql/libmysqlclient_r.so.15.0.0
/usr/share/doc/mysqlclient15-5.0.67
/usr/share/doc/mysqlclient15-5.0.67/COPYING
/usr/share/doc/mysqlclient15-5.0.67/EXCEPTIONS-CLIENT
/usr/share/doc/mysqlclient15-5.0.67/README

これで、MySQLの監視もできるぞ。

--------
http://www.suz-lab.com

2010年5月26日水曜日

コマンド名で"kill"

スズキです。

"kill"コマンドだと、プロセスIDを指定しなければなりません。
コマンド名を指定して"kill"したいときは"killall"を利用します。

# killall httpd

みたいな感じで利用します。

VPN、勉強中…

--------
http://www.suz-lab.com

2010年5月25日火曜日

上海のサーバからAWSに"ping"

スズキです。

こんな結果になりました。

【us-east-1】
# ping xxx.xxx.xxx.xxx
PING xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) 56(84) bytes of data.
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=43 time=275 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=43 time=282 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=43 time=273 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=43 time=270 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=5 ttl=43 time=305 ms

【us-west-1】
# ping xxx.xxx.xxx.xxx
PING xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) 56(84) bytes of data.
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=43 time=276 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=43 time=268 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=43 time=272 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=43 time=267 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=5 ttl=43 time=276 ms

【ap-southeast-1】
# ping xxx.xxx.xxx.xxx
PING xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) 56(84) bytes of data.
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=41 time=135 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=41 time=136 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=41 time=135 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=41 time=135 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=5 ttl=41 time=135 ms

ついでに、東京からもやっておくか。

--------
http://www.suz-lab.com

「AWS」と「日本プロゴルフ選手権」

スズキです。

僕が「中の人」やってる、「AWS+」の事例を紹介します。
http://www.aws-plus.com/

先日、「日本プロゴルフ選手権」がありました。
http://www.pga.or.jp/bl_toursps/

PGA(日本プロゴルフ協会)主催の大会で、
大会に関する情報は、毎年、PGAのサイトで発信しています。

ですので、大会期間中は、高負荷状態になってしまい、
サイトが閲覧できなくなってしまうことも、多々あるようでした。

大会期間中は、一時的にサーバを増やしての対応などもしていたのですが、
サーバが複数になることで手順が煩雑になったり、
いつも利用している管理ツールの使用が一部制限されたりなど、
運用にストレスがかかってしまっていました。

そこで「AWS」です。

AWSの特徴である、インスタンスが容易に増減でき、かつ、従量課金が上手に利用でき、
以下で紹介されているように、いつもどおりの運用で、今までよりコストを下げた形で、
「日本プロゴルフ選手権」を乗り切ることができました。
http://www.aws-plus.com/topics/index.html

「SUZ-LAB」なので、技術的なことも少々…

まず、マスターサーバのAMIを作成し、そこから、
DBの接続先などを変更したスレーブサーバ用のAMIを作成します。

そして、スレーブサーバのインスタンスを複数立ち上げELBで分散するのですが、
スレーブサーバのコンテンツは、"cron"と"rsync"でマスターサーバから
定期的に同期するようにしています。(このあたりは、よくある方法だと思います)

ただ、下記の機能に関しては、必ずマスターサーバで処理する必要がありました。
- MTを含む管理機能
- メールの送信

ですので、上記機能のURLに関しては、以下で紹介したように、
スレーブサーバにmod_proxyの設定を行い、
実際はマスターサーバで処理するようにしています。
http://blog.suz-lab.com/2010/05/apache-for.html

まあ結局、「AWS+」の宣伝なんですが、AWSを利用する一つの良い事例なのでは、
と思っています。

もっと、「AWS+」の中のことも書いていこう。

--------
http://www.suz-lab.com

2010年5月21日金曜日

Nagiosで"ping"できないHostを監視

スズキです。

下記で紹介したようにHost登録すると、
http://blog.suz-lab.com/2010/05/nagioshost.html
Hostの死活監視で"ping"が利用され、"ping"が通らないHostでは、
不都合が生じてしまいます。

このような場合は、下記のように、ダミーでOKを返すコマンドを用意して、

--------【commands.cfg】--------
...
define command {
  command_name check_dummy
  command_line $USER1$/check_dummy 0
}
...
--------

そのコマンドを死活監視に使うHostのテンプレートを作成し、

--------【template.cfg】--------
define host {
  name dummy-host
  use generic-host
  register 0
  max_check_attempts 10
  check_command check_dummy
}
--------

そのテンプレートを利用(use)したHostにすればOKです。

まだまだ、Nagiosは続く…

--------
http://www.suz-lab.com

2010年5月20日木曜日

Nagiosで"Contact"の登録

スズキです。

下記のように、"contact"を作成して、"contactgroup"でまとめ、
それを、"host"や"service"の"contact_groups"で指定する感じです。
※ "register 0"とすると、テンプレートとしての設定になります。

--------【template.cfg】--------
define host {
  name suzlab-host
  use generic-host
  contact_groups suzlab-group
  register 0
}

define service {
  name sualab-service
  use generic-service
  contact_groups suzlab-group
  register 0
}

define contactgroup {
  contactgroup_name suzlab-group
  alias SUZ-LAB Admins
  members suzlab-admin
}

define contact {
  contact_name suzlab-admin
  use generic-contact
  alias SUZ-LAB Admin
  email suzuki@suz-lab.com
}
--------

次こそはNRPE... もう運用してるんだけど…

--------
http://www.suz-lab.com

"yum" で"mail"のインストール(CentOS)

スズキです。

Nagiosのメール通知で、"mail"コマンドを利用していたので、
"yum"でインストールです。ただし、パッケージ名は下記のように"mailx"です。

# yum install mailx

以下のようにインストールされます。

# rpm -ql mailx
/bin/mail
/etc/mail.rc
/usr/bin/Mail
/usr/lib/mail.help
/usr/lib/mail.tildehelp
/usr/share/man/man1/Mail.1.gz
/usr/share/man/man1/mail.1.gz

実際に、次のように送信テストしてみると、エラーになってしまいます。

# mail -s test suzuki@suz-lab.com
test
.
Cc:
/usr/sbin/sendmail: No such file or directory

"sendmail"が必要とのことなので、"postfix"をインストールです。

# yum install postfix
# service postfix start

これで無事、送信できるようになりました。

Nagiosも終盤だなー。(第一フェーズだけど…)

--------
http://www.suz-lab.com

Elasticfoxで"Asia Pacific (Singapore)"の追加

スズキです。

ちょっと遅いですが、AWSの地域に"Asia Pacific (Singapore)"が追加されたので、
Elasticfoxにも以前紹介した方法で追加してみました。
http://blog.suz-lab.com/2010/01/elasticfoxregion.html

今回の入力情報は下記となります。

Region Name: ap-southeast-1
Endpoint URL: https://ec2.ap-southeast-1.amazonaws.com

VPCは、まだ、"US East (Virginia)"でしか、使えないらしい…

--------
http://www.suz-lab.com

2010年5月19日水曜日

Nagios で"Service Groups"の登録

スズキです。

下記でHostのグループ化をしていますが、
http://blog.suz-lab.com/2010/05/nagioshost.html
Serviceもグループ化できます。

設定は下以下のとおりです。

--------【servicegroup.cfg】--------
define servicegroup {
servicegroup_name load
alias Current Load
members suz-lab-01,Current Load,suz-lab-01,Current Load
}
--------

ポイントは、membersの指定が、"host_name"と"service_description"を
カンマで区切った組み合わせを、カンマで区切って羅列するところです。
(表現しにくいなー…)

今度こそ、次はNRPE…

--------
http://www.suz-lab.com

AWSサービスのIPレンジ(Public)

スズキです。

下記でアナウンスされてました。

▼Amazon EC2 Public IP Ranges
http://developer.amazonwebservices.com/connect/ann.jspa?annID=676

引用すると、以下のとおりです。

> ▼US East (Northern Virginia)
> 216.182.224.0/20 (216.182.224.0 - 216.182.239.255)
> 72.44.32.0/19 (72.44.32.0 - 72.44.63.255)
> 67.202.0.0/18 (67.202.0.0 - 67.202.63.255)
> 75.101.128.0/17 (75.101.128.0 - 75.101.255.255)
> 174.129.0.0/16 (174.129.0.0 - 174.129.255.255)
> 204.236.192.0/18 (204.236.192.0 - 204.236.255.255)
> 184.73.0.0/16 (184.73.0.0 – 184.73.255.255)
> 184.72.128.0/17 (184.72.128.0 - 184.72.255.255)
>
> ▼US West (Northern California)
> 204.236.128.0/18 (216.236.128.0 - 216.236.191.255)
> 184.72.0.0/18 (184.72.0.0 – 184.72.63.255)
>
> ▼EU (Ireland)
> 79.125.0.0/17 (79.125.0.0 - 79.125.127.255)
>
> ▼Asia Pacific (Singapore)
> 175.41.128.0/18 (175.41.128.0 - 175.41.191.255)

S3になんか新しい機能が追加されたっぽいぞ...
https://aws.amazon.com/s3/#protecting
> Reduced Redundancy Storage (RRS)

--------
http://www.suz-lab.com

Nagiosで"Service"の登録

スズキです。

下記のHostの登録に引き続き、
http://blog.suz-lab.com/2010/05/nagioshost.html
今回は、Serviceの登録です。

サービスは、Hostなどを登録したNagiosの設定ファイルに、
下記のように記述することで登録できます。

--------【xxxxxxxx.cfg】--------
define service {
  use generic-service
  host_name suz-lab-01
  service_description Current Load
  check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
}
--------

"service_description"はキーになってるようで、
同一ホストで一意になるようにしておきます。
"check_command"は
"/etc/nagios/objects/commands.cfg"などに登録されているコマンドを指定します。
※"check_local_load"は以下のように定義されています。

--------【commands.cfg】--------
define command {
  command_name check_local_load
  command_line $USER1$/check_load -w $ARG1$ -c $ARG2$
}
--------

次は、NRPE...

--------
http://www.suz-lab.com

2010年5月18日火曜日

Nagiosで"Host"の登録

スズキです。

以下のインストール編から時間がたってしまいましたが、
http://blog.suz-lab.com/2010/04/centosnagios.html
今回は、Hostの登録まで紹介します。

まずWebインターフェースへのアクセスですが、Basic認証のため、
"/etc/nagios/htpasswd.users"に"nagiosadmin"を登録しておく必要があります。

そして、Hostの登録ですが、下記のような設定ファイルを準備します。
("/opt/suz-lab/etc/nagios/"以下にあることとします)

--------【hostgroup.cfg】--------
define hostgroup {
  hostgroup_name suz-lab
  alias SUZ-LAB
  members suz-lab-01
}

define host {
  use linux-server
  host_name suz-lab-01
  alias SUZ-LAB-01
  address 192.168.1.2
}
--------

"host"で実際のサーバを指定して、"hostgroup"で、それらをグループ化しています。

最後に、上記の設定ファイルを読み込むように、
以下のように"/etc/nagios/nagios.cfg"を調整します。

--------【nagios.cfg】--------
...
cfg_dir=/opt/suz-lab/etc/nagios
...
--------
※"/opt/suz-lab/etc/nagios"以下の、拡張子が"cfg"のファイルが読み込まれます。

Nagiosを再起動すれば、Webインターフェースで、
追加されたHostを確認することができます。

次はServiceだ。(NDOUtilsもやりたい…)

--------
http://www.suz-lab.com

2010年5月17日月曜日

ApacheでCGIの設定(その2)

スズキです。

「その1」は以下で、ScriptAliasを用いた方法を紹介しました。
http://blog.suz-lab.com/2009/08/apachecgi.html

ただ、これだと、ディレクトリ以下のすべてのファイルがCGIとして扱われてしまい、
場合によっては不都合が生じてしまいます。

ですので今回は、拡張子が"cgi"のファイルのみ、CGIとして扱う方法です。

まず下記で、拡張子が"cgi"のファイルが、CGIとして扱われるようにします。

AddHandler cgi-script .cgi

次に、対象となるDirectoryディレクティブ中のOptionsにExecCGIを指定します。

Options ExecCGI

最後に、Apacheを再起動すれば、
拡張子が"cgi"のファイルがCGIとして処理されるようになります。

今週中に、サーバ(AWS)関係の目処は立てたいなー…

--------
http://www.suz-lab.com

PHPで複数ドメインでセッションを共有(Cookieの設定)

スズキです。

デフォルト設定では、セッションに使うCookieのドメインは、
URLが"www.suz-lab.com"なら、"www.suz-lab.com"、
"suz-lab.com"なら、"suz-lab.com"となり、セッションを共有することができません。

共有したい場合は、"php.ini"にて下記のように記述します。

--------【php.ini】--------
...
session.cookie_domain = suz-lab.com
...
--------

すると、どちらのCookieのドメインも"suz-lab.com"となり、
セッションの共有が可能となります。

TODOが消化しきれないなー…

--------
http://www.suz-lab.com

ELBでのHTTPSは"X-FORWARDED-FOR"がつかない(AWS)

スズキです。

AWSのELBを利用している場合、HTTPに関しては、
ELBがX-FORWARDED-FORヘッダを付与してくれて、
本当のREMOTE_ADDRがわかるようになっています。

ですが、HTTPSの場合、このX-FORWARDED-FORヘッダが付与されません…

ですので、HTTPSかつ、本当のREMOTE_ADDRが必要な場合は、
ELB経由でない形にしなければいけないようです…

よく考えれば、当然か…

--------
http://www.suz-lab.com

PHPでヘッダ情報を表示

スズキです。

以下で紹介されています。
http://phpspot.net/php/pg%83%8A%83N%83G%83X%83g%83w%83b%83_%82%F0%82%B7%82%D7%82%C4%8E%E6%82%E8%8Fo%82%B7.html

コードは、こんな感じです。

--------【PHP】--------
<?php
$headers = getallheaders();
while (list ($header, $value) = each ($headers)) {
  echo "$header: $value\n";
}
?>
--------

週末、さぼってしまった…

--------
http://www.suz-lab.com

2010年5月14日金曜日

EC2上で時刻同期(CentOS)

スズキです。

EC2上で"ec2-api-toos"を利用したら、下記のようなエラーが発生してしまいました。

Client.InvalidSecurity: Request has expired

エラーの原因は、サーバの時刻がずれていたからでした…

ということで、次のような"ntpdate"コマンドで時刻を同期しようとしたのですが、

# ntpdate -b -u 0.centos.pool.ntp.org

なぜか、時刻の同期が反映されません…

いろいろ調べてみると、下記でも紹介されているように、
Xenがらみの結構有名な話のようです…

http://d.hatena.ne.jp/rx7/20070620/p2

ということで、下記を実行して、

sysctl xen.independent_wallclock=1

再度、上記の"ntpdate"コマンドを実行したら、今度は無事に、時刻同期が反映しました。

"SUZ-LAB 謹製 CentOS AMI"にも、このあたり反映しておかないと…

--------
http://www.suz-lab.com

"ntpd"を起動しながら"ntpdate"を実行

スズキです。

下記のように、"ntp"のパッケージをインストールすると、
"ntpd"とntpdateが利用できるようになります。

# yum install ntp

"ntpd"は時刻あわせを行うデーモンで、下記のように起動できます。

# /etc/init.d/ntpd start
# chkconfig ntpd on

その状態で、"ntpdate"を実行すると、下記のようなエラーになってしまいます。

# ntpdate 0.centos.pool.ntp.org
14 May 11:59:55 ntpdate[9525]: the NTP socket is in use, exiting

このような場合は、下記のように"u"オプションを利用します。

# ntpdate -u 0.centos.pool.ntp.org
14 May 12:00:53 ntpdate[9530]:
adjust time server 128.10.19.24 offset 0.005958 sec

でも、EC2だと時刻が合わない…

--------
http://www.suz-lab.com

2010年5月13日木曜日

ProFTPDの設定で"DefaultRoot"は複数書ける

スズキです。

ProFTPDは設定ファイル(/etc/proftpd.conf)中に"DefaultRoot"を記述することで、
ユーザーが操作できるディレクトリを制限することができます。

以下は設定例です。

DefaultRoot /tmp
→ すべてのユーザーが"/tmp"以下のみに操作可能

DefaultRoot ~
→ すべてのユーザーがホームディレクトリのみに操作可能

DefaultRoot /tmp admin
→ "admin"グループのユーザーが"/tmp"以下のみに操作可能

DefaultRoot ~ !admin
→ "admin"グループのユーザー以外がホームディレクトリのみに操作可能

そして、この"DefaultRoot"は複数記述することができます。

DefaultRoot /tmp admin
DefaultRoot ~

上記の場合、上から評価されるので、"admin"グループのユーザーは、
"/tmp"以下のみが操作でき、それ以外のユーザーは、
ホームディレクトリのみ操作可能となります。

ProFTPDネタも増えてきたなー…
http://blog.suz-lab.com/search/label/ProFTPD

--------
http://www.suz-lab.com

WebminにHTTPSでアクセス

スズキです。

まず、Net::SSLeay(Perlモジュール)を導入しておきます。
CentOSの場合は、以下のような感じでしょうか?(rpmforge)

# yum install perl-Net-SSLeay

そして、Webminにアクセスして、

「Webmin」 → 「Webmin 設定」 → 「SSL暗号化」

とたどり、以下のように設定すれば、

●可能であればSSLを使用可能にしますか? → はい
●非SSLリクエストをSSLモードにリダイレクトしますか? → はい

HTTPSで接続できるようになります。

証明書がだめだけど…

--------
http://www.suz-lab.com

2010年5月11日火曜日

セキュリティーグループでセキュリティーグループを許可(EC2)

スズキです。

EC2は、セキュリティグループをまたぐインスタンス同士の通信はできないようになっています。
(当然、許可したポートはできますが...)

しかし、管理アカウントを作成して、そこに管理機能をもつインスタンスを立ち上げて、
他のアカウント/セキュリティグループのインスタンスを管理したいと思うと、
上記では、少し困ってしまいます。

このようなとき、セキュリティグループには他のアカウントのセキュリティグループを
許可することができ、そのセキュリティグループからのアクセスが、
あたかも、セキュリティグループ内のアクセスのようにすることができます。

設定は、Elasticfoxを利用すると簡単にできます。

"Security Groups"タブにて、"Grant New Permission"ウィンドウを開き、
そこの"Group"タブの中で、対象となる"User ID"、"(セキュリティ)Group"指定します。

管理用インスタンス作る前に、久しぶりに、32bitのAMIをアップデートしよう。

--------
http://www.suz-lab.com

"MySQL Proxy"で"RW Splitting"

スズキです。

"RW Splitting"とは、レプリケーションされたMySQL群が用意されているとき、
書き出しはマスターへ、読み込みスレーブへと、SQLの性質によって、
接続先のMySQLを使い分けることです。

上記の処理は、アプリケーションのフレームワークや、独自実装などで、
よく実現されています。

この"RW Splitting"、下記で導入した"MySQL Proxy"でも実現が可能で、
http://blog.suz-lab.com/2010/05/centosmysql-proxy.html
lua言語で書かれた"RW Splitting"のスクリプトが、以下に用意されています。
/opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua

次のように設定して、"MySQL Proxy"を再起動すれば、
"RW Splitting"として機能するようになります。

--------【my.cnf】--------
[mysql-proxy]
max-open-files=1024
log-file=/var/log/mysql-proxy.log
log-level=message
proxy-address=:3306
proxy-backend-addresses=master.internal
proxy-read-only-backend-addresses=slave.internal
proxy-lua-script=/opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
--------
※ "MySQL Proxy"のポートは3306に変更
※ マスターMySQLは"master.internal"
※ スレーブMySQLは"slave.internal"

ログはこんな感じです。

--------【mysql-ploxy.log】--------
...
...: (message) proxy listening on port 3306
...: (message) added read/write backend: master.internal
...: (message) added read-only backend: slave.internal
...
--------

"master.internal"が"read/write"のMySQLとして、
"slave.internal"が"read-only"のMySQLとして、登録されていることがわかります。

"RW Splitting"の検証も、書いておきたいなー...

--------
http://www.suz-lab.com

EC2で"DNS Name (IP Address)"が変化するタイミング

スズキです。

複数のEC2インスタンスが連携している場合、注意が必要です...

【新規インスタンス立ち上げ時】
"Public DNS Name (IP Address)"が割り当てられます。
"Private DNS Name (IP Address)"が割り当てられます。

【インスタンスのSTOP/START】
"Public DNS Name (IP Address)"が変更します。
"Private DNS Name (IP Address)"が変更します。

【インスタンスにEIPを関連付け】
"Public DNS Name (IP Address)"が変更します。

【インスタンスからEIPを削除】
"Public DNS Name (IP Address)"が変更します。

DNSネームが変わるのは、つらいなー...

--------
http://www.suz-lab.com

2010年5月7日金曜日

Apacheでリバースプロキシ for スケールアウト

スズキです。

Apacheでは、"mod_proxy"を利用することで、
透過的にリクエストをバックエンドサーバに処理させることができます。

EC2などでスケールアウトしたときに、管理機能だけは、マスターサーバで処理して欲しい
などということが良くあると思います。(ファイルの書き出しなどを行うものなど)

そのような場合は、下記のように"mod_proxy"を利用して、管理機能へのリクエストを、
マスターサーバで処理するようにすること、簡単に実現できます。

--------【httpd.conf】--------
...
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
...
ProxyPass /admin/ http://master.internal/admin/
ProxyPassReverse /admin/ http://master.internal/admin/
...
--------
※ ProxyPassReverseに関しては、こちらで詳しく説明されています。
http://d.hatena.ne.jp/hogem/20091205/1260023908

これで、5月の日付に記事数が追いついたぞ。

--------
http://www.suz-lab.com

CentOSに"MySQL Proxy"

スズキです。

MySQLのサイトにRHEL5用のバイナリが用意されているので、
以下のように、そちらを利用します。

# cd /opt/
# curl -OL http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.0-linux-rhel5-x86-32bit.tar.gz
# tar xvzf mysql-proxy-0.8.0-linux-rhel5-x86-32bit.tar.gz
# ln -s mysql-proxy-0.8.0-linux-rhel5-x86-32bit mysql-proxy

次に、以下で紹介されている起動スクリプト(/etc/init.d/mysql-proxy)を用意します。
http://forge.mysql.com/wiki/MySQL_Proxy_init

ただし、
< PROXY_PATH=/opt/mysql-proxy/sbin
の部分を次のように
> PROXY_PATH=/opt/mysql-proxy/bin
上記に展開したディレクトリ構成にそろえる必要があります。(パーミッションも775に)

そして、以下のように、"/etc/sysconfig/mysql-proxy"を作成しておきます。

--------【mysql-proxy】--------
PROXY_OPTIONS="--daemon --defaults-file=/etc/my.cnf"
--------

以下のような"/etc/my.cnf"も用意しておきます。

--------【my.cnf】--------
[mysql-proxy]
max-open-files = 1024
log-file = /var/log/mysql-proxy.log
log-level = message
--------

注意点として、"max-open-files = 1024"を指定しておかないと、
下記のようなエラーが発生します。

# /etc/init.d/mysql-proxy start
mysql-proxy を起動中: 2010-04-26 21:33:01: (critical) chassis-limits.c:81:
could not raise RLIMIT_NOFILE to 8192, Invalid argument (22). Current
limit still 1024.

また、"my.cnf"のパーミッションを660にしておかないと、下記のようなエラーも発生します。

# /etc/init.d/mysql-proxy start
mysql-proxy を起動中: 2010-05-07 15:09:33: (critical) chassis-filemode.c:62:
/etc/my.cnf permissions not secure (0660 or stricter required)

正常に起動すると、下記のようなログが確認できると思います。

# less /var/log/mysql-proxy.log
2010-05-07 15:13:20: (message) mysql-proxy 0.8.0 started
2010-05-07 15:13:20: (message) proxy listening on port :4040
2010-05-07 15:13:20: (message) added read/write backend: 127.0.0.1:3306

上記より、MySQLクライアントで4040ポートに接続すると、
127.0.0.1:3306ポートのMySQLに透過的に接続されるようになってることがわかります。

RPM化して、SUZ-LABリポジトリに置こう...

--------
http://www.suz-lab.com

Telnetで"Submission over SMTP-AUTH"の確認

スズキです。

下記で"Submission over SMTP-AUTH"の設定までできたので、
http://blog.suz-lab.com/2010/05/submission-over-smtp-auth-postfix.html
Telnetを使って動作確認してみます。

まず、TelnetにてSubmissionポート(587)にアクセスします。

# telnet nnn.nnn.nnn.nnn 587
> Trying nnn.nnn.nnn.nnn...
> Connected to nnn.nnn.nnn.nnn.
> Escape character is '^]'.
> 220 xxx.xxx ESMTP Postfix

次に、"EHLO"コマンドを入力します。

> EHLO localhost
> 250-xxx.xxx
> 250-PIPELINING
> 250-SIZE 10240000
> 250-VRFY
> 250-ETRN
> 250-AUTH PLAIN LOGIN
> 250-ENHANCEDSTATUSCODES
> 250-8BITMIME
> 250 DSN

ここまでは、下記で紹介した普通のSMTPの確認とほぼ同じですが、
http://blog.suz-lab.com/2010/04/centospostfix.html
SMTP-AUTHの場合は、"250-AUTH ..."を確認することができます。

次に"AUTH PLAIN"コマンドを実行しますが、予め下記のように、
user/passをBase64 にしたものを用意しておきます。

# perl -MMIME::Base64 -e 'print encode_base64("user\0user\0pass");'
xxxxxxxxxxxxxxxxxxx=

そして、上記Telnetの続きに、次のような"AUTH PLAIN"コマンドを実行します。

> AUTH PLAIN xxxxxxxxxxxxxxxxxxx=
> 235 2.0.0 Authentication successful

このあとは、いつもの手順で、メールが送信できます。
(認証が成功している場合はリレーもOKとなります)

SMTP-AUTHも自分のものになったぞ!

--------
http://www.suz-lab.com

2010年5月6日木曜日

PostgreSQLに"localhost"以外から接続

スズキです。

デフォルト(CentOSで"yum"インストール)だと、"localhost"以外から接続できません。

できるようにするには"/var/lib/pgsql/data/postgresql.conf"を、
以下のように調整します。

--------【postgresql.conf】--------
...
#listen_addresses = 'localhost'
listen_addresses = '*'
...
--------

これで以下のように、"localhost"以外からも接続できるようになります。

# psql -h xxx.xxx.xxx -U user database

久しぶりのPostgreSQLだったなー...

--------
http://www.suz-lab.com

Submission over SMTP-AUTH (Postfix)

スズキです。

SMTP関係はGoogleにお任せ状態だったので、
よく考えたら、初めての試みでした...

とりあえず、"postfix"がインストールされている前提で、
下記パッケージもインストールします。

# yum install cyrus-sasl-plain

次に、以下のサービスを立ち上げます。

# /etc/init.d/saslauthd start
# chkconfig saslauthd on

そして、"/etc/postfix/master.cf"の"submission"の部分を以下のようにします。

--------【master.cf】--------
submission inet n - n - - smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
--------

最後に、次のように"postfix"の再起動です。

# /etc/init.d/postfix restart

確認方法は、あらためて...

--------
http://www.suz-lab.com

"yum"で"nslookup"のインストール(CentOS)

スズキです。

デフォルトでインストールされていることが多い"nslookup"ですが、
CentOSでインストール(yum)する場合、パッケージ名は"nslookup"では無いので、
注意です。

インストールは下記のようになります。

# yum install bind-utils

上記パッケージの中身は以下の通りで、
"nslookup"以外にもいろいろとインストールされます。

# rpm -ql bind-utils
/usr/bin/dig
/usr/bin/host
/usr/bin/nslookup
/usr/bin/nsupdate
/usr/share/man/man1/dig.1.gz
/usr/share/man/man1/host.1.gz
/usr/share/man/man1/nslookup.1.gz
/usr/share/man/man1/nsupdate.1.gz

今、GW前のネタをブログに書いてるなー...

--------
http://www.suz-lab.com

ApacheでREMOTE_ADDRをELB経由でも...(CentOS)

スズキです。

よくある話ですが、AWSのELBを利用した場合でも、
下記のような、よくある対策でOKでした。(CentOSですが...)

まずは"yum(epel)"でApacheのモジュール(mod_extract_forwarded)をインストールです。

# yum install mod_extract_forwarded

次に"/etc/httpd/conf.d/mod_extract_forwarded.conf"を
下記のように調整します。(ほとんどデフォルトです)

--------【mod_extract_forwarded.conf】--------
LoadModule extract_forwarded_module modules/mod_extract_forwarded.so
MEForder refuse,accept
MEFrefuse all
MEFaccept all
MEFaddenv on
MEFdebug off
--------

ポイントは、MEFacceptを"all"にしているところです。
本来は、ELBの内部アドレスを指定したいのですが、
内部DNS名は無いようですし、IPも変わらない保障は良くわからないので
とりあえず"all"としています。

で、"apache"を再起動すれば、REMOTE_ADDRがELBのものではなく、
ELBへ接続しているクライアントのものになります。

GWは、さぼってしまった...

--------
http://www.suz-lab.com