FreeBSDでサーバ構築

FreeBSD-7.0RELEASEを使用してWebサーバを構築したときのメモ書きです。DB+Servlet+JSPです。GlassFishにPostgreSQLと何から何までマイナーな取り合わせ。
すっ飛ばしたい方用Index

やりたいこと

24時間稼動の自宅Webサーバ
単純にHTMLを置くのではなく、DB+JSP+ServletでMVCモデルを用いてシステム構成したい。

ソフト構成

開発をNetbeans6.1で行っていて、サーバをGlassfishにすると設定が楽というのと、なんでも速いらしいので定番のApache+TomcatではなくGlassfish v2ur2で行ってみたい。
DBは好みの問題でPostgreSQL8.3に。MySQLはライセンスにちょっと腰が引けた。
OSは非Windowsで物色。これも好みの問題でFreeBSD7.0Releaseに。Linuxはなんかバタバタしている印象でじっくりと使える感じがしなかったので。NetBSD、OpenBSDはさすがの自分にもマイナー過ぎるというか、英語読解力が無いので無理。

ハード構成

というわけでそれなりに性能が欲しくなるようなシステムですが、経費、特に消費電力は抑えたいところ。うちにあるPCやパーツ類からベターな選択を探していくと・・・。
どうしても、消費電力の低い構成ではメモリ搭載量に限度があって(最大512MB)、性能的にも若干不安が残る。(下記表の候補1,2,3)
性能の高い構成は消費電力が高い。(下記表の候補4)

サーバ候補構成(候補1,2)
項目候補1候補2
CPUC3 800AK6-2+ 500
CPU駆動100×6 1.02V100×3 1.3V
M/BAW-A692GA-5AX Rev5.2
Chipseti810E2AladdinV
RAMPC100 CL2 256MBPC100 CL2 512MB (256+128×2)
HDDCFx120 2GBMK6021GAS 60GB 4200rpm
VGAOnBoardRage Mobility-P 4MB AGP
LANOnBoard RTL8139CFEtherPCI-BLK Accton EN2242
電源60W ACアダプタ60W ACアダプタ
Idle消費電力約10W約13W
問題点RAMスロットが1本
HDD繋ぐとACアダプタで起動しない
CPU性能(Clock上げると電力バカ食い)
サーバ候補構成(候補3,4)
項目候補3候補4
CPUPentium!!! 533EBAthlon64X2 4000+
CPU駆動100×4 1.09V200×10 1.0V
M/BVH6TTA690G AM2
ChipsetApolloPro133A690G
RAMPC100 CL2 512MB (256+128×2)DDR2-800 4GB (2×2)
HDDMK6021GAS 60GB 4200rpmMK6021GAS 60GB 4200rpm
VGARage Mobility-P 4MB AGPOnBoard
LANFEtherPCI-BLK Accton EN2242OnBoard RTC8111
電源60W ACアダプタSS-FS250
Idle消費電力約20W約42W
問題点ACアダプタでは起動不安定
意外に電力食い
電力食い

アクセスが大量にあって性能が必要と言うのであれば候補4で良いのですが、そんなにあるわけじゃなし。。。
というわけで白羽の矢が立ったのは最近バックライトが暗くなってきて交換しようか悩んでいたVaio Z(PCG-Z1V/P)に決定!
同じように構成を記載すると、

サーバ構成
項目構成
CPUPentiumM 1.6GHz
CPU駆動75MHz 0.956V ~ 100×16 1.484V
M/B?
Chipset855GM
RAMDDR-266 1GB (512×2)
HDDHTS541040G9AT00 40GB 5400rpm
VGARadeon7200 16MB AGP
LANOnBoard 82801DB
電源65W ACアダプタ
Idle消費電力約10W
問題点蓋を閉じないとバックライトが消灯しない
できればCPU電圧下げたい。0.3V弱落とせるはず。

とこんな感じ。
それではLet's GO!

富士通

FreeBSD-7.0RELEASEのCDブートからFTPインストール

InstallしたバージョンはFreeBSD 7.0-RELEASE/i386です。今回はFTPインストールしました。
FreeBSD Downloadページに従ってCDイメージをダウンロードします。ミラーサイトが沢山あるので近所の回線の太そうなところからダウンロードするのが良いでしょう。自分の場合は回線の太さを調べる技術がなかったのでホップ(経由)数の少ない、応答時間の短いサーバを調べてそこからダウンロードしました。

