FreeBSDでサーバ構築
FreeBSD-7.0RELEASEを使用してWebサーバを構築したときのメモ書きです。DB+Servlet+JSPです。GlassFishにPostgreSQLと何から何までマイナーな取り合わせ。
すっ飛ばしたい方用Index
- FreeBSD-7.0RELEASEのCDブートからFTPインストール
- make.conf
- Kernel Configとコンパイル
- loader.conf
- Power Save
- 仮想コンソール減
- NTP
- SSH SFTP
- Ports更新
- Java
- PostgreSQL
- JDBC
- Glassfish
- 自動起動
- PacketFiltering
やりたいこと
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 |
---|---|---|
CPU | C3 800A | K6-2+ 500 |
CPU駆動 | 100×6 1.02V | 100×3 1.3V |
M/B | AW-A692 | GA-5AX Rev5.2 |
Chipset | i810E2 | AladdinV |
RAM | PC100 CL2 256MB | PC100 CL2 512MB (256+128×2) |
HDD | CFx120 2GB | MK6021GAS 60GB 4200rpm |
VGA | OnBoard | Rage Mobility-P 4MB AGP |
LAN | OnBoard RTL8139C | FEtherPCI-BLK Accton EN2242 |
電源 | 60W ACアダプタ | 60W ACアダプタ |
Idle消費電力 | 約10W | 約13W |
問題点 | RAMスロットが1本 HDD繋ぐとACアダプタで起動しない | CPU性能(Clock上げると電力バカ食い) |
項目 | 候補3 | 候補4 |
---|---|---|
CPU | Pentium!!! 533EB | Athlon64X2 4000+ |
CPU駆動 | 100×4 1.09V | 200×10 1.0V |
M/B | VH6T | TA690G AM2 |
Chipset | ApolloPro133A | 690G |
RAM | PC100 CL2 512MB (256+128×2) | DDR2-800 4GB (2×2) |
HDD | MK6021GAS 60GB 4200rpm | MK6021GAS 60GB 4200rpm |
VGA | Rage Mobility-P 4MB AGP | OnBoard |
LAN | FEtherPCI-BLK Accton EN2242 | OnBoard RTC8111 |
電源 | 60W ACアダプタ | SS-FS250 |
Idle消費電力 | 約20W | 約42W |
問題点 | ACアダプタでは起動不安定 意外に電力食い | 電力食い |
アクセスが大量にあって性能が必要と言うのであれば候補4で良いのですが、そんなにあるわけじゃなし。。。
というわけで白羽の矢が立ったのは最近バックライトが暗くなってきて交換しようか悩んでいたVaio Z(PCG-Z1V/P)に決定!
同じように構成を記載すると、
項目 | 構成 |
---|---|
CPU | PentiumM 1.6GHz |
CPU駆動 | 75MHz 0.956V ~ 100×16 1.484V |
M/B | ? |
Chipset | 855GM |
RAM | DDR-266 1GB (512×2) |
HDD | HTS541040G9AT00 40GB 5400rpm |
VGA | Radeon7200 16MB AGP |
LAN | OnBoard 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のハンドブックカーネルコンフィグレーションに従ってカーネルの再構築を行います。
やりたいことは、
- 使用しない機能やデバイスをOFF
- モジュール組み込みができるデバイスドライバはそちらでやるようにする
- 必要な機能やデバイスを追加
です。
モジュール組み込みを優先するのは、そちらで出来ると変更の際にカーネルリコンパイルが不要になるからです。
元ファイル /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/任意のファイル名
ではこのファイルを弄っていきます。
デバイス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"
省電力関連
これ重要!なるべく省電力になるようガッツンがっつん設定しましょう。
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
今時のサーバではセキュリティを考えてTelnetやFTP、rloginなどは出来ないようにしておくのがベターです。
これらのサービスは起動しないようにしましょう。
で古風な自分としては万が一の際にシリアルコンソールが使えると良いなぁなどと思って、今時シリアルケーブルを買い漁ったりしてしまったのですが、シリアルポートの無い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のセキュリティ強化
さて、そのままではせっかく暗号化しててもセキュリティ的には殆ど向上しません。なぜなら、上記で「チャレンジレスポンス認証でログイン」ってありましたね。これはどの端末からでもアクセスできてしまいます。盗聴のリスクは減っても不正アクセスのリスクは全く減りません。不正アクセスされないように設定を変更する必要があります。
今回セキュリティ強化するのは
- ログインユーザの限定
- 公開鍵認証以外禁止
- X禁止
- 試行回数制限
- 認証可能時間制限
- ポートをデフォルト22から変更
設定ファイル/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
エラーが出るはずです。ファイルが足らないと。英文ですが頑張って不足しているファイルを見つけます。自分がインストールした時はこんな感じでした。
- bsd-jdk16-patches-4.tar.bz2
- diablo-caffe-freebsd6-i386-1.5.0_07-b01.tar.bz2
- jce_policy-6.zip
- jdk-6u3-fcs-bin-b05-jrl-24_sep_2007.jar
- jdk-6u3-fcs-mozilla_headers-b05-unix-24_sep_2007.jar
- jdk-6u3-fcs-src-b05-jrl-24_sep_2007.jar
- tzupdater-1.3.3-2007k.zip
多分。これを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]→[接続プール]で「新規...」ボタンを押して作成します。各パラメータはこんな感じ。
- データソースクラス名
org.postgresql.ds.PGSimpleDataSource - リソースタイプ
javax.sql.DataSource - プロパティ
プロパティ 設定値 User pgsql Password xxxxxxxx serverName localhost DatabaseName postgres NetworkProtocol tcp portNumber 5432
JDBCリソースを作成します。[リソース]→[JDBC]→[JDBCリソース]で「新規...」ボタンを押して作成します。各パラメータはこんな感じ。
- JNDI名
jdbc/postgre(開発資源と合わせましょう。) - 接続プール
上記で作った接続プールを選択
開発した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"
うまく動けばお慰み~
PacketFiltering
FreeBSDの話ではありませんが、ルータの設定(パケットフィルタリング)について。個人環境のものですので、安易にマネしないで下さい。(環境に応じて熟慮してね。)
えーと、FreeBSDの話から逸れるのですがセキュリティ対策ということでメモしておきます。
LAN内に自分以外の使用者がいる場合はマネしないでください。個人使用の環境での話しです。
インターネットとはルータで接続されており、公開するサーバはDMZとします。
するとそのままでは外部からリクエストされる通信の全てが公開サーバへ向かいます。
今回公開したのはWebだけですので低い優先度で全ての外部から来るパケットを遮断しておきます。
そして、それより上の優先度でHTTPプロトコルを受けるTCP80番ポートのみ許可します。
SSLやSSHを使う場合はSSL,SSHのポートも許可しておきましょう。
SSH SFTPにも記載したようにSSHのような個人でしか使う宛ての無いポートは標準のポートから変えておくとよりセキュリティが向上します。
(全自動アタックに対してはこれだけでもかなり有効です。)
ついでに万が一にも自分のLANから変なパケットが飛ばないように(完全じゃないですが)ポートを閉じましょうか。優先度を低めてtcpとudpのwellknownポート(0~1023)で外部に出るパケットを遮断しておきます。
そして普段使用するポートだけ優先度を高めて外部に出るパケットの許可をします。
用途 | プロトコル | ポート番号 |
---|---|---|
HTTP | tcp | 80 |
HTTPS(SSL) | tcp | 443 |
DNSResolv | udp | 53 |
FTP(PASV) | tcp | 21 |
NTP | udp | 123 |
POP3 | tcp | 110 |
SMTP(OP25B) | tcp | 587 |