2013年1月31日木曜日

Xen(Domain0)のインストール

社内に余っているPCにCentOSを入れて、Xenをインストールしてみました(`・ω・´)シャキーン
このPCにXenを入れて、MySQLのフェイルオーバーなどを実験しちゃうぞm9( ゚Д゚) ドーン!

■Xenとは
オープンソースで提供されている仮想化ソフトウェア。
仮想化記述には、VMware、OpenVZ、KVM、などがあるそうです。
その中でもXenは、
・仮想領域ごとにカーネル空間を複数持つ
・「準仮想化」と「完全仮想化」の2種類のモードがある。
・実体データの保存形式を「パーティションベース」のものと「ファイルベース」のものから選択することができる。
・Domain0(管理OS)とゲストOS(DomainU)で仮想領域が管理される

詳細はこちらのサイトの方に詳しく書かれています!φ(`д´)メモメモ...
実践! Xenで実現するサーバ統合(1)
2009-02-18 [仮想化][Xen]Xenでサーバ環境構築その1~xenについて知ろう~

それではインストールを行って行きたいと思います。

■手順1)仮想化が行えるか確認する。

Xenの仮想化に対応するためには、PAE 拡張のある CPU が必要となります。
何か表示されればOK!
# grep pae /proc/cpuinfo
flags           : fpu tsc msr pae cx8 apic mtrr cmov pat clflush mmx fxsr sse sse2 ss nx constant_tsc pni est ssse3
flags           : fpu tsc msr pae cx8 apic mtrr cmov pat clflush mmx fxsr sse sse2 ss nx constant_tsc up pni est ssse3

次に完全仮想化もできるか一応確認してみる
#何も帰ってこない場合には、完全仮想化に対応していない
# egrep -e 'vmx|svm' /proc/cpuinfo
何も表示されなかったので、このPCでは完全無効は無理みたいですガ━━(;゚Д゚)━━ン!!
#xen-3.0-x86_32pと出ると無効になっているらしい
# cat /sys/hypervisor/properties/capabilities
xen-3.0-x86_32p

■手順2)xen(Domain0)のインストール
# yum install xen kernel-xen virt-manager
Loaded plugins: fastestmirror, priorities, security
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * elrepo: elrepo.org
 * epel: mirrors.ustc.edu.cn
 * extras: www.ftp.ne.jp
 * rpmforge: mirror-fpt-telecom.fpt.net
 * updates: www.ftp.ne.jp
Setting up Install Process
Resolving Dependencies
:
:
省略
:
:
Dependencies Resolved

=====================================================================================================================================================================================
 Package                                            Arch                           Version                                                     Repository                       Size
=====================================================================================================================================================================================
Installing:
 kernel-xen                                         i686                           2.6.18-348.1.1.el5                                          updates                          21 M
 virt-manager                                       i386                           0.6.1-16.el5                                                base                            1.6 M
 xen                                                i386                           3.0.3-142.el5                                               base                            1.9 M
Installing for dependencies:
 bridge-utils                                       i386                           1.1-3.el5                                                   base                             29 k
 e4fsprogs-libs                                     i386                           1.41.12-3.el5                                               base                            109 k
 gnome-python2-gnomekeyring                         i386                           2.16.0-3.el5                                                base                             16 k
 gtk-vnc                                            i386                           0.3.8-3.el5                                                 base                             80 k
 gtk-vnc-python                                     i386                           0.3.8-3.el5                                                 base                             12 k
 libvirt                                            i386                           0.8.2-29.el5                                                base                            3.0 M
 libvirt-python                                     i386                           0.8.2-29.el5                                                base                            237 k
 python-virtinst                                    noarch                         0.400.3-13.el5                                              base                            384 k
 xen-libs                                           i386                           3.0.3-142.el5                                               base                            176 k
 xz-libs                                            i386                           4.999.9-0.3.beta.20091007git.el5                            base                            100 k

Transaction Summary
=====================================================================================================================================================================================
Install      13 Package(s)
Upgrade       0 Package(s)

Total download size: 29 M
Is this ok [y/N]: y
Downloading Packages:
(1/13): gtk-vnc-python-0.3.8-3.el5.i386.rpm                                                                                                                   |  12 kB     00:00
(2/13): gnome-python2-gnomekeyring-2.16.0-3.el5.i386.rpm                                                                                                      |  16 kB     00:00
(3/13): bridge-utils-1.1-3.el5.i386.rpm                                                                                                                       |  29 kB     00:00
(4/13): gtk-vnc-0.3.8-3.el5.i386.rpm                                                                                                                          |  80 kB     00:00
(5/13): xz-libs-4.999.9-0.3.beta.20091007git.el5.i386.rpm                                                                                                     | 100 kB     00:00
(6/13): e4fsprogs-libs-1.41.12-3.el5.i386.rpm                                                                                                                 | 109 kB     00:00
(7/13): xen-libs-3.0.3-142.el5.i386.rpm                                                                                                                       | 176 kB     00:00
(8/13): libvirt-python-0.8.2-29.el5.i386.rpm                                                                                                                  | 237 kB     00:00
(9/13): python-virtinst-0.400.3-13.el5.noarch.rpm                                                                                                             | 384 kB     00:00
(10/13): virt-manager-0.6.1-16.el5.i386.rpm                                                                                                                   | 1.6 MB     00:00
(11/13): xen-3.0.3-142.el5.i386.rpm                                                                                                                           | 1.9 MB     00:00
(12/13): libvirt-0.8.2-29.el5.i386.rpm                                                                                                                        | 3.0 MB     00:00
(13/13): kernel-xen-2.6.18-348.1.1.el5.i686.rpm                                                                                                               |  21 MB     00:05
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                3.9 MB/s |  29 MB     00:07
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : xz-libs                                                                                                                                                      1/13
  Installing     : bridge-utils                                                                                                                                                 2/13
  Installing     : gtk-vnc                                                                                                                                                      3/13
  Installing     : gtk-vnc-python                                                                                                                                               4/13
  Installing     : e4fsprogs-libs                                                                                                                                               5/13
  Installing     : xen-libs                                                                                                                                                     6/13
  Installing     : libvirt                                                                                                                                                      7/13
  Installing     : libvirt-python                                                                                                                                               8/13
  Installing     : gnome-python2-gnomekeyring                                                                                                                                   9/13
  Installing     : python-virtinst                                                                                                                                             10/13
  Installing     : kernel-xen                                                                                                                                                  11/13
  Installing     : virt-manager                                                                                                                                                12/13
  Installing     : xen                                                                                                                                                         13/13

Installed:
  kernel-xen.i686 0:2.6.18-348.1.1.el5                             virt-manager.i386 0:0.6.1-16.el5                             xen.i386 0:3.0.3-142.el5

Dependency Installed:
  bridge-utils.i386 0:1.1-3.el5       e4fsprogs-libs.i386 0:1.41.12-3.el5               gnome-python2-gnomekeyring.i386 0:2.16.0-3.el5   gtk-vnc.i386 0:0.3.8-3.el5
  gtk-vnc-python.i386 0:0.3.8-3.el5   libvirt.i386 0:0.8.2-29.el5                       libvirt-python.i386 0:0.8.2-29.el5               python-virtinst.noarch 0:0.400.3-13.el5
  xen-libs.i386 0:3.0.3-142.el5       xz-libs.i386 0:4.999.9-0.3.beta.20091007git.el5

Complete!
■手順3)xen対応のKernelを利用するため、/etc/sysconfig/kernelを編集する
「/etc/sysconfig/kernel」の「DEFAULTKERNEL=kernel」行を「DEFAULTKERNEL=kernel-xen」に変更します。
vi /etc/sysconfig/kernel

#DEFAULTKERNEL=kernel
DEFAULTKERNEL=kernel-xen

#現在のカーネルの確認
# uname -r
2.6.18-348.el5PAE
■手順4)initrdを利用するため、/etc/modprobe.confを編集する
「/etc/modprobe.conf」の最下行に「alias scsi_hostadapter xenblk」を追加します。
vi /etc/modprobe.conf
alias scsi_hostadapter xenblk
■手順5)xen対応のKernelで起動させるため、/boot/grub/menu.lstを編集する
「/boot/grub/menu.lst」の「default=X」行のXの値をxen対応カーネルの番号に変更します。
kernel-xenをインストールすることでGRUBで0に当たるカーネルイメージが
Xenのカーネルになるなのでデフォルトの起動イメージを0に変更する。
vi /boot/grub/menu.lst

#default=1
default=0

■手順6)Xen管理デーモンの自動起動設定
# chkconfig xend on
■手順7)上記設定を有効にするため、再起動します。
shutdown -r now
■手順7)Domain0の確認
Domain0とは、他の仮想マシン(DomainU)の作成や仮想デバイスの管理を行う管理OSのこと。
# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0     3591     2 r-----     56.6