C:\>tracert ftp3.jp.FreeBSD.org
Tracing route to xxx.xxx.xxx.jp [210.155.xxx.xxx]
over a maximum of 30 hops:
  1    <1 ms    <1 ms    <1 ms  xxx.xxxxx [192.168.xxx.xxx]
  2     6 ms     6 ms     6 ms  xxx.xxx.xxx.ne.jp [59.138.xxx.xxx]
  3     7 ms     7 ms     7 ms  xxx.xxx.xxx.ne.jp [222.227.xxx.xxx]
  4     8 ms     8 ms     8 ms  xxx.xxx.xxx.jp [210.155.xxx.xxx]
Trace complete.

落とすファイルはpub/FreeBSD/ISO-IMAGES-i386/7.0/7.0-RELEASE-i386-bootonly.isoです。
CDインストールイメージだとCD-Rを3~5枚必要としますので、回線に余裕がある場合はBootOnlyだけをCD-Rに焼いてFTPインストールで良いかと思います。

make.conf

FreeBSDでコンパイルバリバリしますので機種に合わせて最適化するようmake.confを設定しておきます。

まずはこれから沢山お世話になるコンパイルオプションを設定しましょう。
/etc/make.confを編集します。

CPUTYPE=pentium-m
CFLAGS= -O2 -fno-strict-aliasing -pipe
COPTFLAGS= -O2 -fno-strict-aliasing -pipe
DOC_LANG= en_US.ISO8859-1 ja_JP.UTF-8

当然のことながらCPUTYPEはインストールしたマシンによって異なります。
場合によってはCFLAGS,COPTFLAGSに詳細なオプションを付けた方が良いかも。(3DnowをONとか)
自分は日本語使用時にUTF-8コードを使うのでDOC_LANGに追加しています。

Kernel Configとコンパイル

カーネルコンフィグレーションで余計な機能を落としてスッキリ!メモリ使用量も減少し、パフォーマンスもUPです。

FreeBSDのハンドブックカーネルコンフィグレーションに従ってカーネルの再構築を行います。

やりたいことは、

です。

モジュール組み込みを優先するのは、そちらで出来ると変更の際にカーネルリコンパイルが不要になるからです。
元ファイル /usr/src/sys/i386/conf/GENERIC を/root配下に作成したkernelsディレクトリ直下ファイル名を任意(自分で分かるように)に変更してコピーします。
コピーしたファイルをコピー元ディレクトリにリンクしておきます。

# cd /usr/src/sys/i386/conf
# mkdir /root/kernels
# cp GENERIC /root/kernels/任意のファイル名
# ln -s /root/kernels/任意のファイル名

ではこのファイルを弄っていきます。

HP Directplus -HP公式オンラインストア-

デバイスOFFするときのコツ

○○busとなっているのはそのbusを使用するデバイスを1つでも使用するならば絶対にOFFには出来ない。(コンパイル時にエラーになる)
SCTPはIPv6に依存しているらしく、IPv6が無いとコンパイルのリンク時に失敗する。(SCTPが不要ならIPv6もOFFできるがそこまで突っ込んで調べてないので。。。)
USBはモジュール化するので全OFF。
というわけで、削除しまくった結果がこちら。(表示行数を省くためコメントアウトではなく削除しています。元ファイルはもっとデカいんよ。)