#xen用kernelで起動出来ているかどうかの確認(xenつきに変わっている)
# uname -r
2.6.18-348.1.1.el5xen
以上(`・ω・´)ゞビシッ!!

次回はゲストOSのインストールを行いたいと思います(ΦωΦ)フフフ…

参考URL

2013年1月28日月曜日

memcacheとmemcachedの違い

memcachedをphpから利用するモジュールで、
memcacheモジュールとmemcachedモジュールという2つがあって、
頭がごちゃごちゃしたのでまとめておきたいと思います:(;゙゚'ω゚'):

社内でlibmemcachedって何に必要なんだっけ・・・?
memcachedサーバー側で必要でクライアント側にはいらないんじゃないっけ?
とか混乱してたのはナイショシーッ! d( ゚ε゚;)

■PECL::memcache
PECL::memcacheのURL
・PHP4.3.3以上で使用可能
・インストール時に他のライブラリに依存しない
・分散が出来る。(複数サーバーに対応)(PECL::Memcacheが2.0以降)※1
・cas対応(3.0.0以降)※2

■PECL::memcached
PECL::memcachedのURL
・PHP5.2.0以上で使用可能。
・memcacheよりも利用できる機能が多い(Igbinaryという文字列ではなくてバイナリ形式でのシリアライズ方式もサポートなど?)
・別途libmemcachedモジュールが必要
・拡張があったときにlibmemcachedに追従するだけなので対応が早いことが予測される?
・分散が出来る。(複数サーバーに対応)※1
・cas対応※2
・パフォーマンスはこっちがの良い?※3

phpから利用するモジュールではなくて、memcachedの本体は・こちらになります。
マスコット的なキャラクターがカワ(・∀・)イイ!!

※1・・・自動的に複数memcachedサーバーに分散して保存してくれるので、全体で大きなサイズのmemcachedサーバーとして使用することが可能。
※2・・・set時に他のプロセスが更新されてないかどうかを確認してから更新するという処理が行える。
※3・・・こちらのサイトを参照PHPでmemcachedを使うときのモジュールパフォーマンス比較


こちらはリビドーに赴くままlibmemcachedをPHPから使ってみるから抜粋
追記: kamipoさんより、はてブのご指摘でPECL::memcacheも3.0.0(alpha)より、casをサポートしているというご指摘いただきました。
よくよく見てみると確かにCasに限らずappendやバイナリプロトコルのサポートなどいままでほしかった機能が実装されています。(どんだけやる気なんだと作者に対して強く尊敬の念をいだきました)安定性やなどかんがみると、PECL::memcacheは非常に有力な候補となると個人的には思いますのでこれは別途調査してみたいとおもいますし皆様も選択の際はぜひ頭の隅にいれていただければ幸いです。
と、書かれているので、どちらもあまり機能的には差は無いのかもしれません。

ただ、グーグル先生にmemcachedを利用した複数サーバーの分散方法を調べてみると、
memcachedを利用した方法が圧倒的に多い気がします(´ヘ`;)ウーム…

最初は使えなかったという点のせいで、機能的な点でmemcachedが(・∀・)イイ!!
って事になってるっぽいですね。

そんな弊社もmemcachedを利用しています(`・ω・´)シャキーン
ただ、一部のサーバーでPHP5.1を利用している箇所があり、
そこではmemcacheを利用しています。

パフォーマンス的には、 こちらのサイトでパフォーマンスの比較をされていますが、
memcached モジュールのほうが早いという結果になりました。と書かれています。

インストールに関しては、他のモジュールに依存しないという点では、memcacheのが(・∀・)イイネ!!

とりあえず、memcachedをずっと使っているのでこっちを使っていこうかとは思います!(`・ω・´)シャキーン

以上(`・ω・´)ゞビシッ!!
参考URL

2013年1月25日金曜日

kagoya vpsを使ってみた。その4(初期設定)

前回からの続き。

初期設定として、次のソフトをインストールしたいと思います。
・host,nslookup,digコマンド
・Clam Antivirus
・DenyHosts

まずは、host,nslookup,digコマンドのインストール
kagoya vpsで、OSの選択時に最小単位でのインストールで行うと、
これらのコマンドが入っていないためインストールを行っておきます。

#インストール
yum install bind-utils

#hostコマンドの確認
# which host
/usr/bin/host

#digコマンドの確認
# which dig
/usr/bin/dig

#nslookupコマンドの確認
# which nslookup
/usr/bin/nslookup

Clam Antivirusのインストールを行いたいと思います。
Clam Antivirusはオープンソースで開発が行われているUNIX Linux用アンチウィルスソフトです。

■手順1)Clam Antivirusのインストール
yum install clamd
■手順2)設定ファイルの編集
/etc/clamd.confを編集します。
vi /etc/clamd.conf  

#LocalSocket /tmp/clamd.socket 
↓ 
LocalSocket /var/run/clamav/clamd.sock ←コメント解除&変更(ローカルソケットを指定) 
 
TCPSocket 3310 
↓ 
#TCPSocket 3310 ←コメントアウト(TCPSocketは使用しない) 
 
TCPAddr 127.0.0.1 
↓ 
#TCPAddr 127.0.0.1 ←コメントアウト 
 
User clam 
↓ 
#User clam ←コメントアウト(root権限で動作させる) 
/etc/freshclam.confを編集します。
vi /etc/freshclam.conf  

#/var/log/messagesに600秒ごとに出力されるログを出力しないようにする。
# Use system logger (can work together with LogFile).
# Default: no
LogSyslog yes #ここをコメントアウト
↓
#LogSyslog yes #ここをコメントアウト


DatabaseOwner clamav 
↓ 
DatabaseOwner root ←変更(root権限で動作させる) 
■手順3)ウィルス定義ファイル最新化
#更新
freshclam 
ClamAV update process started at Wed Dec 26 19:30:58 2012
main.cvd is up to date (version: 54, sigs: 1044387, f-level: 60, builder: sven)
WARNING: getfile: Unknown response from remote server (IP: 219.94.128.99)
WARNING: getpatch: Can't download daily-15409.cdiff from db.local.clamav.net
nonblock_connect: connect timing out (30 secs)
Can't connect to port 80 of host db.local.clamav.net (IP: 219.106.242.51)
Trying host db.local.clamav.net (203.212.42.128)...
WARNING: getfile: daily-15409.cdiff not found on remote server (IP: 203.212.42.128)
WARNING: getpatch: Can't download daily-15409.cdiff from db.local.clamav.net
WARNING: getfile: daily-15409.cdiff not found on remote server (IP: 27.96.54.66)
WARNING: getpatch: Can't download daily-15409.cdiff from db.local.clamav.net
WARNING: Incremental update failed, trying to download daily.cvd
Downloading daily.cvd [100%]
daily.cvd updated (version: 16109, sigs: 422109, f-level: 63, builder: neo)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 209, sigs: 40, f-level: 63, builder: neo)
Database updated (1466536 signatures) from db.local.clamav.net (IP: 211.10.155.48)
■手順4)起動
/etc/rc.d/init.d/clamd start 
ウイルス定義を最新にする前に実行すると、右のエラーになる "Starting Clam AntiVirus Daemon: LibClamAV Error: cl_cvdhead: Can't read CVD header in /var/clamav/daily.cld
LibClamAV Error: cli_loaddbdir(): error parsing header of /var/clamav/daily.cld
ERROR: Malformed database" 
成功時  
 Starting Clam AntiVirus Daemon:                            [  OK  ] 
起動時に自動起動
chkconfig clamd on
確認する
chkconfig --list clamd 
clamd           0:off   1:off   2:on    3:on    4:on    5:on    6:off 
■手順5)ウイルススキャンテスト
Infected filesが0であれば感染ファイルは無し。
#
clamscan --infected --remove --recursive 
  
----------- SCAN SUMMARY ----------- 
Known viruses: 1258767 
Engine version: 0.97.4 
Scanned directories: 1 
Scanned files: 13 
ウイルス感染ファイルは0 Infected files: 0 
Data scanned: 0.09 MB 
Data read: 0.09 MB (ratio 1.00:1) 
Time: 5.633 sec (0 m 5 s) 
■手順6)ウイルススキャン定期自動実行用にshを作成
/etc/cron.weekly/clamscanを作成する。
vi /etc/cron.weekly/clamscan
#!/bin/bash

yum -y update clamd > /dev/null 2>&1
/usr/bin/freshclam > /dev/null
/usr/bin/clamscan -i -r --remove /home >> /var/log/clamav/clamscan.log 2>&1
実行権限を与える
 
chmod +x /etc/cron.weekly/clamscan 
手動で実行
#
/etc/cron.weekly/clamscan 

#ログファイルが 作成される。
view /var/log/clamav/clamscan.log 
----------- SCAN SUMMARY -----------
Known viruses: 1638767
Engine version: 0.97.6
Scanned directories: 2
Scanned files: 3
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 3.585 sec (0 m 3 s)
■手順7)ログローテーション設定
vi /etc/logrotate.d/clamscan 
/var/log/clamav/clamscan.log {
        monthly
        rotate 4
        missingok
}


DenyHostsのインストール。
■手順8)DenyHostsのインストール。
yum --enablerepo=epel install denyhosts
■手順9)DenyHostsの起動
#起動する
/etc/init.d/denyhosts start

#自動起動をオンにする
chkconfig denyhosts on
プロセスが立ち上がっているか確認
ps -fe | grep -i [d]eny
root       963     1  0 Jan24 ?        00:00:00 /usr/bin/python /usr/bin/denyhosts.py --daemon --config=/etc/denyhosts.conf
設定ファイルなどには次のものがあるそうです。
色々設定ができるみたいですね(・∀・)イイネ!!
#不正なアクセスがあった場合は、以下のファイルに記録されます。
view  /etc/hosts.deny

#例外的に、アクセスを許可するIPアドレスは
view  /var/lib/denyhosts/allowed-hosts

#プロトコルごとにアクセスを許可する事が出来る
view /etc/hosts.allow
たまに、rootユーザーでSSH接続してしまい、
社内のIPアドレスがブロックされてしまうことが度々・・・orz

その場合には、別サーバーからログインして、
/etc/hosts.denyのファイルに書かれている社内のIPアドレスを削除し、
/var/lib/denyhosts/allowed-hostsのファイルに社内のIPアドレスを追加して解決しています:(;゙゚'ω゚'):
皆さん気をつけてください(´;ω;`)ブワッ