cpu		I686_CPU
ident		PCGZ1VP
options 	SCHED_ULE		# ULE scheduler
options 	PREEMPTION		# Enable kernel thread preemption
options 	INET			# InterNETworking
options 	INET6			# IPv6 communications protocols
options 	SCTP			# Stream Control Transmission Protocol
options 	FFS			# Berkeley Fast Filesystem
options 	SOFTUPDATES		# Enable FFS soft updates support
options 	UFS_ACL			# Support for access control lists
options 	UFS_DIRHASH		# Improve performance on big directories
options 	UFS_GJOURNAL		# Enable gjournal-based UFS journaling
options 	PROCFS			# Process filesystem (requires PSEUDOFS)
options 	PSEUDOFS		# Pseudo-filesystem framework
options 	GEOM_PART_GPT		# GUID Partition Tables.
options 	GEOM_LABEL		# Provides labelization
options 	COMPAT_43TTY		# BSD 4.3 TTY compat [KEEP THIS!]
options 	COMPAT_FREEBSD4		# Compatible with FreeBSD4
options 	COMPAT_FREEBSD5		# Compatible with FreeBSD5
options 	COMPAT_FREEBSD6		# Compatible with FreeBSD6
options 	KTRACE			# ktrace(1) support
options 	_KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options 	KBD_INSTALL_CDEV	# install a CDEV entry in /dev
options 	ADAPTIVE_GIANT		# Giant mutex is adaptive.
options 	STOP_NMI		# Stop CPUS using NMI instead of IPI
options 	AUDIT			# Security event auditing
# Bus support.
device		eisa
device		pci
# ATA and ATAPI devices
device		ata
device		atadisk		# ATA disk drives
device		atapicd		# ATAPI CDROM drives
options 	ATA_STATIC_ID	# Static device numbering
# atkbdc0 controls both the keyboard and the PS/2 mouse
device		atkbdc		# AT keyboard controller
device		atkbd		# AT keyboard
device		psm		# PS/2 mouse
device		kbdmux		# keyboard multiplexer
device		vga		# VGA video card driver
device		splash		# Splash screen and screen saver support
# syscons is the default console driver, resembling an SCO console
device		sc
# Add suspend/resume support for the i8254.
device		pmtimer
# Pseudo devices.
device		loop		# Network loopback
device		ether		# Ethernet support
device		tun		# Packet tunnel.
device		pty		# Pseudo-ttys (telnet etc)
device		firmware	# firmware assist module
# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device		bpf		# Berkeley packet filter

ちなみにスケジューラーを速いと噂のULEに変更してます。

コンパイル

設定が出来たら、ドキドキのコンパイルです。エラーが出なくなるまで設定を詰めてやり直してください。

# cd /usr/src
# make buildkernel KERNCONF=さっき弄ったファイル名

インストール

コンパイルに成功したらインストールです。

# make installkernel KERNCONF=さっき弄ったファイル名

次に起動するときにインストールしたカーネルで起動します。
削り過ぎで起動するか心配な場合はモジュール組み込み等もある程度やってから再起動した方が良いかもね。

loader.conf

デバイスモジュールの組み込みはコンパイルも再起動も不要で機能の追加・削除に便利です。

Kernel Configとコンパイルで削りまくったデバイスをモジュールとして組み込むようにします。
設定ファイルは/boot/loader.confです。

NICデバイス

当然のことながら使用しているNIC(LANカード)の種類によって変わりますよ。

miibus_load="YES"
if_fxp_load="YES"

USBデバイス

USBメモリだけ使うかもしれないと思ったのでそれだけ追加してます。他にも使いたかったらもっと追加要。

usb_load="YES"
umass_load="YES"

その他カーネル設定ファイルから削除したもので必要そうなデバイス

aout_load="YES"
linux_load="YES"
sysvmsg_load="YES"
sysvsem_load="YES"
sysvshm_load="YES"
mem_load="YES"
io_load="YES"
random_load="YES"
HP Directplus -HP公式オンラインストア-

省電力関連

これ重要!なるべく省電力になるようガッツンがっつん設定しましょう。

autoboot_delay="5"
cpufreq_load="YES"
acpi_load="YES"
acpi_sony_load="YES"
agp_load="YES"
acpi_video_load="YES"
screensave_load="YES"
screensave_name="green_saver"

あ、先頭の1行は省電力というか起動時の選択待ち時間を減らしてるだけです。
acpi_sony_loadとか機種固有ですので。

Power Save

ノートPCは省電力機能が充実していますのでFreeBSDであってもこれを活用しない手は無い!

loader.confで省電力用のデバイスを組み込みましたが、まだ機能としては動いていません。
早速サービスを動かしましょう。
設定ファイルは/etc/rc.confです。

powerd_enable="YES"

再起動すると負荷に合わせてCPU Clockを調節してくれます。
ちょっと様子を見てみましょう。

%sysctl -a | grep cpu
kern.threads.virtual_cpu: 1
kern.ccpu: 0
kern.smp.cpus: 1
kern.smp.maxcpus: 1
debug.cpufreq.verbose: 0
debug.cpufreq.lowest: 0
hw.ncpu: 1
hw.acpi.cpu.cx_lowest: C1
machdep.cpu_idle_hlt: 1
dev.cpu.0.%desc: ACPI CPU
dev.cpu.0.%driver: cpu
dev.cpu.0.%location: handle=\_PR_.CPU0
dev.cpu.0.%pnpinfo: _HID=none _UID=0
dev.cpu.0.%parent: acpi0
dev.cpu.0.freq: 225
dev.cpu.0.freq_levels: 1600/-1 1400/-1 1225/-1 1200/-1 1050/-1 1000/-1 875/-1 800/-1 700/-1 600/-1 525/-1 450/-1 375/-1 300/-1 225/-1 150/-1 75/-1
dev.cpu.0.cx_supported: C1/1 C2/1
dev.cpu.0.cx_lowest: C1
dev.cpu.0.cx_usage: 100.00% 0.00%
dev.acpi_perf.0.%parent: cpu0
dev.est.0.%parent: cpu0
dev.cpufreq.0.%driver: cpufreq
dev.cpufreq.0.%parent: cpu0
dev.p4tcc.0.%parent: cpu0