以上(`・ω・´)ゞビシッ!!
参考URL

MyDNSのインストール

もしかしたら後々、はMySQL MHAで利用するかもしれないので、
MyDNSサーバーを試してみました(`・ω・´)シャキーン

MyDNSはDNS情報をMySQLやPostgreSQLなどで管理が出来るらしいです(・∀・)イイネ!!
DNSラウンドロビンを使って振り分けを行える、その際に重みをつけることも可能。
ただし、振り分け先の死活監視は行わない。
後は、phpで動くDNS情報登録画面があるとか!

似たものとして、GREE製のPrimDNSとか、PowerDNS、AmazonRoute53などがあります。

PowerDNSもやってみたいけどとりあえず、
DeNAでMyDNSは使われているそうなので、こちらからテストを試したいと思います。

こちらの会社さんでは、スマートフォンゲーム開発で利用されているそうです。
「Lord of Knights の裏側見せます!~Unity + PHP + MySQL で作るスマートフォンゲーム開発~」の資料を公開しましたから抜粋
MyDNSを使った名前解決
→面倒なhosts管理から開放される
→MySQLで管理が楽
こんな用途に使っている
・デプロイ先サーバーの決定
→wwwサーバの追加などにも柔軟に対応
・DBスレイブのラウンドロビン
→アプリ側がシンプルに
・DBスレイブの参照率調整
→サーバの負荷に応じて参照率を調整できる
→DBバックアップ時に参照から外して終わったら自動で戻す

MyDNSのインストール前に、こちらの記事を参考にMySQLのインストールを済ませておいてください。
それとepelリポジトリが追加されていない場合には、追加をしておいてください。(こちらの記事を参考)

それでは、インストールを行いたいと思います( ̄ー ̄)ニヤリ

■手順1)インストール
#epelリポジトリが追加されている確認
rpm -q epel-release
epel-release-6-8.noarch

#mydnsのインストール
yum install mydns
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
epel/metalink                                                                                                                                                    | 3.4 kB     00:00
 * base: mirror.fairway.ne.jp
 * centosplus: mirror.fairway.ne.jp
 * elrepo: repos.lax-noc.com
 * epel: ftp.jaist.ac.jp
 * extras: mirror.fairway.ne.jp
 * rpmforge: mirror.fairway.ne.jp
 * updates: mirror.fairway.ne.jp
base                                                                                                                                                             | 3.7 kB     00:00
centosplus                                                                                                                                                       | 3.5 kB     00:00
elrepo                                                                                                                                                           | 1.9 kB     00:00
elrepo/primary_db                                                                                                                                                | 526 kB     00:01
epel                                                                                                                                                             | 4.3 kB     00:00
http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/repodata/repomd.xml: [Errno -1] repomd.xml does not match metalink for epel
Trying other mirror.
epel                                                                                                                                                             | 4.3 kB     00:00
epel/primary_db                                                                                                                                                  | 5.0 MB     00:00
extras                                                                                                                                                           | 3.5 kB     00:00
rpmforge                                                                                                                                                         | 1.9 kB     00:00
updates                                                                                                                                                          | 3.5 kB     00:00
updates/primary_db                                                                                                                                               | 4.6 MB     00:09
vz-base                                                                                                                                                          |  951 B     00:00
vz-updates                                                                                                                                                       |  951 B     00:00
162 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mydns.x86_64 0:1.2.8.31-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================================
 Package                                   Arch                                       Version                                            Repository                                Size
========================================================================================================================================================================================
Installing:
 mydns                                     x86_64                                     1.2.8.31-1.el6                                     epel                                     109 k

Transaction Summary
========================================================================================================================================================================================
Install       1 Package(s)

Total download size: 109 k
Installed size: 267 k
Is this ok [y/N]:
Downloading Packages:
mydns-1.2.8.31-1.el6.x86_64.rpm                                                                                                                                  | 109 kB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : mydns-1.2.8.31-1.el6.x86_64                                                                                                                                          1/1
  Verifying  : mydns-1.2.8.31-1.el6.x86_64                                                                                                                                          1/1

Installed:
  mydns.x86_64 0:1.2.8.31-1.el6

Complete!

#mydns-mysqlのインストール
# yum install mydns-mysql
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * base: mirror.fairway.ne.jp
 * centosplus: mirror.fairway.ne.jp
 * elrepo: repos.lax-noc.com
 * epel: ftp.jaist.ac.jp
 * extras: mirror.fairway.ne.jp
 * rpmforge: mirror.fairway.ne.jp
 * updates: mirror.fairway.ne.jp
162 packages excluded due to repository priority protections
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mydns-mysql.x86_64 0:1.2.8.31-1.el6 will be installed
--> Processing Dependency: libmysqlclient.so.16(libmysqlclient_16)(64bit) for package: mydns-mysql-1.2.8.31-1.el6.x86_64
--> Processing Dependency: libmysqlclient.so.16()(64bit) for package: mydns-mysql-1.2.8.31-1.el6.x86_64
--> Running transaction check
---> Package mysql-libs.x86_64 0:5.1.66-2.el6_3 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================================================================================================
 Package                                      Arch                                    Version                                            Repository                                Size
========================================================================================================================================================================================
Installing:
 mydns-mysql                                  x86_64                                  1.2.8.31-1.el6                                     epel                                     152 k
Installing for dependencies:
 mysql-libs                                   x86_64                                  5.1.66-2.el6_3                                     updates                                  1.2 M

Transaction Summary
========================================================================================================================================================================================
Install       2 Package(s)

Total download size: 1.4 M
Installed size: 4.6 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): mydns-mysql-1.2.8.31-1.el6.x86_64.rpm                                                                                                                     | 152 kB     00:00
(2/2): mysql-libs-5.1.66-2.el6_3.x86_64.rpm                                                                                                                      | 1.2 MB     00:02
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                   428 kB/s | 1.4 MB     00:03
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : mysql-libs-5.1.66-2.el6_3.x86_64                                                                                                                                     1/2
  Installing : mydns-mysql-1.2.8.31-1.el6.x86_64                                                                                                                                    2/2
  Verifying  : mysql-libs-5.1.66-2.el6_3.x86_64                                                                                                                                     1/2
  Verifying  : mydns-mysql-1.2.8.31-1.el6.x86_64                                                                                                                                    2/2

Installed:
  mydns-mysql.x86_64 0:1.2.8.31-1.el6

Dependency Installed:
  mysql-libs.x86_64 0:5.1.66-2.el6_3

Complete!
インストールされたファイル郡の確認
rpm -qs mydns-mysql
通常          /usr/bin/mydns-conf-mysql
通常          /usr/bin/mydnscheck-mysql
通常          /usr/bin/mydnsexport-mysql
通常          /usr/bin/mydnsimport-mysql
通常          /usr/bin/mydnsptrconvert-mysql
通常          /usr/sbin/mydns-mysql
通常          /usr/share/doc/mydns-mysql-1.2.8.31
通常          /usr/share/doc/mydns-mysql-1.2.8.31/QUICKSTART.mysql
インストールされたファイル郡の確認 インストール先の確認
# which mydns-mysql
/usr/sbin/mydns-mysql
■手順2)初期設定
MySQLが起動されている状態で、次のコマンドを実行する
mydnsで利用するデータベースの作成とテーブルの初期化
#mydnsデータベース作成
mysqladmin -u root create mydns

#DB初期化
mydns --create-tables | mysql -u root
MySQLにログインして、mydnsというデータベースが作られていて、テーブルが作成されていること。(rr,soa)を確認する
#初期化の確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydns              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use mydns;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mydns |
+-----------------+
| rr              |
| soa             |
+-----------------+
2 rows in set (0.00 sec)
mydns用のユーザーを作成する。
#
mysql> SELECT user, host, password, Super_priv FROM mysql.user;
+------+----------------------+----------+------------+
| user | host                 | password | Super_priv |
+------+----------------------+----------+------------+
| root | localhost            |          | Y          |
| root | 127.0.0.1            |          | Y          |
| root | ::1                  |          | Y          |
|      | localhost            |          | N          |
+------+----------------------+----------+------------+
6 rows in set (0.00 sec)

#データベースmydnsに対して、全ての権限を持ったユーザー(全てのホストからのアクセス許可)
mysql> GRANT ALL ON mydns.* TO 'mydns'@'%' IDENTIFIED BY 'mydns';
Query OK, 0 rows affected (0.01 sec)

#localhostからの接続を許可する
GRANT ALL ON mydns.* TO 'mydns'@'localhost' IDENTIFIED BY 'mydns';

#反映
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

#確認
mysql> SELECT user, host, password, Super_priv FROM mysql.user;
+-------+----------------------+-------------------------------------------+------------+
| user  | host                 | password                                  | Super_priv |
+-------+----------------------+-------------------------------------------+------------+
| root  | localhost            |                                           | Y          |
| root  | 127.0.0.1            |                                           | Y          |
| root  | ::1                  |                                           | Y          |
|       | localhost            |                                           | N          |
| mydns | %                    | *B7B4811564198A1572E55AA11AAFADBA7A000BFC | N          |
| mydns | localhost            | *B7B4811564198A1572E55AA11AAFADBA7A000BFC | N          |
+-------+----------------------+-------------------------------------------+------------+
■手順3)mydnsの設定ファイルを編集する
mydnsの設定ファイルを編集する。
#
view /etc/mydns.conf

#先程作成したユーザー名やパスワードを設定する
db-host = localhost             # SQL server hostname
db-user = mydns                 # SQL server username
db-password = mydns             # SQL server password
database = mydns                # MyDNS database name

#
rr-where = aux>0   # aux が 0 のレコードにはラウンドロビンしないようにするため
■手順4)起動する バックグラウンドで起動する
UDP53ポートで待ち受け開始される。(必要に応じてiptablesを変更する)
#
/etc/init.d/mydns start
OR
#
mydns -b
OR
mydns -background

#プロセスの確認
# ps aux|grep mydns
mydns     2858  0.0  0.0 123344  1520 ?        Ss   18:04   0:00 mydns -b
mydns     2859  0.0  0.0 123640  1312 ?        S    18:04   0:00 mydns -b
root      2861  0.0  0.0 107456   940 pts/0    S+   18:04   0:00 grep mydns
■手順5)webからの管理画面の設定
インストール時に用意されているadmin.phpを利用します。
#管理画面用のphpの配置
cp /usr/share/mydns/admin.php /var/www/html/
admin.phpにデータベースの接続情報を記述します。
#36行目辺りのデータベース接続情報を変更する
vi /var/www/html/admin.php

$dbhost = "localhost";
$dbuser = "作成したユーザー名";
$dbpass = "作成したユーザーのパスワード";
$dbname = "mydns";
■手順6)手順5で設置したWeb用の管理画面からホストの登録を行う。

先程設定したadmin.phpにアクセスすると、 ホストの登録画面が表示されると思いますので、
そこに次の画像用に入力してください。
 (一般的なDNS情報の登録と同じ手順になるかと思います。)

※Aには、「example.com.」と感じに、最後にドットを付けるのを忘れずにド━(゚Д゚)━ン!!
※aux値はラウンドロビン時の重み値になる。値が小さいほど振り分けられる。
0の場合にはそのサーバーのみの振り分けになる。ただし、/etc/mydns.confで、rr-where = aux > 0の記述が無い場合のみ

入力後、「Add new SOA」を押すと、ホストの登録が完了します。
完了すると、下に「Add new RR」という行の枠が出てきている思います。

そこに、問い合わせがあったホストと紐付けたいIPアドレスの登録を行います。
今回はslaveサーバー2台のIPアドレスを「server1.example.com」というホストに紐付け、
ラウンドロビンを行いたいと思います。

2台分の情報を入力し終わると、次のようになっているかと思います。


■手順7)MyDNSの動作確認

MyDNSサーバーとは別のサーバーからhost,nslookup,digなどを行い、
MyDNSに登録した「server1.example.com」というホストが正しく名前解決が行われるか確認する。

まず、接続を行うサーバーの/etc/resolv.confの編集を行い、
DNSサーバーをMyDNSサーバーへ向けます。

/etc/resolv.confには、そのサーバーが利用するDNSサーバーの情報が書かれています。
ここに今回設定したMyDNSサーバーのIPアドレスを記述することで、
MyDNSサーバーを経由するようになります。

記述の方法は、次のようになっています。
nameserver IPアドレス
最大で3つまで登録が可能で、上から順番に問い合わせが実行されます。
ここのIPアドレスを今回のMyDNSサーバーのIPアドレスに変更します。

注意点として、情報をMyDNSサーバーだけの情報にすると、
MyDNSサーバーに登録されていないホストは全てエラーになってしまいます。

とりあえず、/etc/resolv.confのnameserver行の一番上に、 今回のMyDNSサーバーのIPアドレスを指定しておけば問題ないかな?
#一番上に追加
nameserver MyDNSサーバーのIPアドレス
次に、実際にMyDNSへ問い合わせを行います。 kagoya vpsで、OSの選択時に、最小単位のインストールを行った場合には、 host,nslookup,digがインストールされていなかったので、インストールを行う。
#host,nslookup,digのインストール
yum install bind-utils
MyDNSへ問い合わせてみる+(0゚・∀・) + ワクテカ +
#
host server1.example.com
server1.example.com has address slave1サーバーIPアドレス
server1.example.com has address slave2サーバーIPアドレス

#
nslookup server1.example.com
Server:         MyDNSサーバーIPアドレス
Address:        MyDNSサーバーIPアドレス#53

Name:   server1.example.com
Address: slave1サーバーIPアドレス
Name:   server1.example.com
Address: slave2サーバーIPアドレス

(゚∀゚)キタコレ!!
■手順8)PHPからの動作確認
手順7でMyDNSサーバーが正しく動作していることが確認できたので、
次はPHPから接続した際に正しく動いているか確認したいと思います。

slave1とslave2どちらに繋がったのか確認する為に、
面倒なのでslave2のMySQLだけに次のユーザーを作成しておきます:(;゙゚'ω゚'):

GRANT ALL ON *.* TO 'server2'@'%' IDENTIFIED BY 'パスワード';
次のプログラムは、MySQLに接続しユーザー名が「server2」の情報を取得して表示するプログラムになっています。
<?php
$link = mysql_connect('server1.example.com', '接続ユーザー名', '接続ユーザーのパスワード');
if (!$link) {
    die('接続失敗です。'.mysql_error());
}

$db_selected = mysql_select_db('データベース名', $link);
if (!$db_selected){
    die('データベース選択失敗です。'.mysql_error());
}

$result = mysql_query("SELECT user, host, password, Super_priv FROM mysql.user WHERE user = 'server2';");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    var_dump( $row["user"] . ":" . $row["host"]);
}

mysql_free_result($result);
?>
このプログラムをphpが動くサーバーで数十回実行すると、
次のような結果になります。

「server2:192.168.0.5」と表示されている場合には、slave2に繋がっている事を表します。
11回目の実行時に、何も表示されていませんが、これはSELECTと一致するデータが無かったという事なので、
slave1に繋がっている事を表しています。( ´∀`)bグッ!

手順6のホスト設定時に、slave1,slave2の設定で、IPアドレスの横にある値に、
slave1に100、slave2に10を入力したと思います。
この値がDNSラウンドロビンの振り分け時の重み(aux)値になり、
今回の設定では1:10となるので、10回に1回slave1に振り分けるという意味になります。

値が小さいほど、振り分けられる確立が高くなります。
0の場合には、そのサーバーのみに振り分けられるようになる。
※ただし、/etc/mydns.confで、rr-where = aux > 0の記述が無い場合のみ
#1回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#2回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#3回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#4回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#5回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#6回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#7回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#8回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#9回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#10回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
#11回目
php /var/www/html/test.php
#12回目
php /var/www/html/test.php
string(22) "server2:192.168.0.5"
※/etc/resolv.confでMyDNSを経由するようになっているサーバーで行うこと
以上(`・ω・´)ゞビシッ!!

そういえば、何かパッチを当てないとDNSラウンドロビンでの重み付けの振り分けが出来ない!!ヽ(`Д´)ノプンプン
みたいなことが結構書かれていましたが普通に出来ていたのは・・・なぜだっ!!
と、疑問に思ってインストール情報を見てみると
次のように書かれていて、URLの先を飛んでみると、
こっちの公式ではなくて、使っているMyDNSはこっちだったみたいです((((;゚Д゚))))ガクガクブルブル
MyDNSは2006年から開発が止まっているけど、MyDNS-ngは今でも開発が続いてるみたいで、
こっちならデフォルトでDNSラウンドロビンの重み付けも使えるってことなのかな?(´ヘ`;)ウーム…

Name        : mydns
Arch        : x86_64
Version     : 1.2.8.31
Release     : 1.el6
Size        : 267 k
Repo        : installed
From repo   : epel
Summary     : A Database based DNS server
URL         : http://mydns-ng.com/
License     : GPLv2+
Description : A nameserver that serves records directly from your database.

参考URL

2013年1月23日水曜日

複数プロセスの起動

memcachedの複数プロセスでの起動を行いたいと思います。

■複数プロセスにするメリット・デメリットについて
メリット
・各サービスごとに領域を分けて使えて、管理が行える。(キャッシュのリセットなど)
・キャッシュ領域の上限に達した場合に、領域確保のため自動で消される場合に、別サービスのキャッシュを消してしまう可能性がなくなる?

デメリット
・メモリの使用率が増えてしまう。
・サービス単位でmemcachedサーバーが必要になる。

弊社では、セッション用、有効期限が短期間、有効期限が長期間用、永続性が必要なもの、
という風にキャッシュの領域を分けて利用しています。