dev.cpu.0.freqに着目して下さい。225MHzで動いています。さらに動作切替するクロックの一覧がdev.cpu.0.freq_levelsにあります。負荷が低ければ75MHzで動いていることあります。Windowsでは最低600MHzだったので驚きです。

しかし、電圧はどうやったら下げられるのやら?

ディスプレイの輝度を調整する

さて、本当はディスプレイをOFFにしたいのですが、方法が見当たらない(蓋を閉じればOFFになる)ので、せめてそのままでは最大輝度になっていて勿体無い輝度を減らしましょう。

設定ファイルは/etc/sysctl.confです。

dev.acpi_sony.0.brightness=0

自分のマシンでは0~8(それ以上の数値でも良いが輝度はバラバラ。法則が掴めん。)でした。
さすがに輝度0だと見難いなぁ。FreeBSDのコンソールの文字色はデフォルトで灰色なのでなおさらです。
では、文字色を白にしましょう。設定ファイルは/etc/rc.confです。

allscreens_flags="lightwhite"

蓋を閉じると熱がこもるので蓋は開けておきたいのですが、バックライト付きっ放しというのも発熱要因なので蓋は閉じることにして、本体を逆さにして放熱を助けることにしましょう。バックライトを消すことが出来たら蓋を開けることにします。

CDドライブの電源を切る。

OSインストール時くらいしかCDドライブを使うことが無いので電源を切りましょう。設定ファイルは/etc/sysctl.confです。

dev.acpi_sony.0.cdp=0

仮想コンソール減

仮想コンソールってそんなに使う?(っつか存在すら知らなかったよ。)使わない分もきっちり設定すればよりメモリが空きます。

さてFreeBSDの初期状態では仮想コンソールが8つ動いています。
1つ当り3KB強のメモリを占有しますので、必要が無ければ減らしましょう。
設定ファイルは/etc/ttysです。

ttyv0   "/usr/libexec/getty Pc"     cons25  on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"     cons25  on  secure
ttyv2   "/usr/libexec/getty Pc"     cons25  on  secure
ttyv3   "/usr/libexec/getty Pc"     cons25  on  secure
ttyv4   "/usr/libexec/getty Pc"     cons25  off secure
ttyv5   "/usr/libexec/getty Pc"     cons25  off secure
ttyv6   "/usr/libexec/getty Pc"     cons25  off secure
ttyv7   "/usr/libexec/getty Pc"     cons25  off secure
ttyv8   "/usr/local/bin/xdm -nodaemon"  xterm   off secure
# Serial terminals
# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
ttyd0   "/usr/libexec/getty std.9600"   dialup  off secure
ttyd1   "/usr/libexec/getty std.9600"   dialup  off secure
ttyd2   "/usr/libexec/getty std.9600"   dialup  off secure
ttyd3   "/usr/libexec/getty std.9600"   dialup  off secure
# Dumb console
dcons   "/usr/libexec/getty std.9600"   vt100   off secure

一部抜粋ですが、デフォルトではttyv0~7がonになっています。これを要らない分offにしていきましょう。この例ではttyv0~3のみonとして4~7はoffにしました。(もっと減らしても良いかも。)

仮想コンソールを切り替える時は「Alt」+「F1」~「F8」でそれぞれttyv0~7に切り替わります。
ちなみにどんなに減らしてもttyv0だけは生かしておきましょう。他端末からアクセス不能になった時に本体でもログインできないという悲惨な状態になります。
余談ですが、Xを使用するときはttyv8をonにします。(別に他のところをcons25からxtermに変更しても良いんですけど。)
シリアルコンソールを使いたいときはdconsをonにします。転送レート上げたかったら9600の数字を増やします。115200とか。
あと、secureをinsecureに変更しておくとrootでのログインはできなくなります。suはできますが、ログに記録されます。他人が触る恐れがあるならinsecureにしておくと良いでしょう。

NTP