それでは設定を行っていきたいと思います(`・ω・´)シャキーン

■手順1)複数プロセス用に設定ファイルを複製する
#デフォルトの設定ファイルをバックアップとしてとっておく
cp -p /etc/sysconfig/memcached /etc/sysconfig/memcached.backup

#各プロセス用の設定ファイルを保存するディレクトリを作成する
mkdir /etc/sysconfig/memcached

#デフォルトの設定ファイルをコピーする。(ファイル名は利用するポート番号にしてあります)
cp -p /etc/sysconfig/memcached.backup /etc/sysconfig/memcached/11212
cp -p /etc/sysconfig/memcached.backup /etc/sysconfig/memcached/11213
11212の設定ファイルを編集する
vi /etc/sysconfig/memcached/11212
#ポート番号
PORT="11212"
#実行ユーザー
USER="memcached"
#最大同時接続数(デフォルト1024)
MAXCONN="1024"
#利用するメモリサイズ(単位はMB)32bitでは3GBまでしか有効にならない。
CACHESIZE="64"
#オプション
#
OPTIONS="-d -vv 1>> /var/log/memcached/11212.log 2>> /var/log/memcached/11212.log"
11213の設定ファイルを編集する
vi /etc/sysconfig/memcached/11213
#ポート番号
PORT="11213"
#実行ユーザー
USER="memcached"
#最大同時接続数(デフォルト1024)
MAXCONN="1024"
#利用するメモリサイズ(単位はMB)32bitでは3GBまでしか有効にならない。
CACHESIZE="64"
#オプション
#
OPTIONS="-d -vv 1>> /var/log/memcached/11213.log 2>> /var/log/memcached/11213.log"
ログファイル用のディレクトリ作成
#
mkdir /var/log/memcached

#権限を付与
chmod 777 /var/log/memcached/
■手順2)起動スクリプトを作成する

デフォルトの起動スクリプトを変更して、
起動や停止時のコマンドを実行する際に、
ポート番号を指定することで、指定されたポート番号で起動しているmemcachedのみを
対象に実行するようにしました( ̄ー ̄)ニヤリ
#デフォルトの起動スクリプトをコピーする
cp -p /etc/init.d/memcached /etc/init.d/memcached-multi
/etc/init.d/memcached-multiを作成する
#新規作成
vi /etc/init.d/memcached-multi
#! /bin/sh
#
# chkconfig: - 55 45
# description:  The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# pidfile: /var/run/memcached/memcached.pid

# Standard LSB functions
#. /lib/lsb/init-functions

# Source function library.
. /etc/init.d/functions

#設定ファイルが無かった場合に利用されるデフォルト設定値
PORT=11211
USER=memcached
MAXCONN=1024
CACHESIZE=64
OPTIONS=""

#コマンド引数の第2引数の値(ポート番号)が数値かチェック
arg1=${2}
expect_empty=`echo -n ${arg1} | sed 's/[0-9]//g'`
if [ "x" = "x${arg1}" ] || [ "x" != "x${expect_empty}" ]
then
        echo "ポート番号には数値のみ指定が行えます。(デフォルト:11211)"
        exit 0
else
        PORT=$2
fi

#ポート番号ごとに振り分けた設定ファイルが置かれているディレクトリのパスを指定
PATH_CONFIG_BASE=/etc/sysconfig/memcached/
#利用される設定ファイルのパス
FILE_CONFIG=${PATH_CONFIG_BASE}${PORT}

#設定ファイルのチェック
if [ -f ${FILE_CONFIG} ];then
        . ${FILE_CONFIG}
fi


# Check that networking is up.
. /etc/sysconfig/network

if [ "$NETWORKING" = "no" ]
then
        exit 0
fi

RETVAL=0
prog="memcached"
pidfile=${PIDFILE-/var/run/memcached/memcached_${PORT}.pid}
lockfile=${LOCKFILE-/var/lock/subsys/memcached_${PORT}}

#echo $FILE_CONFIG
#echo $pidfile
#echo $lockfile

start () {
        echo -n $"Starting $prog: "
        # Ensure that $pidfile directory has proper permissions and exists
        piddir=`dirname $pidfile`
        if [ ! -d $piddir ]; then
                mkdir $piddir
        fi
        if [ "`stat -c %U $piddir`" != "$USER" ]; then
                chown $USER $piddir
        fi

        daemon --pidfile ${pidfile} memcached -d -p $PORT -u $USER  -m $CACHESIZE -c $MAXCONN -P ${pidfile} $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop () {
        echo -n $"Stopping $prog: "
        killproc -p ${pidfile} /usr/bin/memcached
        RETVAL=$?
        echo
        if [ $RETVAL -eq 0 ] ; then
                rm -f ${lockfile} ${pidfile}
        fi
}

restart () {
        stop
        start
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status -p ${pidfile} memcached
        RETVAL=$?
        ;;
  restart|reload|force-reload)
        restart
        ;;
  condrestart|try-restart)
        [ -f ${lockfile} ] && restart || :
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}"
        RETVAL=2
        ;;
esac

exit $RETVAL
■手順3)起動してみる。
11212ポート番号でプロセスを起動して、確認する
#起動
/etc/init.d/memcached-multi start 11212
memcached を起動中:                                        [  OK  ]

#pidの確認
ls -alt /var/run/memcached/
合計 16
drwxr-xr-x  2 memcached memcached 4096  1月 23 13:04 2013 .
-rw-r--r--  1 memcached memcached    6  1月 23 13:04 2013 memcached_11212.pid

#lockfileの確認
ls -alt /var/lock/subsys/memcached*
-rw-r--r-- 1 root root 0  1月 23 13:04 2013 /var/lock/subsys/memcached_11212
11213ポート番号でプロセスを起動して、確認する
#起動
/etc/init.d/memcached-multi start 11213
memcached を起動中:                                        [  OK  ]

#
ls -alt /var/run/memcached/
合計 20
drwxr-xr-x  2 memcached memcached 4096  1月 23 13:07 2013 .
-rw-r--r--  1 memcached memcached    6  1月 23 13:07 2013 memcached_11213.pid
-rw-r--r--  1 memcached memcached    6  1月 23 13:04 2013 memcached_11212.pid
drwxr-xr-x 17 root      root      4096  1月 22 13:32 2013 ..
#
ls -alt /var/lock/subsys/memcached*
-rw-r--r-- 1 root root 0  1月 23 13:07 2013 /var/lock/subsys/memcached_11213
-rw-r--r-- 1 root root 0  1月 23 13:04 2013 /var/lock/subsys/memcached_11212
■手順4)接続を試してみる。
#11212ポート番号の接続確認を行う
telnet localhost 11212
Trying ::1...
Connected to localhost.
Escape character is '^]'.
quit
Connection closed by foreign host.

#11213ポート番号の接続確認を行う
telnet localhost 11213
Trying ::1...
Connected to localhost.
Escape character is '^]'.
quit
Connection closed by foreign host.
■手順5)外部からの接続確認を行う。
前回の記事の手順で設定を行っている場合には、
iptablesで接続元のIPアドレス制限と、11211のポート番号しか開放していないので、
今回設定した11212,11213ポート番号の開放も行うこと。
#プロトコルがtcpで、ポート番号が11211、送信元の接続開始パケット(新規接続)を許可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 11211 -s memcachedに接続するサーバーIPアドレス -j ACCEPT
↓変更
#プロトコルがtcpで、ポート番号が11211から11219までの連番、送信元の接続開始パケット(新規接続)を許可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 11211:11219 -s memcachedに接続するサーバーIPアドレス -j ACCEPT
接続の確認を行う。
$ telnet memcachedサーバーのIPアドレス 11212
Trying ***.***.***.**...
Connected to ***.***.***.**.
Escape character is '^]'.
quit
Connection closed by foreign host.

$ telnet memcachedサーバーのIPアドレス 11213
Trying ***.***.***.**...
Connected to ***.***.***.**.
Escape character is '^]'.
quit
Connection closed by foreign host.
■手順6)自動起動設定用のシェルスクリプト作成

いつも通りに、chkconfigを使って自動起動設定を行いたいところですが、
今回作成した/etc/init.d/memcached-multiでは実行時にポート番号を指定しないといけないので、
別のやりかたで登録する必要があります。
(memcached-multiの中に使用するポート番号の一覧などを持たせてしまい、
ループなどで複数起動できるようにしてしまえば
chkconfig memcached-mulit onだけでいける気がしますが・・・:(;゙゚'ω゚'):)

chkconfigを使わずにLinuxは起動時に独自のプログラムを実行させたい場合には、
「etc/rc.d/rc.local」ファイルに起動コマンドに実行したいコマンドを記述すれば(・∀・)イイ!!

そのまえに、複数プロセスを起動するだけのシェルスクリプトを作っておきます。
#新規作成
vi /root/memcached-multi.sh
#############################
#
# memcachedの複数プロセス起動用シェル
# (OS起動時にも実行される)
#
#############################
#!/bin/sh

#11212ポート番号でプロセスを起動する
/etc/init.d/memcached-multi $1 11212

#11213ポート番号でプロセスを起動する
/etc/init.d/memcached-multi $1 11213
ファイルに実行権限を与えて、正しく動くか確認する。
#実行権限を与える
chmod +x /root/memcached-multi.sh

#複数プロセスの停止の確認
/root/memcached-multi.sh stop
memcached を停止中:                                        [  OK  ]
memcached を停止中:                                        [  OK  ]

#プロセスの確認
# ps axu|grep memcached
root     28322  0.0  0.0 107456   936 pts/0    S+   14:49   0:00 grep memcached

#複数プロセスの開始の確認
# /root/memcached-multi.sh start
memcached を起動中:                                        [  OK  ]
memcached を起動中:                                        [  OK  ]

#プロセスの確認
# ps axu|grep memcached
497      28334  0.0  0.0 339964  1236 ?        Ssl  14:50   0:00 memcached -d -p 11212 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached_11212.pid -d -vv
497      28351  0.0  0.0 339964  1244 ?        Ssl  14:50   0:00 memcached -d -p 11213 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached_11213.pid -d -vv
root     28359  0.0  0.0 107456   940 pts/0    S+   14:50   0:00 grep memcached
■手順7)OS動時に手順6で作成したシェルスクリプトが実行されるようにする。
/etc/rc.d/rc.localを編集または新規作成
vi /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

#memcached-multi自動起動用スクリプトの実行
/root/memcached-multi.sh start
以上(`・ω・´)ゞビシッ!!

後は、OSの再起動を行ってみて自動で起動しているか確認してみる(ΦωΦ)フフフ…

参考URL

PHP(と拡張ライブラリ)のインストール

この項目では、php、pear、peclのインストール(とビルド)を行っていきます。
pearはPHPで記載された拡張ライブラリ、peclはC言語で記載された拡張ライブラリです。

①phpとpearのインストール
yumを使用します。レポジトリをremiに指定しました。
$ yum --enablerepo=remi install php php-devel php-mbstring php-mysql
$ yum --enablerepo=remi install php-pear
バージョンの確認をします。
$ php -v
↓
$ PHP  5.4.11 (cli) (built: Jul  3 2012 16:53:21)
$ Copyright (c) 1997-2010 The PHP Group

②pearのインストール
まずpearをインストールします。
$ yum -y install php-pear
続いて必要なパッケージをインストールします。
$ pear install Auth_SASL
$ pear install Crypt_Blowfish
$ pear install DB
$ pear install Mail
$ pear install Mail_Mime
$ pear install Mail_mimeDecode
$ pear install Net_IPv4
$ pear install Net_SMTP
$ pear install Net_UserAgent_Mobile
インストール内容を確認します。
$ pear list
↓
Installed packages, channel pear.php.net:
=========================================
Package              Version State
Archive_Tar          1.3.7   stable
Auth_SASL            1.0.6   stable
Console_Getopt       1.2.3   stable
Crypt_Blowfish       1.0.1   stable
DB                   1.7.14  stable
Mail                 1.2.0   stable
Mail_Mime            1.8.7   stable
Mail_mimeDecode      1.5.5   stable
Net_IPv4             1.3.4   stable
Net_SMTP             1.6.1   stable
Net_Socket           1.0.10  stable
Net_UserAgent_Mobile 1.0.0   stable
PEAR                 1.9.4   stable
Structures_Graph     1.0.4   stable
XML_RPC              1.5.4   stable
XML_Util             1.2.1   stable


③peclのインストール。
phpの必要なパッケージをインストールします。
$ yum -y install php-devel
apacheの必要なパッケージをインストールします。
$ yum -y install httpd-devel
peclはC言語なので、gccのコンパイラをインストールします。
$ yum -y install gcc gcc-c++

これでpeclが利用できるようになるはずなので、以下のパッケージを順にインストールしていきます。
  • memcached
  • APC
  • igbinary
  • imagick
  • ssh2
  • xdebug

・memcached
memcachedはlibmemcachedに依存しているそうなので、まずlibmemcachedをインストールします。リポジトリはPHPと同じくremiを使用します。
$ yum --enablerepo=remi install libmemcached
続いてpeclのmemcachedをインストールします。
$ yum --enablerepo=remi install php-pecl-memcached
以上でmemcachedのインストールは完了です。

・APC
リポジトリはPHPと同じくremiを使用します。
$ yum --enablerepo=remi install php-pecl-apc
以上でapcのインストールは完了です。

・igbinary
リポジトリはPHPと同じくremiを使用します。
$ yum --enablerepo=remi install php-pecl-igbinary

以上でigbinaryのインストールは完了です。

・imagick
ImageMagick-develをインストールします。
$ yum install ImageMagick-devel
続いてimagickをインストールします。リポジトリはPHPと同じくremiを使用します。
$ yum --enablerepo=remi install php-pecl-imagick
以上でapcのインストールは完了です。

・ssh2
ssh2をインストールします。リポジトリはPHPと同じくremiを使用します。
$ yum --enablerepo=remi install php-pecl-ssh2
以上でapcのインストールは完了です。

・xdebug
xdebugをインストールします。リポジトリはPHPと同じくremiを使用します。
$ yum --enablerepo=remi install php-pecl-ssh2
以上でxdebugのインストールは完了です。

必要なパッケージは以上で完了ですので、インストール内容を確認します。
$ pecl list
↓
Installed packages, channel pecl.php.net:
=========================================
Package   Version State
APC       3.1.14   beta
imagick   3.1.0RC2 beta
memcached 2.1.0    stable
ssh2      0.12     beta
xdebug    2.2.1    stable

以上で、phpとパッケージのインストールは完了です。


本項目は下記ページを参考にさせて頂きました。
pear===============================
http://blog.layer8.sh/ja/2011/12/12/centos%E3%81%AByum%E7%B5%8C%E7%94%B1%E3%81%A7pear%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/
http://pear.php.net/manual/ja/guide.users.commandline.installing.php
apc===============================
imagick===============================
http://blog.flatlabs.net/20101007_233922/
ssh2========================================
xdebug===================================

2013年1月22日火曜日

memcachedのインストール&設定

■memcachedとは?
memcachedを知り尽くすから抜粋 http://gihyo.jp/dev/feature/01/memcached/0001
memcachedは,LiveJournalを運営していたDanga Interactive社で,Brad Fitzpatrick氏が中心となって開発されたソフトウェアです。

現在ではmixiやはてな,Facebook,Vox,LiveJournalなど,さまざまなサービスでWebアプリケーションのスケーラビリティを向上させる重要な要素になっています。

多くのWebアプリケーションは,RDBMSにデータを格納し,アプリケーションサーバでそのデータを引き出してブラウザ等に表示させています。
しかしデータが大量になったり,アクセスが集中すると,RDBMSの負荷があがり,データベースのレスポンスが悪化し,Webサイトの表示が遅延するなど大きな影響がでてしまいます。

そこでmemcachedが活躍します。memcachedは高性能な分散メモリキャッシュサーバです。
通常,データベースへの問い合わせ結果を一時的にキャッシュすることで,
データベースへのアクセス回数を減らし,動的なウェブアプリケーションの高速化やスケーラビリティの向上のために利用されています。

弊社のシステムでは、セッション情報や、更新頻度が少ないデータ、
API結果などをmemcachedで保存させ利用しています。

以前は、memcachedを利用せずに、各サーバーで直接静的なファイルとして出力し、
その結果をそのまま利用するという形を使っていた頃もありましたが、
負荷分散のためサーバーが増えていくと管理が大変という点と、
静的ファイルよりインメモリのmemcachedの方が高速らしいです(゚д゚)!

静的ファイルを生成すると、ファイルシステムのバッファリング遅延とIO負荷が増えてしまう。
ネットワークコストが大きい場合や、ディスクI/Oに対してメモリが不足しているとか以外ではmemcachedのが(・∀・)イイ!!

memcachedをセッション機能として利用するだけでも結構便利です!
ド━━━━m9(゚∀゚)━━━━ン!!

■メリット
・高速。
・RDBMSの負荷を軽減できる。
・静的ファイルの管理がなくなる分楽チン

■デメリット
・キャッシュが消失する可能性がある。(永続性が無くOSやmemcachedが再起動された場合には全て消える。また、有効期限やキャッシュサイズの上限値を超えた場合には自動で古いから消えたりする。)
・RDBMSみたいに複雑な条件を利用した検索などが行えない。
・トランザクション処理が無かったり、データをどのタイミングで更新するのかなどはアプリケーション側でやる必要があり、データの最新状態、不整合の管理は大変。

※デメリットの消失する可能性がある問題は、永続KVSであるTokyoTyrantとKyotoTycoonなどで解決可能。(Memcached互換あり)
※ファイルキャッシュとmemcachedの比較はこちらの方がされています。

それではインストール&設定を行って行きたいと思います!
■手順1)インストールする。 memcachedをインストールするにはlibeventが必要な為、インストールする
#libeventのインストール
yum install libevent
  Installing : libevent-1.4.13-4.el6.x86_64                                                                                                                                                  1/1
  Verifying  : libevent-1.4.13-4.el6.x86_64                                                                                                                                                  1/1

Installed:
  libevent.x86_64 0:1.4.13-4.el6

Complete!
libevent-develのインストール
yum install libevent-devel
Installed:
  libevent-devel.x86_64 0:1.4.13-4.el6

Dependency Installed:
  libevent-doc.noarch 0:1.4.13-4.el6                                                            libevent-headers.noarch 0:1.4.13-4.el6

Complete!
memcachedのインストール
yum --enablerepo=remi install memcached

memcached-1.4.15-2.el6.remi.x86_64.rpm                                                                                                                                    |  79 kB     00:01
警告: rpmts_HdrFromFdno: ヘッダ V3 DSA/SHA1 Signature, key ID 00f97f56: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
Importing GPG key 0x00F97F56:
 Userid : Remi Collet <RPMS@FamilleCollet.com>
 Package: remi-release-6-1.el6.remi.noarch (installed)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : memcached-1.4.15-2.el6.remi.x86_64                                                                                                                                            1/1
  Verifying  : memcached-1.4.15-2.el6.remi.x86_64                                                                                                                                            1/1