サーバたるものなるべく正確な時刻を刻みたいもの。そこでNTPを導入してみましょう。
設定ファイルは/etc/rc.confです。

ntpd_enable="YES"

さらにNTPサーバの設定と時刻をもらう間隔を設定します。ここではこんな弱小サーバでレベル1に接続してすみませんという感じですが、なるべくNTPサーバに迷惑掛けないように間隔を空けましょう。設定ファイルは/etc/ntp.confです。

server 130.69.251.23 minpoll 14 maxpoll 16

ここでは東京大学さまのNTPサーバに最小2^14秒(≒4.5時間)、最大2^16秒(≒18時間)の間隔で時刻をもらいます。

SSH SFTP

今時のサーバではセキュリティを考えてTelnetFTPrloginなどは出来ないようにしておくのがベターです。
これらのサービスは起動しないようにしましょう。

で古風な自分としては万が一の際にシリアルコンソールが使えると良いなぁなどと思って、今時シリアルケーブルを買い漁ったりしてしまったのですが、シリアルポートの無いPCですし、ノートPCなんだからキーボードも画面も付いているし、意味が無かったです。

それでは万が一のちょっと手前で他端末から操作できるようにするにはどうしましょう。少なくともファイル転送などしたいですし。
そこでSSHを導入してSFTPも使えるようにしたいと思います。(大雑把に言って暗号化Telnet、暗号化FTPです。)

FreeBSDのInstall時にSSHを使うか?と聞かれていますのでそこでYesとしていれば使える状態にあります。使える状態になければ/usr/sbin/sysinstallを実行して使える状態にします。

SSHの導入(Windowsマシンをクライアントとして)

SSHで使用できるターミナルエミュレータをインストールします。ここではUTF-8 TeraTerm Pro with TTSSH2を使わせて頂きました。(TeraTermのSSH版です)

インストールしたら実行して[設定]-[SSHキー生成]メニューを開きます。RSAでログインしたいユーザとパスフレーズ×2(サーバのログインパスワードとは無関係。鍵作成のためのフレーズ)を入力し、秘密鍵と公開鍵を作成します。

公開鍵はサーバのログインしたいユーザの~/.ssh/authorized_keysに保管する。(ホーム配下に.sshディレクトリを作ってauthorized_keysというファイル名で保管)
まだ他端末からアクセスする経路を持っていない場合はこれが初めての他端末からのアクセスになります。最初だけチャレンジレスポンス認証でログインして、eeでauthorized_keysファイルを編集状態にしてTeraTermからファイル内容の転送ができるので流し込んで作成します。

SSHの導入(WindowsMobileマシンをクライアントとして)

なんとWindowsMobileマシンからでもSSHできるんですね。ここではPocketPuTTY 日本語対応版を使わせて頂きました。

秘密鍵は上記のUTF-8 TeraTerm Pro with TTSSH2と違う生成方法みたいです。PuTTYGenを使って秘密鍵を作成します。(パスフレーズは同じものを使用します。同じ公開鍵を使うために。)

SFTPの導入(Windowsマシンをクライアントとして)

ここではWinSCPを使わせて頂きました。解説サイトとしてWinSCP Japanese siteを参考にさせて頂きました。

インストールしたら秘密鍵は上記PuTTYGenで作成した(WindowsMobileで使用するのと同じ)秘密鍵を使用します。(パスフレーズは同じものを使用します。同じ公開鍵を使うために。)

SSH,SFTPのセキュリティ強化

さて、そのままではせっかく暗号化しててもセキュリティ的には殆ど向上しません。なぜなら、上記で「チャレンジレスポンス認証でログイン」ってありましたね。これはどの端末からでもアクセスできてしまいます。盗聴のリスクは減っても不正アクセスのリスクは全く減りません。不正アクセスされないように設定を変更する必要があります。

今回セキュリティ強化するのは

といったところですが、認証可能時間制限はあまり意味が無いかも知れません。(時間を短くして不正アクセスのリトライ間隔が頻繁になっても困るので)

設定ファイル/etc/ssh/sshd_configの終端に以下を追加します。

AllowUsers 許可するユーザ名
ChallengeResponseAuthentication no
X11Forwarding no
MaxAuthTries 思考制限回数(この回数分パスフレーズを間違えると遮断されます。)
LoginGraceTime 認証可能時間(認証作業にこの時間以上掛かると遮断されます。単位は何もつけなければ秒。)
Port xxxxx(他のサービスと被らないポートにしましょう。)
デル株式会社