Installed:
  memcached.x86_64 0:1.4.15-2.el6.remi

Complete!
※memcachedのバグがあるそうなので、memcachedのバージョンは、1.4.7以降のものをなるべく利用すること。ヽ(゚∀。)ノ
詳しく知りたい方はこちらを読んでみてください
mixi大規模障害について - mixi Engineers' Blog

■手順2)設定の変更
設定ファイルの/etc/sysconfig/memcachedを編集します
vi /etc/sysconfig/memcached
#ポート番号(デフォルト11211)
PORT="11211"
#実行ユーザー
USER="memcached"
#最大同時接続数(デフォルト1024)
MAXCONN="1024"
#利用するメモリサイズ(単位はMB)32bitでは3GBまでしか有効にならない。
CACHESIZE="64"
#オプション
OPTIONS="-d -vv 1>> /var/log/memcached.log 2>> /var/log/memcached.log"
各オプションの説明は次のようになっています。
-d
デーモンとしてバックグラウンドで起動
-vv
デバッグモード
他にも次のようなオプションがあるみたいです。
# memcached -h
memcached 1.4.15
-p       TCP port number to listen on (default: 11211)
-U       UDP port number to listen on (default: 11211, 0 is off)
-s      UNIX socket path to listen on (disables network support)
-a      access mask for UNIX socket, in octal (default: 0700)
-l      interface to listen on (default: INADDR_ANY, all addresses)
               may be specified as host:port. If you don't specify
              a port number, the value you specified with -p or -U is
              used. You may specify multiple addresses separated by comma
              or by using -l multiple times
-d            run as a daemon
-r            maximize core file limit
-u  assume identity of  (only when run as root)
-m       max memory to use for items in megabytes (default: 64 MB)
-M            return error on memory exhausted (rather than removing items)
-c       max simultaneous connections (default: 1024)
-k            lock down all paged memory.  Note that there is a
              limit on how much memory you may lock.  Trying to
              allocate more than that would fail, so be sure you
              set the limit correctly for the user you started
              the daemon with (not for -u  user;
              under sh this is done with 'ulimit -S -l NUM_KB').
-v            verbose (print errors/warnings while in event loop)
-vv           very verbose (also print client commands/reponses)
-vvv          extremely verbose (also print internal state transitions)
-h            print this help and exit
-i            print memcached and libevent license
-P      save PID in , only used with -d option
-f    chunk size growth factor (default: 1.25)
-n     minimum space allocated for key+value+flags (default: 48)
-L            Try to use large memory pages (if available). Increasing
              the memory page size could reduce the number of TLB misses
              and improve the performance. In order to get large pages
              from the OS, memcached will allocate the total item-cache
              in one large chunk.
-D      Use  as the delimiter between key prefixes and IDs.
              This is used for per-prefix stats reporting. The default is
              ":" (colon). If this option is specified, stats collection
              is turned on automatically; if not, then it may be turned on
              by sending the "stats detail on" command to the server.
-t       number of threads to use (default: 4)
-R            Maximum number of requests per event, limits the number of
              requests process for a given connection to prevent
              starvation (default: 20)
-C            Disable use of CAS
-b            Set the backlog queue limit (default: 1024)
-B            Binding protocol - one of ascii, binary, or auto (default)
-I            Override the size of each slab page. Adjusts max item size
              (default: 1mb, min: 1k, max: 128m)
-S            Turn on Sasl authentication
-o            Comma separated list of extended or experimental options
              - (EXPERIMENTAL) maxconns_fast: immediately close new
                connections if over maxconns limit
              - hashpower: An integer multiplier for how large the hash
                table should be. Can be grown at runtime if not big enough.
                Set this based on "STAT hash_power_level" before a
                restart.

オプション 内容 Default値
-p  ListenするTCPポート番号 11211
-U  ListenするUDPポート番号 0, off
-s  UnixソケットへのPath(ネットワークは非サポート) 
-a  Unixソケットのアクセスマスク 0700
-l  memcachedがListenするIPアドレス INDRR_ANY
-d デーモンとして起動する場合は指定 
-r コアファイルの上限を最大にする 
-u  memcachedを起動するユーザ名(root権限で実行した場合のみ有効) 
-m  最大メモリ使用量(単位:MB) 64
-M メモリを使い果たしたときにエラーを返す(勝手にキャッシュを削除しない) 
-c  最大同時接続数 1024
-k  
-v verboseモードで起動して、errorとwarningを出力 
-vv very verboseモードで起動してデバックメッセージやエラーをコンソールへ出力 
-h memcachedのバージョンとヘルプを表示 
-i memcachedとlibeventのライセンスを表示 
-b 管理インスタンスの起動 
-p  PIDファイルの保存ファイル(デーモンとして起動した場合のみ有効) 
-f  チャンクサイズの増加係数 1.25
-n  キャッシュ1件(key+value+flags)に割り当てる最小サイズ(単位:byte) 48
■手順3)起動&自動起動登録
#起動
# /etc/init.d/memcached start
memcached を起動中:                                        [  OK  ]
# ps axu|grep memcached
497      25009  0.0  0.0 339964  1184 ?        Ssl  14:01   0:00 memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid -d -m 64 -p 11211 -c 1024
root     25017  0.0  0.0 107456   924 pts/2    D+   14:01   0:00 grep memcached

#自動起動の設定
# chkconfig memcached on
■手順4)接続を行う
#telnet接続
# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
#statsを入力する
stats
STAT pid 25009
STAT uptime 438
STAT time 1358831313
STAT version 1.4.15
STAT libevent 1.4.13-stable
STAT pointer_size 64
STAT rusage_user 0.007998
STAT rusage_system 0.005999
STAT curr_connections 10
STAT total_connections 12
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 29
STAT bytes_written 593
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
#telnetを終了させるにはquitを入力する
quit
Connection closed by foreign host.
※statsを「stats settings」にすると、起動時の設定が表示される。

■手順5)外部サーバーからの接続を行う
#ポートが開放されていることの確認
# netstat -nlp | grep memcached
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      25009/memcached
tcp        0      0 :::11211                    :::*                        LISTEN      25009/memcached
udp        0      0 0.0.0.0:11211               0.0.0.0:*                               25009/memcached
udp        0      0 :::11211                    :::*                                    25009/memcached

#外部サーバー接続してみる。
# telnet memcachedサーバーのIPアドレス 11211
Trying ***.***.***.**...
Connected to ***.***.***.**.
Escape character is '^]'.
stats
STAT pid 25009
STAT uptime 15077
STAT time 1358845952
STAT version 1.4.15
STAT libevent 1.4.13-stable
STAT pointer_size 64
STAT rusage_user 0.307953
STAT rusage_system 0.140978
STAT curr_connections 10
STAT total_connections 16
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 60
STAT bytes_written 1621
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
quit
Connection closed by foreign host.
■手順6)外部サーバーからの接続に制限を行う。
memcachedはIPアドレス制限に1つのIPしか指定できないため、
iptablesを利用して接続制限を行います。

iptablesの設定を行う場合には、既存でサーバーに設定されているポート番号の開放などにも気をつけてください:(;゙゚'ω゚'):
今回の設定ではSSHのポート番号にはデフォルトの22番を利用していますので、
任意で変更してある場合には、その番号に適切な値に変更して利用してください。
そうしないと、SSHで接続できなくなりますガ━━(;゚Д゚)━━ン!!

サーバー上で利用されているポート番号などはnetstat -nlpなどで確認が行えますので、
そこに表示されるLISTENされているポート番号は開放してあげてください。

また、iptablesでは開放しているが、ポート番号がLISTENされていないポート番号には接続はできませんので、
両方の確認を忘れずに!!m9っ`Д´) ビシッ!!
#現在の設定を確認(未設定の状態。ポート番号の制限無しの状態)
/sbin/iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
設定を一旦リセットしたい場合(/etc/sysconfig/iptablesの中身は消えない)
iptables -F
iptablesを編集する
vi /etc/sysconfig/iptables
#テーブルをfilterの指定。パケットフィルタリング
*filter

#入力(受信)パケットのチェイン
:INPUT   ACCEPT [0:0]
#転送パケットのチェイン
:FORWARD ACCEPT [0:0]
#出力(送信)パケットのチェイン
:OUTPUT  ACCEPT [0:0]

#セッション確立後のパケット疎通は許可
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#プロトコルのicmpを許可
-A INPUT -p icmp -j ACCEPT

#ローカル(自分自身)からの入力許可
-A INPUT -i lo -j ACCEPT

#プロトコルがtcpで、ポート番号が22の接続開始パケット(新規接続)を許可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

#プロトコルがtcpで、ポート番号が11211、送信元の接続開始パケット(新規接続)を許可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 11211 -s memcachedの接続を許可するサーバーIPアドレス -j ACCEPT

#ここまでの条件に一致しなかったパケットは、ICMPパケット"host-prohibited"を返して接続拒否
-A INPUT -j REJECT --reject-with icmp-host-prohibited
##ここまでの条件に一致しなかったパケットは、ICMPパケット"host-prohibited"を返して接続拒否
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

#
COMMIT
■手順7)iptablesの再起動
#再起動
/etc/rc.d/init.d/iptables restart
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: チェインをポリシー ACCEPT へ設定中nat filter mang[  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]
iptables: ファイアウォールルールを適用中:                  [  OK  ]

#設定の確認
# /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
ACCEPT     tcp  --  memcachedの接続を許可するサーバーIPアドレス       anywhere            state NEW tcp dpt:memcache
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
■手順8)外部サーバーからの接続を試す。
#iptablesでmemcachedの接続が許可されていないサーバーからmemcachedの接続を試す。
$ telnet memcachedサーバーのIPアドレス 11211
Trying ***.***.***.**...
telnet: connect to address ***.***.***.**: No route to host

#iptablesで指定されているサーバーへ移動し、memcachedの接続を試す。
$ telnet memcachedサーバーのIPアドレス 11211
Trying ***.***.***.**...
Connected to ***.***.***.**.
Escape character is '^]'.
quit
Connection closed by foreign host.

以上(`・ω・´)ゞビシッ!!