Ports更新

いよいよアプリケーションのインストールを開始しましょう。
と、その前にportsの更新を行っておきましょう。FreeBSD-7.0RELEASEをインストールしたままではJavaのインストールが成功しないためです。

(というか、インストールに必要なファイルを全て持っていればOKなんだろうけど、要求されるファイルが古いバージョンでネットから落とせない。)

まぁ、他のアプリケーションもなるべく新しいバージョンをインストールしたいですし。
まずは/usr/share/examples/cvsup配下にあるファイルを全て(どこでもいいですがここでは)/var/db/supディレクトリにコピーします。(元ネタを変更しないようにするためです。)

コピーしたファイルに/var/db/sup/refuseファイルがあります。ここには更新をしたくないportsディレクトリが記述されています。
デフォルトでは各言語圏(プログラム言語ではなく)用にカスタマイズされたアプリケーションのportsが記述されています。日本語も含まれてますね。このままだと日本語アプリケーションのportsが更新されませんので、ports/japaneseの行を削除しておきます。

ついでにドキュメントの方も日本語が記載されていますので、doc/ja_*の行を削除しておきます。
例によってcvsupサーバの近くて回線の太いところを探しておきましょう。
ではportsの更新です。

#csup -h cvsup.jp.freebsd.org -4 -l /var/run/csup.pid -L 2 /var/db/sup/ports-supfile -Z

ドキュメントの更新もしておきましょうか。

#csup -h cvsup.jp.freebsd.org -4 -l /var/run/csup.pid -L 2 /var/db/sup/doc-supfile -Z

Java

portsからのインストール作業はインストールしたいアプリケーションのportsディレクトリへ移動してmakeするだけというお気軽さなのですが、Javaのインストールはライセンスの関係でお気軽には行きません。
とりあえず/usr/ports/java/jdk16へ移動してmakeしてみましょう。

#make

エラーが出るはずです。ファイルが足らないと。英文ですが頑張って不足しているファイルを見つけます。自分がインストールした時はこんな感じでした。

多分。これをsunのホームページを中心に頑張って見つけてダウンロードします。
不足なくファイルが揃えばmakeエラーは出なくなります。
あ~、configしといた方が良いのかな?忘れちゃいましたが、インストールするモジュールの依存性を考慮して、依存するモジュールの設定もしてくれるコマンドを打ってconfig設定しておきます。

#make config-recursive

これは何も出力されずに終了するまで何度も打ちましょう。
ではインストールです。

#make install clean

途中でライセンスに同意するか?と英語で聞かれて止まりますので「yes」と答えてあげましょう。あとはひたすら成功を待つ!
インストールが成功するとJDK1.6ではなくてJDK1.5の方が有効になっています。これをJDK1.6が有効になるようにするにはJDKを使用するユーザのログインシェルの起動スクリプトに環境変数を設定します。自分の場合はtcshを使ってますので設定ファイルはユーザホームディレクトリの.cshrcです。

setenv JAVA_VERSION FREEBSD-JDK1.6.0

PostgreSQL

PostgreSQLのInstallはPortsから楽々。設定もあるのでメモ書きしておきます。

PostgreSQL 8.3のインストールをします。
portsディレクトリは/usr/ports/databases/postgresql83-serverです。移動しましょう。
お約束でコンフィグしておきましょう。

#make config-recursive

これを何も出力されずに終了するまで何度も打ちます。
ではインストールです。

#make install clean

インストールの最後の方で設定や起動に関する注意書きが英語でつらつらでてきますので保存しておきましょう。(ログが残っているかな?)
インストールに成功したら次は設定です。
PostgreSQLで使用するコマンド類は/usr/local/binに置かれますので改めてPathを切る必要はありません。
デフォルトでインストールするとユーザpgsqlが作成されています。PostgreSQLではこのユーザを使用します。
DBの初期化を行います。自分はコード体系としてUTF-8を使用しますので、

% su - pgsql
$ initdb --locale=ja_JP.UTF-8 --lc-ctype=ja_JP.UTF-8 -D /usr/local/pgsql/data

他のマシン(ここではWindowsにインストールしたPostgreSQLのpgAdminIIIから接続する想定で)から接続したい場合は接続許可をしましょう。設定ファイルは/usr/local/pgsql/data/postgresql.confです。

listen_addresses = '127.0.0.1,192.168.xxx.xxx,192.168.xxx.xxx'
port = xxxx