■ログローテート(未解決)
-vvオプションを利用してログファイルを出している時に、
ログファイルのローテートを行いたいのですが、
それが正しく動作しない・・・・ガ━━(;゚Д゚)━━ン!!

ローテートは正しくされるが、ファイルの出力先がローテートしたファイルのままになってしまい、
新規で作成されたファイル出力されない現象になっていました(´;ω;`)ブワッ

lsofで開いているファイルを見てみると、やはりログローテートされたファイルを見てしまっているようでした( ´゚д゚`)エー
memcached 28814 memcached    1w      REG             145,61     2887   20889612 /var/log/memcached/11212.log-20130123
memcached 28814 memcached    2w      REG             145,61     2887   20889612 /var/log/memcached/11212.log-20130123
こちらの方と同じ現象かな・・・? ログローテートの設定は次のようにしてあります・・・orz
view /etc/logrotate.d/memcached
#ファイル名にlogが付くファイルを対象にする
/var/log/memcached/*.log {
 #create 640 mysql mysql
 #ログファイルが空ならローテーションしない
 notifempty
 #ログを毎日ローテーションする
 daily
 #ローテーションする回数を指定
 rotate 10
 #ログファイルが存在しなくてもエラーを出さずに処理を続行
 missingok
 #末尾を日付にする
 dateext
 #末尾を日付にする際のフォーマット(Ymdしか使えない?)
 dateformat -%Y%m%d
 #ファイル作成
 create 0777 root root
 #一度のみ実行
 sharedscripts
 #postrotateとendscriptの間に記述されたコマンドをログローテーション後に実行
 postrotate
  /bin/kill -HUP `cat /var/run/memcached.pid 2> /dev/null` 2> /dev/null || true
 endscript
}
神の降臨を待ちしております(゚∀゚)神のヨカーン

参考URL

Apache 初期設定

webサーバー構築の際の設定ファイル内容を残します。
要件は以下の内容です。
  • 設定ドメインは「www.aaaaa.org」
  • 「aaaaa.org」にアクセスがあった際は「www.aaaaa.org」へリダイレクトさせる。
  • Basic認証をかける

サイト構築にあたり、Apacheの設定ファイル内容を残していきます。
設定をするファイルは下記の3点です。
  • /etc/httpd/conf/httpd.conf
  • /etc/httpd/conf.d/httpd-vhosts.conf
  • (ドキュメントルート)/.htaccess

「/etc/httpd/conf/httpd.conf」
httpd.confはApacheの設定ファイルです。
ServerTokens ProductOnly

ServerName aaaaa.org

DocumentRoot "/var/local/www/aaaaa.org"


    Options FollowSymLinks
    AllowOverride All


LogFormat "%{X-Cluster-Client-Ip}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

<Location ⁄server-info>
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from all
    AuthType Basic
    AuthName "Authentication is required"
    AuthUserFile /etc/httpd/.htpasswd
    require valid-user
#    Allow from .example.com
</Location>

ExpiresActive On
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"

Header unset Server

AddType image/vnd.microsoft.icon .ico
デフォルト設定に追加・変更を加えた内容は以上です。
項目について順に見ていきます。
  • 【ServerTokens】:サーバが返すレスポンスヘッダを指定します。「ProductOnly」を設定する事により「Server: Apache」のみを返すようになります。
  • ServerName】:サーバが自分を認識するのに使用するホスト名とポートを指定します。URLリダイレクションで使用されますので、取得したドメインを設定します。
  • 【DocumentRoot】:HTMLドキュメントのルートとなるディレクトリを、フルパスで指定します。
  • 【Directory】:指定したディレクトリに適用するディレクティブをグルーピングします。
  • 【LogFormat】:ログファイルのフォーマットを指定します。
    「%{X-Cluster-Client-Ip}i」ロードバランサ経由でWEBサーバにアクセスした際に本来のリモートホストを出力する指定
    「%h」リモートホスト名
    「%l」クライアントの識別子
    「%u」認証ユーザー名
    「%t」時刻
    「%r」リクエストの最初の行の値
    「%>s」最後のレスポンスのステータス
    「%b」送信されたバイト数(ヘッダーは含まず)。0バイトの時は「-」
    「%{Referer}i」どの URL から移動してきたか
    「%{User-Agent}i」ブラウザ情報
  • 【Location】:指定した URL に適用するディレクティブをグルーピングします。
    「server-status」server-statusハンドラを呼び出す際のURLパスです。この場合「http://(ホスト名)/server-status」で呼び出せる設定になります。
    「Order」デフォルトのアクセス制限と、Allow ディレクティブと Deny ディレクティブが評価される順番を指定します。
      Allowが先⇒デフォルト全てのホストからアクセス可能
      Denyが先⇒デフォルト全てのホストからのアクセスを拒否
  • 【ExpiresActive On】:mod_expiresを使用するという宣言。これを設定するとExpiresヘッダーが利用できるようになります。
    「ExpiresByType」キャッシュの保有設定です。
     image/gif "access plus 1 year"⇒gifファイルを1年間キャッシュする設定。
  • 【Header unset Server】:Apacheが出力するServerヘッダを隠す設定です。
  • 【AddType image/vnd.microsoft.icon .ico】:.icoファイルをfaviconファイルとして認識させる設定です。

「/etc/httpd/conf.d/httpd-vhosts.conf」
バーチャルホストの設定をこちらのファイルに記述していきます。
「aaaaa.org」にアクセスがあった場合は「www.aaaaa.org」にリダイレクトさせますので
「www.aaaaa.org」の設定について記載していきます。

    Options -Indexes FollowSymLinks ExecCGI
    AuthType Basic
    AuthName "Authorization Realm"
    AuthUserFile /home/data/pwd/.htpasswd
    Require valid-user



    ServerName www.aaaaa.org
    DocumentRoot /home/webcontents/aaaaa.org

【Directory】
 「Indexes」ディレクトリに対してリクエストがあり、そのディレクトリに DirectoryIndex ディレクティブで指定されたファイル(index.html など)が存在しない場合、ファイルの一覧を表示します。
 「FollowSymLinks」シンボリックリンクを使用できます。  
 「ExecCGI」CGIを使用できます。
 またBasic認証をかけるために、以下の設定を記載します。
 「AuthType」BasicでBasic認証を指定します。
 「AuthName」認証領域を設定します。同じ名前に設定した領域は認証を引き継げる設定です。
 「AuthUserFile」パスワードを設定するファイルの指定です。
 「Require」valid-user⇒全てのユーザーに認証の機会を与えます。

 【virtualhost】
 「www.aaaaa.org」についてバーチャルホスト設定をします。

「.htaccess」
「/etc/httpd/conf/httpd.conf」内で「www.aaaaa.org」のDocumentRootに設定したディレクトリ「/home/webcontents/aaaaa.org」に「.htaccess」を設置し、「http://aaaaa.org」にアクセスが来た場合に「http://www.aaaaa.org」にリダイレクトする設定を記述します。
記述内容は以下の通りです。
RewriteCond %{HTTP_HOST} ^aaaaa\.org [NC]
RewriteRule ^(.*)$ http://www.aaaaa.org/$1 [R=301,L]

設定ファイルは以上です。
続いて、Basic認証のユーザー、パスを設定します。
「/etc/httpd/conf.d/httpd-vhosts.conf」内で
AuthUserFile /home/data/pwd/.htpasswd
と設定しましたので、こちらに設定ファイルを作成します。
(webから見えない場所に作成する事が望ましいです)
ここでは以下の内容で設定します。
ユーザー名:user1
パスワード:password4user1
htpasswd -b -c /etc/httpd/conf/.htpasswd user1 password4user1

最後に、確認のために「DocumentRoot」に設定したパス「/home/webcontents/aaaaa.org」内にindex.htmlファイルを設置します。

以上で、初期設定は完了です。
最後に下記の内容を確認しましょう。
  • 「www.aaaaa.com」にアクセスし、Basic認証ダイアログが表示される事
  • 「www.aaaaa.com」にアクセスし、index.htmlの内容が表示される事
  • 「aaaaa.com」にアクセスし、「www.aaaaa.com」にリダイレクトされる事
また、今回編集したファイルの全文は下記になります。



本項目は下記ページを参考にさせて頂きました。
http://www.nina.jp/server/slackware/httpd/httpd.conf.html
http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/httpd/htpasswd.php
http://kazmax.zpp.jp/apache/apache5.html