listen_addressesの初期値は「localhost」となっています。ホスト名を書き連ねて行くならこのままでも良いですが、IPアドレス指定にしたかったらlocalhostもIPアドレスにしないといけないようです。(ホスト名とIPアドレスの混載指定はできないってことですね。)

これだけでは接続しようとしても権限が無いと怒られます。権限付与もしてあげましょう。設定ファイルは/usr/local/pgsql/data/pg_hba.confです。

host    all         all         192.168.xxx.xxx/32      trust

ではDBを開始しましょう。普通のユーザからでも起動できます。

%pg_ctl start -D /usr/local/pgsql/data

接続許可したマシンのpgAdminIIIから接続してみましょう!

JDBC

PostgreSQL用JDBCドライバもPortsからInstallしておきましょう。後でGlassFishで使います。

ServletからJDBC接続PostgreSQLにアクセスするためにJDBCをインストールします。
portsディレクトリは/usr/ports/databases/postgres-jdbcです。移動しましょう。
お約束でコンフィグしておきましょう。

#make config-recursive

これを何も出力されずに終了するまで何度も打ちます。
ではインストールです。

#make install clean

さてインストール時にクラスパスを設定せよ!とメッセージがでます。

postgresql.jar resides in /usr/local/share/java/classes/postgresql.jar
Add this to your CLASSPATH!
java examples reside in /usr/local/share/examples/postgresql/jdbc

と出ますが、Glassfishには別の方法で使用しますのでパスの設定は不要です。

Glassfish

FreeBSD用のGlassFishは存在しないのでLinux用をLinuxエミュレーション機能を利用して使います。その手順と簡単に設定などをメモ書き。

残念ながらGlassFishのportsもpackageもFreeBSD用は存在しません。(2008年6月現在)
そこでLinux向けのバイナリを使用してGlassFishのインストールをします。
FreeBSDにはLinux Emulatorがあります。インストール時に排除していなければ標準で入っています。ちょっと確かめてみましょう。

%pkg_info -a | grep linux
Information for linux_base-fc-4_10:
Linux 4.  These packages, in conjunction with the linux kernel module,
needs to chroot into the linux base may not work as expected (no fallthrough
If you want to run X11 applications, install the x11/linux-xorg-libs port.
For cross-development this port is not suitable, you should use a linux_dist
%kldstat
Id Refs Address    Size     Name
 3    1 0xc0798000 287a8    linux.ko

Emulatorと言っても、パフォーマンスの心配は要らなさそうです。FreeBSD ハンドブックによるとLinuxより高いパフォーマンスが出る場合もあるとのこと。

GlassFish V2UR2 ダウンロードページに従ってインストールします。ダウンロードするファイルはLinux多言語用glassfish-installer-v2ur2-b04-linux-ml.jarです。

インストール時に自分のホスト名に対してIPアドレスが決まっていないとUnknownHostエラーが発生するので/etc/hostsに設定しておきましょう。設定ファイルは/etc/hostsです。

192.168.xxx.xxx      www www.dodoit.info

/usr/local配下にダウンロードしたファイルを置きます。
/usr/localディレクトリに移動してインストールです。

% java -Xmx256m -jar glassfish-installer-v2ur2-b04-linux-ml.jar
% cd glassfish
% chmod -R +x lib/ant/bin
% lib/ant/bin/ant -f setup.xml

GlassFishの設定

まずドメインを作りつつ起動してみましょう。

# /usr/local/glassfish/bin/asadmin start-domain domain1

作ったドメインのライブラリにJDBCライブラリを追加します。

# cp /usr/local/share/java/classes/postgresql.jar /usr/local/glassfish/domains/domain1/lib

ブラウザ(LAN内の他端末)からhttp://192.168.xxx.xxx:4848にアクセスして管理コンソールにログインします。初期値はユーザ「admin」パスワード「adminadmin」です。

ユーザやパスワードは適宜変更しましょう。
GlassFishはアプリケーションサーバなのでデフォルトのリスナーポートは8080になっています。これを80に変更しましょう。[設定]→[HTTPサービス]→[HTTPリスナー]→[http-listener-1]のHTTPポートを8080から80に修正して保存します。

ついでにアクセスログをONしておきましょうか。[設定]→[HTTPサービス]で「アクセスログ」有効チェックボックスをONにして保存します。なるべく書き込み頻度を抑えようかと思って「アクセスログの書き込み間隔」を600秒とかに設定したらCPU負荷が100%に!0に戻しました。。。

デフォルトでは15分毎にアクセスログがローテーションする上にファイル名に年月日しか付かないってどうなの?って感じです。そんなにアクセス無いので1日毎にしましょうか。[設定]→[HTTPサービス]→[アクセスログ]で「ローテーション間隔」を1440分に変更して保存します。

Javaの設定をします。[アプリケーションサーバ]→[JVM設定]で「JAVA_HOME」に/usr/local/jdk1.6.0を設定します。

JDBC接続プールを作成します。[リソース]→[JDBC]→[接続プール]で「新規...」ボタンを押して作成します。各パラメータはこんな感じ。

必要に応じて追加なり変更なりして下さい。

JDBCリソースを作成します。[リソース]→[JDBC]→[JDBCリソース]で「新規...」ボタンを押して作成します。各パラメータはこんな感じ。

開発したWebアプリケーションをデプロイ(配備)してみましょう。[アプリケーション]→[Webアプリケーション]で「配備...」ボタンを押して配備します。動くかな?

自動起動

起動中に必ず使うアプリケーションはサービス化しておきたいもの。NTP,PostgreSQL,GlassFishのサービス化(自動起動・自動終了)についてメモ書き。

さて、いままでアプリケーションのインストールや設定を行ってきましたが、これらのサービスはOSを起動した時には必ず動いていて欲しいですね。というわけで自動起動の設定です。

NTPサービスの自動起動

設定ファイル/etc/rc.confに追記します。

ntpd_enable="YES"

PostgreSQLサービスの自動起動

同じく、設定ファイル/etc/rc.confに追記します。

postgresql_enable="YES"

GlassFishサービスの自動起動

同じく、って行きたいところですが、portsからのインストールではないので、設定ファイル書くだけなんていう嬉しい状態にはなっていません。
同じような設定で動くようにスクリプトを作成しましょう。作成するファイルは/usr/local/etc/rc.d/glassfish所有者をrootにして全員に実効権限を与えておきます。(555)

#!/bin/sh
#
# $FreeBSD: ports/print/cups-base/files/cupsd.in,v 1.1 2006/01/27 11:28:06 dougb Exp $
#
# PROVIDE: glassfish
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf to enable Glassfish:
#
# glassfish_enable="YES"
#
command=/usr/local/glassfish/bin/asadmin
. /etc/rc.subr
load_rc_config glassfish
# set defaults
glassfish_enable=${glassfish_enable:-"NO"}
name=glassfish
rcvar=`set_rcvar`
start_cmd="/usr/local/glassfish/bin/asadmin start-domain domain1"
stop_cmd="/usr/local/glassfish/bin/asadmin stop-domain domain1"
run_rc_command "$1"

で、設定ファイル/etc/rc.confに追記します。

glassfish_enable="YES"

うまく動けばお慰み~

Dynabook Direct

PacketFiltering

FreeBSDの話ではありませんが、ルータの設定(パケットフィルタリング)について。個人環境のものですので、安易にマネしないで下さい。(環境に応じて熟慮してね。)

えーと、FreeBSDの話から逸れるのですがセキュリティ対策ということでメモしておきます。
LAN内に自分以外の使用者がいる場合はマネしないでください。個人使用の環境での話しです。
インターネットとはルータで接続されており、公開するサーバはDMZとします。
するとそのままでは外部からリクエストされる通信の全てが公開サーバへ向かいます。
今回公開したのはWebだけですので低い優先度で全ての外部から来るパケットを遮断しておきます。
そして、それより上の優先度でHTTPプロトコルを受けるTCP80番ポートのみ許可します。
SSLやSSHを使う場合はSSL,SSHのポートも許可しておきましょう。
SSH SFTPにも記載したようにSSHのような個人でしか使う宛ての無いポートは標準のポートから変えておくとよりセキュリティが向上します。
(全自動アタックに対してはこれだけでもかなり有効です。)

ついでに万が一にも自分のLANから変なパケットが飛ばないように(完全じゃないですが)ポートを閉じましょうか。優先度を低めてtcpとudpのwellknownポート(0~1023)で外部に出るパケットを遮断しておきます。

そして普段使用するポートだけ優先度を高めて外部に出るパケットの許可をします。

wellknownポートで外部に出るパケットを許可するポート
用途プロトコルポート番号
HTTPtcp80
HTTPS(SSL)tcp443
DNSResolvudp53
FTP(PASV)tcp21
NTPudp123
POP3tcp110
SMTP(OP25B)tcp587

2008-07-05

この記事のタグ

PC

Linux/BSD

WebServer