Professional Documents
Culture Documents
目次
まえがき 5
執筆者・制作者紹介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
岡田 賢治(バージョン 1 執筆担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
川井 義治(バージョン 1 執筆担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
宮原 徹(バージョン 2 執筆/バージョン 3 監修担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
遠山 洋平(バージョン 2 校正・図版作成担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
田口 貴久(バージョン 2 技術検証担当). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
高橋 征義(バージョン 2 PDF / EPUB 版制作担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
恒川 裕康(バージョン 3 執筆担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
著作権 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
使用に関する権利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
非営利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
改変禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
本教科書の使用に関するお問合せ先 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
本教科書の目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
想定している実習環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
講師と受講生 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
教室と割当 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1 名で学習する場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
仮想マシン環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
マシンの構成とハードディスク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
ネットワーク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
全体の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1 Linux のインストール準備と事前学習 9
1.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 実習で利用するハードウェア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3 利用する Linux のディストリビューション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.1 インストール DVD/USB の入手方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.2 バージョン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4 ネットワーク環境について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.1 ネットワークの設定項目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 ネットワークの設定項目の確認シートの例 (受講者 1 用) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 高度なストレージ管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.1 LVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.2 LVM の仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.3 LVM の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6.1 RAID とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6.2 RAID の種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6.3 ハードウェア RAID とソフトウェア RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.4 高度なストレージの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2 Linux のインストール 17
2.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 インストールの前に用意するもの . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 インストールの開始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3.1 インストールメディアの読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
LPI-Japan 1 https://linuc.org
目次 目次
2.3.2 言語設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3.3 インストール先ディスクの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.4 ネットワークとホスト名の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.5 ソフトウェアの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.6 インストールの開始とパスワード設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3.7 インストール後の初期設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.4 ログインする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5 コマンドの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.1 端末を利用する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.2 Windows から SSH を使って接続する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.3 root で設定を行う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.6 ローカルリポジトリの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3 DNS サーバーの構築 34
3.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2 DNS の仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 ドメインの構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.1 ルートドメイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.2 ドメイン名の記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.3 サブドメイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.4 ドメイン名の取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4 DNS を使った名前解決 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.5 これから構築する DNS の概略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.5.1 アドレス解決の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6 講師マシンへの DNS キャッシュサーバーの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6.1 必要なパッケージを確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6.2 unbound のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.6.3 リクエストを受け付ける IP アドレスの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.4 利用可能なクライアントの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.5 受講者用ドメインの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.6 unbound-keygen の起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.7 unbound の設定確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.8 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.9 unbound の起動と確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.10 自動起動の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.6.11 名前解決の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.7 受講者マシンへの DNS コンテンツサーバーの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.7.1 chroot 機能を利用した BIND のセキュリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.7.2 BIND パッケージの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.7.3 BIND のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.7.4 ゾーンを設定する流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.7.5 /etc/named.conf の基本設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.7.6 ゾーンファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.7.7 設定ファイルの書式確認と注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.8 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.9 BIND の起動と確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.7.10 自動起動の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.7.11 名前解決の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.8 リゾルバの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.8.1 名前解決の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.9 DNS コンテンツサーバーのセキュリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4 Web サーバーの構築 55
4.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
LPI-Japan 2 https://linuc.org
目次 目次
5 メールサーバーの構築 71
5.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2 メールサーバー実習の説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2.1 メールとメールサーバー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.2.2 メールのやり取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.3 実習の進め方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.3.1 実習後の注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.3.2 実習で使用するソフトウェアについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.3.3 実習環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4 Postix のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4.1 必要なパッケージをインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4.2 main.cf の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.4.3 書式のチェック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.4.4 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.4.5 Postix の再起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.4.6 saslauthd サービスの起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5 アカウントの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5.1 host1.alpha.jp に usera を作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5.2 host2.beta.jp に userb を作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.6 メールの送受信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.1 ログの確認用端末の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.2 メール送受信用端末の起動とユーザー切り替え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.3 usera@alpha.jp から userb@beta.jp へメール送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.4 userb のメール着信確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.7 メールクライアントソフトでのメールの送受信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
LPI-Japan 3 https://linuc.org
目次 目次
6 ネットワークとセキュリティの管理 94
6.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.2 ネットワーク管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.1 ネットワークインターフェースの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.2 ネットワークインターフェースの再設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.3 ネットワークインターフェースの動作確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.2.4 サービスのポート番号を確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.3 SSH によるリモートログイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3.1 TELNET との違い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3.2 パスワードによる認証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3.3 公開鍵による認証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.3.4 パスワード認証の禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.4 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.4.1 ファイアウォール設定の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.4.2 許可サービスの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.4.3 許可サービスの取り消し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.4.4 ファイアウォール設定の保存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
104
LPI-Japan 4 https://linuc.org
目次 目次
まえがき
このたび、特定非営利活動法人エルピーアイジャパンは、Linux 技術者教育に利用していただくことを目的とした教材、「Linux
サーバー構築標準教科書」を開発し、インターネット上にて公開し、提供することとなりました。
「Linux サーバー構築標準教科書」に添付されたライセンス(クリエイティブ・コモンズ・ライセンス)の下
公開にあたっては、
に公開されています。
本教科書は、最新の技術動向に対応するため、随時アップデートを行っていきます。また、テキスト作成やアップデートについ
ては、意見交換のメーリングリストで、誰でもオープンに参加できます。
メーリングリストの URL
執筆者・制作者紹介
岡田 賢治(バージョン 1 執筆担当)
川井 義治(バージョン 1 執筆担当)
Linux の講義をするとき、多肢に渡る知識と解説が必要で、前後の内容が複雑に絡み合うむため、教材選定に苦労したり、自作
教材を使っていました。多くの内容の中から実践として使える項目を選び、使いやすい並びを目指して書きました。学校教材の
選択肢の一つや、個人教材として使って頂ければ幸いです。
本教科書は、Linux/オープンソースソフトウェアをこれから勉強する皆さんと、熱心に指導に当たられている先生方の一助にな
ればと思い、作成いたしました。バージョン 3 の改訂にあたっては、新しいディストリビューションへの対応と合わせて、冗長
だった部分を減らして学習しやすい構成にしてあります。
遠山 洋平(バージョン 2 校正・図版作成担当)
田口 貴久(バージョン 2 技術検証担当)
改版にあたり、わかりやすい教科書になるよう、構築でつまづきやすい部分を重点的に検証いたしました。Linux 技術者を目指
す方のお役に立てれば幸いです。
LPI-Japan 5 https://linuc.org
目次 目次
恒川 裕康(バージョン 3 執筆担当)
著作権
本教材の著作権は特定非営利活動法人エルピーアイジャパンに帰属します。
使用に関する権利
表示
本教材は、特定非営利活動法人エルピーアイジャパンに著作権が帰属するものであることを表示してください。
非営利
本教科書は、非営利目的で教材として自由に利用することができます。商業上の利得や金銭的報酬を主な目的とした営利目的で
の利用は、特定非営利活動法人エルピーアイジャパンによる許諾が必要です。ただし、本教科書を利用した教育において、本教
科書自体の対価を請求しない場合は、営利目的の教育であっても基本的に利用できます。その場合も含め、LPI-Japan 事務局ま
でお気軽にお問い合わせください。
(※)営利目的の利用とは以下のとおり規定しております。
営利企業または非営利団体において、商業上の利得や金銭的報酬を目的に当教材の印刷実費以上の対価を受講者に請求して当教
材の複製を用いた研修や講義を行うこと。
• http://list.ospn.jp/mailman/listinfo/linux-text
改変禁止
本教科書は、改変せず使用してください。ただし、引用等、著作権法上で認められている利用を妨げるものではありません。本
教科書に対する改変は、特定非営利活動法人エルピーアイジャパンまたは特定非営利活動法人エルピーアイジャパンが認める団
体により行われています。
本教科書の使用に関するお問合せ先
特定非営利活動法人エルピーアイジャパン(LPI-Japan)事務局
〒106-0041 東京都港区麻布台 1-11-9 BPR プレイス神谷町 7F
TEL:03-3568-4482
E-Mail:info@lpi.or.jp
LPI-Japan 6 https://linuc.org
目次 目次
本教科書の目的
想定している実習環境
本教科書での実習環境として、以下の環境を構築しています。
講師と受講生
教室と割当
実習はコンピューター実習室のような教室で行うことを想定してます。講師の指示に従いながら、受講生が実習を行う形式にな
ります。マシンは、講師、受講生に各名 1 台ずつを想定しています。
1 名で学習する場合
仮想マシン環境
マシンの構成とハードディスク
OS
ネットワーク
実習で利用するマシンは、すべて 1 つのネットワークで接続されていることを前提とします。インターネットへの接続は任意
です。
LPI-Japan 7 https://linuc.org
目次 目次
全体の流れ
本教科書では、以下の通りに実習を進めます。
• 1 章 Linux のインストール準備と事前学習
• 2 章 Linux のインストールと設定を行う
• 3 章 DNS サーバーのインストールと設定を行う
• 4 章 Web サーバーのインストールと設定を行う
• 5 章 メールサーバーのインストールと設定を行う
• 6 章 サーバーのネットワークを管理しセキュリティの設定を行う
LPI-Japan 8 https://linuc.org
1 LINUX のインストール準備と事前学習
1 Linux のインストール準備と事前学習
1.1 用語集
Linux
ディストリビューション
CentOS
ネットワークアドレス
IP ネットワークを小さく分割して利用するときに、ネットワークアドレス部とホストアドレス部に分かれます。ネットワークア
ドレスの識別に利用されるのが、ネットワークアドレス部です。
IP アドレス
サブネットマスク
IP アドレスのうちネットワークアドレス部とホストアドレス部を識別するための数値のことをいいます。通常 8 ビット毎
に.(ドット) で区切って入力されます。
DNS サーバーアドレス
ホスト名
ネットワークに接続されたコンピューターに割り当てられた名称のことをいいます。特定のホストを識別するために使われます。
ドメイン名
インターネット上に存在するコンピューターやネットワークを識別するために付けらている名前の一種のことをいいます。ドメ
イン名はアルファベット、数字、一部の記号の組み合わせで構成されますが、日本語.jp のような国際化ドメインも使われるよう
になっています。
LPI-Japan 9 https://linuc.org
1 LINUX のインストール準備と事前学習 1.2 実習で利用するハードウェア
DVD
ハードディスク
磁気を用いた記憶媒体であり、パソコンの記憶媒体の他、音楽プレーヤー、ビデオなどの記憶媒体としても用いられています。
SSD
半導体メモリであるフラッシュメモリを用いた記憶媒体であり、ハードディスクよりも読み書きの処理性能に優れています。
LVM
RAID
1.2 実習で利用するハードウェア
マシン本体
実装メモリ
DVD 光学ドライブ
USB メモリ
LPI-Japan 10 https://linuc.org
1 LINUX のインストール準備と事前学習 1.3 利用する Linux のディストリビューション
ハードディスク
Linux をインストールするためには記憶装置が必要です。ここでは記憶装置としてハードディスクを使います。インストールに
はハードディスクに約 8GB の空き領域があれば十分なので、一般的な構成の PC では十分満たしていると思います。またハー
ドディスクをフォーマット(初期化)して Linux をインストールします。従って、ハードディスクの中身は全部消去されます。
その為、ハードディスクを削除していい PC を利用するか、バックアップを取ってから作業を行ってください。
その他周辺機器
本体や DVD、光学ドライブ、ハードディスクドライブの他にも、一般的に利用するためにはキーボード、マウス、ディスプレイ
等の周辺機器が必要です。キーボードは、日本語か英語かで設定が異なりますので、日本語キーボード、英語キーボードの区別
を「確認シート」に記述します。
CentOS 公式サイト
ISO イメージをダウンロードする
ダウンロードサイト
http :// ftp.riken.jp/Linux/ centos /7.6.1810/ isos/ x86_64 /CentOS -7- x86_64 -DVD -1810. iso
雑誌や解説書の付録
LPI-Japan 11 https://linuc.org
1 LINUX のインストール準備と事前学習 1.4 ネットワーク環境について
図 1 CentOS7.6 のダウンロードサイト
1.3.2 バージョン
1.4 ネットワーク環境について
本教科書での実習ではネットワークを利用します。ネットワークの設定項目は複数ありますので、次の「ネットワークの設定項
目」の説明を参考にしてあらかじめ別紙「確認シート」を作成した上で設定を行いましょう。
利用するネットワークの各種設定情報が組織のネットワーク管理担当者から指示されている場合は、その内容を「確認シート」
に記述します。本教科書では特定の IP アドレスを用いて設定しますが、それを適宜指示された内容に読み替えてください。
ネットワークを自由に設定できる場合は、本教科書で用いているネットワークの設定を利用して下さい。本教科書では、ネット
ワーク環境としてコンピューター実習教室を想定しています。教室には PC が 3 台以上あり、講師用 PC が 1 台と受講生用 PC
が 2 台以上あるとします。ネットワークは、講師用、受講生用 PC の区別無く、すべての PC が 1 つのネットワークに接続され
ていることを想定しています。
CentOS7 は、インターネットからパッケージを自動的にダウンロードする機能など、インターネットに接続できる環境で利用す
ることを想定しています。そのため、実際にインターネットに接続できる IP アドレスと DNS サーバの設定をすると、簡単に設
定を行うことができます。できるだけ、そのような環境を用意することをお勧めします。
1.4.1 ネットワークの設定項目
ドメイン名
ドメイン名は、DNS サーバーを設定するときに必要になります。受講生同士が同じドメイン名にならなければ、各自自由なドメ
イン名をつけてかまいません。このドメイン名は、あくまでこのネットワーク内のみで有効なドメイン名で、外部の DNS とは
隔離された状態にあります。本教科書では、受講生用に alpha.jp と beta.jp の 2 つを使用します。
ホスト名
LPI-Japan 12 https://linuc.org
1 LINUX のインストール準備と事前学習 1.5 高度なストレージ管理
IP アドレス
サブネットマスク
ネットワークアドレス
デフォルトゲートウエイ
DNS サーバーアドレス
設定項目 本教科書の例 備考
ドメイン名 alpha.jp
ホスト名 host1.alpha.jp
IP アドレス 192.168.1.101
サブネットマスク 255.255.255.0(/24)
ネットワークアドレス 192.168.1.0
デフォルトゲートウエイ 192.168.1.1
DNS サーバーアドレス 192.168.1.10
1.5 高度なストレージ管理
1.5.1 LVM
LPI-Japan 13 https://linuc.org
1 LINUX のインストール準備と事前学習 1.5 高度なストレージ管理
ティションを分割する作業を行います。パーティション分割作業は、容量を決めるのに非常に困難が伴います。
「思ったより利用
が多く、足りなくなってしまった」
「念のため多めにパーティションを割り当てたら、あまり利用されず、大半が未使用になって
しまった」といった具合です。だからといって、パーティションを再分割することは非常に手間がかかります。ハードディスク
の内容を、一度全部消してしまうからです。再度インストール作業を行なった後、設定を行いデータを復元する作業は、相当な
時間や手間を使います。LVM を用いると、パーティションを柔軟に取り扱うことができます。
LVM の仕組みは、次のようになっています。
図 2 LVM の仕組み
PV(Physical Volume)
VG(Volume Group)
LV(Logical Volume)
LVM を用いると、どんな点が便利なのでしょうか?実際にケーススタディで学習してみましょう。
ディスク領域が不足した場合にディスク容量の増加が容易
LPI-Japan 14 https://linuc.org
1 LINUX のインストール準備と事前学習 1.6 RAID
ハードディスクを増設するのも容易
LV の利用率も増え、その元である VG の空き容量が少なくなったとします。そのときは、ハードディスクを増設しますが、LVM
を用いると作業は簡単です。ハードディスクを取り付けて、そのハードディスクを PV とします。その PV を VG に追加する
と、VG 全体の容量が増えます。増えた VG から新しく LV を切り出したり、既存の LV のサイズを増やしたりすることに利用
できる領域を増やすことができます。
1.6 RAID
1.6.1 RAID とは
RAID 0(ストライピング)
2 台以上のディスクを用意し、書き込み時にそれぞれのディスクに分散書き込みを行います。ディスクの処理が分散するので、読
み書きの速度が高速になります。また、使用できるディスク容量はすべてのディスクの容量の合計となります。欠点は、1 台で
もディスクが壊れるとすべてのデータが読み書きできなくなることです。
RAID 1(ミラーリング)
ディスクを 2 台用意し、それぞれに同じ内容を書き込みます。一方のディスクが壊れても、もう一方のディスクが正常であれば
データは失われません。そのため、ディスク障害に強い構成を実現できます。欠点は、利用できる容量が総容量の半分になって
しまうことです。例えば容量 500GB のディスクを 2 台用意しても、使用できる容量は 500GB のままです。
RAID 5(パリティ分散)
ディスクを 3 台以上用意し、パリティという特別な仕組みを一緒に書き込むことでディスクの冗長化を図っています。ディスク
が 1 台故障してもデータを失うことはありません。RAID 5 は 1 台あたりのディスク容量 × (台数-1) の容量が使えますの
で、ディスクの利用効率も良いことになります。たとえば 500GB のディスクを 3 台用意すれば、合計 1TB のディスク容量にな
ります。欠点は、データ書き込み時のパリティ計算の負荷が高いため書き込み性能が高くないことや、故障に耐えられるディス
クが 1 台までなので、運悪く 2 台以上同時に壊れると元データの復元ができないといった点が挙げられます。
RAID 6(複数分散パリティ)
RAID1+0(ミラーリング+ストライピング)
その他の RAID
LPI-Japan 15 https://linuc.org
1 LINUX のインストール準備と事前学習 1.6 RAID
ハードウェア RAID
ソフトウェア RAID
1.6.4 高度なストレージの利用
Linux では(後に紹介しますが)、ディスクを使用するためにパーティションに対して特定のディレクトリをマウントさせます。
デフォルトの構成ではパーティションが一つ作成され、そこにすべてのディレクトリの大元となるルートディレクトリ(”/”)が
マウントされ、そのサブディレクトリとして/var や/home といったディレクトリが作成されます。
LPI-Japan 16 https://linuc.org
2 LINUX のインストール
2 Linux のインストール
2.1 用語集
メディアの整合性
作成されたメディアが、配布されたオリジナルの内容と違いが無いかどうかはメディアの整合性が取れているかどうかで確認で
きます。何らかの原因により整合性が取れていない場合、ソフトウェアのインストールに失敗してしまいます。CentOS ではイ
ンストール手順の開始時、メディアの整合性が取れているかどうかチェックが行えるようになっています。
BIOS
起動順序
タイムゾーン
Linux の動作時に時刻を設定します。通常の時刻を設定するほか、そのマシンが起動している場所の時間帯を設定できます。日
本で動作させるときは、日本標準時 (=JST) に設定します。
フォーマット
ハードディスク等を OS で読み書きできる状態にすることで初期化ともいいます。フォーマットを実行すると、ディスクのデー
タはすべて削除されます。
ファイアウォール
インターネットにコンピューターを直接接続すると不正にアクセスされるおそれがあるため、ファイアウォールを構築します。
ファイアウォールを動作させることで、ネットワークのセキュリティ機能を高めることができます。通常の利用では有効化する
ことが推奨されます。
2.2 インストールの前に用意するもの
確認シート
インストールの前に、1 章で記入した「確認シート」を手元に用意します。この内容を確認しながら、インストール作業を行い
ます。
インストール DVD/USB
LPI-Japan 17 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
マシンの設定
インストールを開始するにあたり、マシンの設定を確認します。確認する内容は、BIOS で設定する「起動順序」です。DVD か
らインストールする場合には、起動順序で必ず DVD ドライブを優先にします。同様に、USB からインストールする場合には、
起動順序で USB デバイスを優先にします。これらのデバイスよりハードディスクの優先度が高いと、ハードディスクにインス
トールされている OS が起動してしまいます。
ハードディスク
本教科書では、CentOS をインストールする際にハードディスクの中身を消去します。従ってハードディスクの中身を消去して
も良い PC を利用するか、ハードディスクの中身のバックアップを取ってから作業を行います。
2.3 インストールの開始
それでは、インストールを開始します。
2.3.1 インストールメディアの読み込み
3. 起動画面が現れます。
2.3.2 言語設定
1. 言語の選択画面が表示されるので、左側のメニューから「日本語 Japanese」を選択します。画面右側のメニューに「日本
語(日本)
」と表示されます。
LPI-Japan 18 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
2.「続行」をクリックします。すると、インストールメニュー画面が表示されます。
「!」が付いた項目は、必ず設定を行わなければならない項目です。
LPI-Japan 19 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
2.3.3 インストール先ディスクの設定
1.「インストール先」のアイコンをクリックします。すると、「インストール先のディスク設定」画面が表示されます。
2.「ローカルの標準ディスク」の欄で、利用するディスクを選択します。
3.「パーティション構成」の欄の「パーティションを自動構成する」を選択します。
4.「完了」をクリックします。すると、インストールメニュー画面に戻ります。
2.3.4 ネットワークとホスト名の設定
1.「ネットワークとホスト名」のアイコンをクリックします。すると、「ネットワーク設定」画面が表示されます。
2.「ホスト名」の欄に、ホスト名を入力します。入力後、
「適用」をクリックします。適用されると、右側の「設定」ボタンの
下にホスト名が表示されます。
LPI-Japan 20 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
3.「設定」をクリックします。次のような画面が表示されます。
4.「IPv4 のセッティング」タブをクリックします。すると、次のような画面が表示されます。
5.「方式」を「手動」に変更します。
6. アドレスの欄の「追加」をクリックすると、アドレス、ネットマスク、ゲートウェイの項目が入力できるようになります。
各項目に設定を行います。
8. 設定が終わったら「保存」をクリックします。
9. ネットワークとホスト名の設定画面に戻ります。「オフ」になっているスイッチをクリックして、「オン」に変更します。
LPI-Japan 21 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
先ほど設定したアドレス、サブネットマスク、デフォルトゲートルート、DNS の値が表示され、ネットワークが有効にな
ります。
10.「完了」をクリックして、インストールメニュー画面に戻ります。
2.3.5 ソフトウェアの選択
1.「ソフトウェアの選択」のアイコンをクリックします。「ソフトウェアの選択」画面が表示されます。
2. ベース環境メニューから「サーバー(GUI 使用)」を選択します。また、選択した環境のアドオンのメニューから「開発
ツール」を選択します。
3. 設定ができたら、「完了」をクリックして、インストールメニューに戻ります。
自動的にソフトウェアの依存関係のチェックが行われます。チェックが終わると「!」がはずれ、
「インストール開始」が
クリックできるようになります。
LPI-Japan 22 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
2.3.6 インストールの開始とパスワード設定
1.「インストール開始」をクリックすると、インストールが始まり、「インストール状況の表示」画面が表示されます。
4. 設定ができたら「完了」をクリックして、「インストール状況の表示」画面に戻ります。
5.「ユーザの作成」のアイコンをクリックします。「ユーザの作成」画面が表示されます。ここでは、管理ユーザを設定し
ます。
LPI-Japan 23 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
6. ユーザ名に管理ユーザの名前を入力します。どのような名前でも構いませんが、本書では、admin を入力します。
7.「このユーザを管理者にする」「このアカウントを使用する場合にパスワードを必要とする」をクリックし、チェックし
ます。
8.「パスワード」「パスワードの確認」に、管理ユーザのパスワードを入力します。パスワードの強度が足りない場合や、2
つのパスワードが一致しない場合には、画面の最下部に警告メッセージが表示されます。
9.「完了」をクリックして、インストール状況の表示画面に戻ります。
10. インストールが完了すると、次のような画面が表示されます。
「再起動」をクリックします。
LPI-Japan 24 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始
2.3.7 インストール後の初期設定
2. 起動プロセスが進み、「初期セットアップ」画面が表示されます。
3.「LICENSE INFORMAITON」のアイコンをクリックします。すると、「ライセンス情報」画面が表示されます。
LPI-Japan 25 https://linuc.org
2 LINUX のインストール 2.4 ログインする
4.「ライセンス契約に同意します。」のチェックボックスをクリックします。
5.「完了」をクリックし、「ライセンス情報」画面に戻ります。
6.「設定の完了」ボタンをクリックすると、初期設定作業はすべて完了です。
2.4 ログインする
1. ユーザ名をクリックします。すると、パスワード入力欄が表示されます。
2. admin のパスワードを入力します。
3. 最初にログインすると、「ようこそ」の画面が表示されます。
LPI-Japan 26 https://linuc.org
2 LINUX のインストール 2.4 ログインする
4. 使用言語が「日本語」になっていることを確認して、「次へ」をクリックします。すると、「入力」画面が表示されます。
5.「日本語(かな漢字)」を選択して、「次へ」をクリックします。すると「プライバシー」画面が表示されます。
LPI-Japan 27 https://linuc.org
2 LINUX のインストール 2.4 ログインする
6.「次へ」をクリックします。「オンラインアカウントへの接続」画面が表示されます。
7. サーバーの管理には不要な項目ですので、「スキップ」をクリックします。すると、「準備完了」画面が表示されます。
LPI-Japan 28 https://linuc.org
2 LINUX のインストール 2.5 コマンドの実行
2.5 コマンドの実行
2.5.1 端末を利用する
端末を起動するには以下の方法があります。
•「アプリケーション」メニューから「システムツール」、「端末」を選択する
• デスクトップ上を右クリックし、ポップアップメニューから「端末を開く」を選択する
「端末」ウインドウは複数起動できるので、一方で操作をしながら一方でログを表示したり、ユーザーを切り替えて操作すること
もできます。
ソフトウェアをダウンロードし、PC にインストールします。
TeraTerm の使い方
1. TeraTerm を起動すると、次のような画面が表示されます。
LPI-Japan 29 https://linuc.org
2 LINUX のインストール 2.5 コマンドの実行
図 3 TeraTerm の起動画面
LPI-Japan 30 https://linuc.org
2 LINUX のインストール 2.6 ローカルリポジトリの設定
5. ログインできると、プロンプトが表示され、端末と同じように利用できるようになります。
TeraTerm も、端末と同様に複数起動し、必要に応じて切り替えて使うことができます。
root ユーザになる
[ admin@host1 ~]$ su -
パ ス ワ ー ド : ******** ← root パ ス ワ ー ド を 入 力
[ root@host1 ~]#
先頭の「[root@host1 ~]#」はプロンプトで、入力待ちであることを示しています。プロンプトには、ユーザ名、ホスト名、カレ
ントディレクトリが表示されています。admin ユーザの場合には、その後ろに「$」が付きます。root ユーザになっている場合
には、必ず「#」になります。確認しながら作業を行います。なお、本書では特に理由がない限り、プロンプトは省略して「# 」
とだけ表記しています。
2.6 ローカルリポジトリの設定
CentOS7 では、標準では、ソフトウェアのパッケージはインターネットからダウンロードするようになっています。もし、イン
ターネットに接続していない状態で演習を行う場合には、ローカルリポジトリの設定を行います。
LPI-Japan 31 https://linuc.org
2 LINUX のインストール 2.6 ローカルリポジトリの設定
ローカルリポジトリの設定ファイルは、/etc/yum.repos.d/CentOS-Media.repo です。このファイルを編集し、ローカルリポジ
トリを有効にし、DVD からインストールが行われるようにします。
/etc/yum.repos.d/CentOS-Media.repo の編集
# vi /etc/yum.repos.d/CentOS -Media.repo
/etc/yum.repos.d/CentOS-Media.repo
[c7 -media]
name=CentOS - $releasever - Media
baseurl ='file :/// run/media/admin/ CentOS 7 x86_64 ' ← 変更する
gpgcheck =1
enabled =1 ← 変更する
gpgkey =file :/// etc/pki/rpm -gpg/RPM -GPG -KEY -CentOS -7
/etc/yum.repos.d/CentOS-Base.repo の編集
# vi /etc/yum.repos.d/CentOS -Base.repo
/etc/yum.repos.d/CentOS-Base.repo
# CentOS -Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client . You should use this for CentOS updates
# unless you are manually picking other mirrors .
#
# If the mirrorlist = does not work for you , as a fall back you can try the
# remarked out baseurl = line instead .
#
#
[base]
name=CentOS - $releasever - Base
mirrorlist =http :// mirrorlist . centos .org /? release = $releasever &arch= $basearc
h&repo=os&infra= $infra
# baseurl =http :// mirror . centos .org/ centos / $releasever /os/ $basearch /
gpgcheck =1
gpgkey =file :/// etc/pki/rpm -gpg/RPM -GPG -KEY -CentOS -7
enabled =0 ← 追加
# released updates
[ updates ]
name=CentOS - $releasever - Updates
mirrorlist =http :// mirrorlist . centos .org /? release = $releasever &arch= $basearc
h&repo= updates &infra= $infra
# baseurl =http :// mirror . centos .org/ centos / $releasever / updates / $basearch /
gpgcheck =1
gpgkey =file :/// etc/pki/rpm -gpg/RPM -GPG -KEY -CentOS -7
enabled =0 ← 追加
LPI-Japan 32 https://linuc.org
2 LINUX のインストール 2.6 ローカルリポジトリの設定
LPI-Japan 33 https://linuc.org
3 DNS サーバーの構築
3 DNS サーバーの構築
3.1 用語集
ドメイン名とゾーン
FQDN
ドメイン名表記で、一番右に「.」
(ドット)でルートドメインまでを記述する方式を FQDN と呼びます。
DNS
ゾーン
DNS キャッシュサーバー
DNS コンテンツサーバー
リゾルバ
BIND
unbound
LPI-Japan 34 https://linuc.org
3 DNS サーバーの構築 3.2 DNS の仕組み
グルーレコード
A レコード
名前に対して IP アドレスを指定するためのレコードです。
メールアドレスに利用するドメイン名を定義するためのレコードです。メールサーバーの障害にも対応するために、複数個の
メールサーバーを記述でき、プリファレンス値の低いサーバーにメール配信が優先されます。
インターネットの研究が始まった当初は IP アドレスが割り当てられたコンピューターの数も数えるほどだったので、ホスト名
と IP アドレスの対応関係はファイルに記述されて、定期的に更新されていました。この仕組みは今でも残っており、Linux で
は/etc/hosts がそのファイルです。しかし、インターネットが広まるに従って、ホストファイルでは管理しきれなくなってきま
した。そこで登場したのが DNS(Domain Name System) です。
3.3 ドメインの構造
DNS が取り扱うドメイン名は設計上、ルートドメインを頂点とした階層型のツリー構造となっています。ちょうど、コンピュー
ターのファイルシステムがルートディレクトリを頂点としたツリー構造になっているのと同じだと考えてよいでしょう。そして、
その配下にあるドメインはサブドメインとよばれます。ドメインの階層型のツリーは、ルートドメインとたくさんのサブドメイ
ンから構成されています。
3.3.1 ルートドメイン
ルートドメインは、ドメイン名の開始点です。通常は省略されますが、DNS 名として記述する際には「.」(ドット)で表され
ます。
LPI-Japan 35 https://linuc.org
3 DNS サーバーの構築 3.3 ドメインの構造
図 4 DNS の構造
トップレベルドメイン
3.3.2 ドメイン名の記述
ドメイン名の記述例
• example.com.
• example.jp.
• example.co.jp.
トップレベルドメイン以降のドメイン名は、ドメイン取得者が独自にドメイン名を決めることができます。上記の例では example
ルートドメイン
の部分が独自のドメイン名にあたります。なお、最後の「.」は、トップレベルドメインを示していますが、省略して表記するこ
とがあります。
LPI-Japan 36 https://linuc.org
3 DNS サーバーの構築 3.4 DNS を使った名前解決
3.3.3 サブドメイン
記述例のようにドメイン名の左側にさらにドメイン名を記述していくことを「サブドメイン化」と呼びます。たとえば、
example.co.jp ドメインをさらに東京と大阪の 2 つに分けて表記したいような場合には、以下の例のように記述します。
• tokyo.example.co.jp.
• osaka.example.co.jp.
サブドメイン化は、上位の(右側の)ドメインを管理している管理者が行います。たとえば、tokyo.example.co.jp ドメインまで
のサブドメインの階層は次のようになっています。
1. jp ドメインはルートドメインのサブドメイン
2. co.jp ドメインは jp ドメインのサブドメイン
3. example.co.jp ドメインは co.jp ドメインのサブドメイン
4. tokyo.example.co.jp ドメインは example.co.jp ドメインのサブドメイン
3.3.4 ドメイン名の取得
ドメイン名を取得するということは、上位のドメイン名の管理者にサブドメインを作ってもらい、管理権限を委譲してもらうと
いうことになります。短いドメイン名を取得したいのであればトップレベルドメインを管理している管理組織からサブドメイン
化してもらうことになりますが、既にドメイン名を取得している管理者からサブドメインの管理権限を委譲してもらうこともで
きます。
各マシンには、以下のような役割を割り当てます。
• 講師のマシン
DNS キャッシュサーバー
• 受講生 A のマシン
alpha.jp ドメインを受け持つ DNS コンテンツサーバー
• 受講生 B のマシン
beta.jp ドメインを受け持つ DNS コンテンツサーバー
教室の環境はインターネットに接続されている必要はありません。
LPI-Japan 37 https://linuc.org
3 DNS サーバーの構築 3.5 これから構築する DNS の概略
図 5 DNS の名前解決の仕組み
図6 演習の環境
表 2: 演習で使うドメインと IP アドレス
講師 受講生 A 受講生 B
LPI-Japan 38 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定
図 7 演習で使うアドレスとドメイン
3.5.1 アドレス解決の流れ
3.6.1 必要なパッケージを確認
unbound パッケージの確認
パッケージがインストールされていない場合には、次のように表示されます。
LPI-Japan 39 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定
unbound パッケージがない場合
unbound のインストール
依存性を解決しました
================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
bind -utils x86_64 32:9.9.4 -72. el7 base 206 k
unbound x86_64 1.6.6 -1. el7 base 673 k
ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 2 パッ ケー ジ
総 ダ ウ ン ロ ー ド 容 量 : 879 k
イ ン ス ト ー ル 容 量 : 2.8 M
Is this ok [y/d/N]: y ← yを 入 力
Downloading packages :
(1/2): bind -utils -9.9.4 -72. el7. x86_64 .rpm | 206 kB 00:00
(2/2): unbound -1.6.6 -1. el7. x86_64 .rpm | 673 kB 00:00
--------------------------------------------------------------------------------
合計 1.5 MB/s | 879 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : 32: bind -utils -9.9.4 -72. el7. x86_64 1/2
イ ン ス トー ル 中 : unbound -1.6.6 -1. el7. x86_64 2/2
検証中 : unbound -1.6.6 -1. el7. x86_64 1/2
LPI-Japan 40 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定
イ ン ス トー ル:
bind -utils. x86_64 32:9.9.4 -72. el7 unbound . x86_64 0:1.6.6 -1. el7
完 了 し ま し た!
/etc/unbound/local.d/interface.conf
interface : 192.168.1.10
interface : 127.0.0.1
3.6.4 利用可能なクライアントの設定
DNS キャッシュサーバーは、不正に利用されないように必ず利用者を制限して使います。/etc/unbound/local.d/client.conf
ファイルを作成し、この DNS キャッシュサーバーを利用できるクライアントの設定を行います。ここでは、192.168.1.0/24 の
ネットワーク全体を許可します。
/etc/unbound/local.d/client.conf
3.6.5 受講者用ドメインの設定
/etc/unbound/conf.d/stub.conf
stub -zone:
name: alpha.jp.
stub -addr: 192.168.1.101
stub -prime: no
stub -first: no
stub -zone:
name: beta.jp.
stub -addr: 192.168.1.102
stub -prime: no
stub -first: no
unbound-keygen の起動
LPI-Japan 41 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定
設定を行ったら、書式のチェックを行っておきましょう。
unbound の設定の確認
# unbound - checkconf
unbound - checkconf : no errors in /etc/ unbound / unbound .conf
「no errors」と表示されていれば、書式エラーがないということです。エラーがある場合には、次のようにエラーの内容が表示さ
れます。
unbound の設定にエラーがあるとき
# unbound - checkconf
[1550047518] unbound - checkconf [27152:0] fatal error: cannot parse interface specified
as '127.0.0.1. '
エラーの内容を確認して、修正します。
3.6.8 ファイアウォールの設定
次に、DNS キャッシュサーバーへの問い合わせができるようにファイアウォールのサービス許可設定を行います。
DNS アクセスの許可
さらに、設定を保存しておきます。
Firewall ルールの保存
unbound の起動
起動ができたら、念のため確認します。
unbound の起動確認
LPI-Japan 42 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定
2 月 13 17:46:55 host0 systemd [1]: Starting Unbound recursive Domain Nam .....
2 月 13 17:46:55 host0 unbound - checkconf [28373]: unbound - checkconf : no err ...
2 月 13 17:46:55 host0 systemd [1]: Started Unbound recursive Domain Name ...r.
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] notice : init module 0: i...d
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] notice : init module 1: v...r
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] notice : init module 2: i...r
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] info: start of service (....
Hint: Some lines were ellipsized , use -l to show in full.
unbound の再起動
unbound の再起動
3.6.10 自動起動の設定
unbound の自動起動の確認
「enabled」と表示されます。この例のように「disabled」と表示される場合には、自動起
自動起動の設定がされている場合には、
動設定が行われていません。次のようにして、自動起動設定を行います。
unbound の自動起動の設定
3.6.11 名前解決の確認
講師 PC がインターネットと通信できる環境の場合には、この時点でインターネットの様々なサイトの名前解決ができるはずで
す。まずは、それを確認しておきましょう。
名前解決の確認
LPI-Japan 43 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
chroot 機能はプログラムに対して特定のディレクトリ以外にはアクセスできないようにするための機能です。
図 8 chroot 利用時のディレクトリイメージ
bind パッケージの確認
LPI-Japan 44 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
パッケージがインストールされていない場合は次のように表示されます。
bind パッケージがない場合
bind のインストール
依存性を解決しました
================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
bind x86_64 32:9.9.4 -72. el7 base 1.8 M
bind - chroot x86_64 32:9.9.4 -72. el7 base 88 k
bind -utils x86_64 32:9.9.4 -72. el7 base 206 k
ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 3 パッ ケー ジ
総 ダ ウ ン ロ ー ド 容 量 : 2.1 M
イ ン ス ト ー ル 容 量 : 5.0 M
Is this ok [y/d/N]: y ← yを 入 力
Downloading packages :
(1/3): bind -chroot -9.9.4 -72. el7. x86_64 .rpm | 88 kB 00:00
(2/3): bind -utils -9.9.4 -72. el7. x86_64 .rpm | 206 kB 00:00
LPI-Japan 45 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
イ ン ス トー ル:
bind. x86_64 32:9.9.4 -72. el7 bind - chroot . x86_64 32:9.9.4 -72. el7
bind -utils. x86_64 32:9.9.4 -72. el7
完 了 し ま し た!
3.7.4 ゾーンを設定する流れ
ゾーンを追加するために必要な作業は次となります。
• named.conf ファイルにゾーンを追加
• ゾーンファイルを記述
/etc/named.conf の編集
# vi /etc/named.conf
受け付ける IP アドレスの設定(/etc/named.conf)
options {
listen -on port 53 { 127.0.0.1; 192.168.1.101; }; ← 修正
listen -on -v6 port 53 { ::1; };
directory "/ var/named ";
dump -file "/ var/named/data/ cache_dump .db";
statistics -file "/ var/named/data/ named_stats .txt ";
memstatistics -file "/ var/named/data/ named_mem_stats .txt ";
recursing -file "/ var/named/data/named. recursing ";
secroots -file "/ var/named/data/named. secroots ";
allow -query { any; }; ← 修正
recursion no; ← 修正
LPI-Japan 46 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
logging {
channel default_debug {
file "data/named.run ";
severity dynamic ;
};
};
zone "." IN {
type hint;
file "named.ca";
};
zone "alpha.jp" IN { ← 正 引 き ゾー ン の 設 定 を 追 加
type master ;
file "alpha.jp.zone ";
allow - update { none; };
};
問い合わせを受け付けるアドレスの設定
問い合わせを許可するアドレスの設定
DNS コンテンツサーバーとしての設定
正引きゾーンの設定
alpha.jp の正引きゾーンの設定を追加します。指定している「alpha.jp.zone」という名前のファイルにゾーンの設定を行います。
LPI-Japan 47 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
3.7.6 ゾーンファイルの作成
named.conf で定義したゾーンの内容を記述するゾーンファイルの作成を行います。
ゾーンファイルの準備
ゾーンファイルのお手本となる/var/named/named.empty ファイルをコピーします。
ゾーンファイルのコピー
# cd /var/named
# cp -p named.empty alpha.jp.zone
# ls -l alpha.jp.zone
-rw -r-----. 1 root named 152 12 月 15 2009 alpha.jp.zone
ゾーンファイルの修正
コピーした/var/named/alpha.jp.zone ファイルを修正します。
ゾーンファイルの修正
# vi /var/named/alpha.jp.zone
alpha.jp.zone
$TTL 3H
$ORIGIN alpha.jp.
@ IN SOA host1 root (
2019021401 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS host1.alpha.jp.
MX 10 mail.alpha.jp.
host1 A 192.168.1.101
www A 192.168.1.101
mail A 192.168.1.101
vhost1 A 192.168.1.101
vhost2 A 192.168.1.101
MX レコードは受講生ドメインのメールサーバーを定義します。
LPI-Japan 48 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
ゾーンファイルの書式確認
ゾーンファイルを編集時、よくあるミスとしては、括弧の不足、セミコロンの不足などがあります。編集後、BIND を起動する
前に編集したゾーンファイルに間違いがないかよく確認しましょう。
zone ファイルの確認
zone ファイルの書式が不正な場合
3.7.7 設定ファイルの書式確認と注意点
/etc/named.conf ファイルでも、括弧の不足やセミコロンの不足などは良くあるミスです。一通りの設定ができたら、/etc/-
named.conf の初期確認をしておきましょう。次のように、named-checkconf を実行します。
/etc/named.conf の確認
# named - checkconf
この例のように、何も表示されなければ書式に問題がないということです。問題がある場合には、次のように問題がありそうな
行番号が表示されます。
/etc/named.conf の書式が不正な場合
# named - checkconf
/etc/named.conf :68: missing ';' before end of file
3.7.8 ファイアウォールの設定
次に、DNS コンテンツサーバーへの問い合わせができるようにファイアウォールのサービス許可設定を行います。
DNS アクセスの許可
さらに、設定を保存しておきます。
Firewall ルールの保存
LPI-Japan 49 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
BIND の起動
起動ができたら、念のため確認します。
BIND の起動確認
BIND の再起動
BIND の再起動
3.7.10 自動起動の設定
LPI-Japan 50 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定
BIND の自動起動の確認
「enabled」と表示されます。この例のように「disabled」と表示される場合には、自動起
自動起動の設定がされている場合には、
動設定が行われていません。次のようにして、自動起動設定を行います。
BIND の自動起動の設定
3.7.11 名前解決の確認
host コマンドで名前を確認
host コマンドでの確認
LPI-Japan 51 https://linuc.org
3 DNS サーバーの構築 3.8 リゾルバの変更
dig コマンドでドメインを確認
dig コマンドでの確認
; <<>> DiG 9.9.4 - RedHat -9.9.4 -73. el7_6 <<>> alpha.jp axfr @192 .168.1.101
;; global options : +cmd
alpha.jp. 10800 IN SOA host1.alpha.jp. root.alpha.jp. 2019021401 86400 3600
604800 10800
alpha.jp. 10800 IN NS host1.alpha.jp.
alpha.jp. 10800 IN MX 10 mail.alpha.jp.
host1.alpha.jp. 10800 IN A 192.168.1.101
mail.alpha.jp. 10800 IN A 192.168.1.101
vhost1 .alpha.jp. 10800 IN A 192.168.1.101
vhost2 .alpha.jp. 10800 IN A 192.168.1.101
www.alpha.jp. 10800 IN A 192.168.1.101
alpha.jp. 10800 IN SOA host1.alpha.jp. root.alpha.jp. 2019021401 86400 3600
604800 10800
;; Query time: 6 msec
;; SERVER : 192.168.1.101#53(192.168.1.101)
;; WHEN: 木 2 月 14 16:28:03 JST 2019
;; XFR size: 9 records ( messages 1, bytes 242)
3.8 リゾルバの変更
GNOME のデスクトップのアプリケーションメニューから「システムツール」→「設定」を選択します。表示された設定画面の
左側のメニューから「ネットワーク」を選択します。
「有線」の欄にある歯車のボタンをクリックすると、接続プロファイルの設定画面が表示されます。「IPv4」のタブをクリックす
ると、次のような画面になります。
LPI-Japan 52 https://linuc.org
3 DNS サーバーの構築 3.8 リゾルバの変更
図9 設定画面
図 10 ネットワーク詳細設定画面
LPI-Japan 53 https://linuc.org
3 DNS サーバーの構築 3.9 DNS コンテンツサーバーのセキュリティ
3.8.1 名前解決の確認
host コマンドでの動作確認
# host -t ns alpha.jp
alpha.jp name server host1.alpha.jp.
# host -t mx alpha.jp
alpha.jp mail is handled by 10 mail.alpha.jp.
また、他の受講者マシンの設定も問合せができることを確認してみましょう。
host コマンドでの動作確認
# host -t ns beta.jp
beta.jp name server host1.beta.jp.
# host -t mx beta.jp
beta.jp mail is handled by 10 mail.beta.jp.
options {
( 略 )
allow - transfer { localhost ; 192.168.1.0/24; };
( 略 )
};
LPI-Japan 54 https://linuc.org
4 WEB サーバーの構築
4 Web サーバーの構築
4.1 用語集
Web サーバー用のドキュメントを書くためのタグを使って文章を構造的に記述できるマークアップ言語です。他ドキュメントへ
のハイパーリンクを書いたり、画像利用したり、リストや表などの高度な表現も可能です。
セッション
通信の接続を確立してから切断するまでを一つのセッションといいます。
ディレクティブ
BASIC 認証
DIGEST 認証
インターネット上のリソースを指定するための記述方法で、ホームページのアドレスやメールのアドレスなどを指定できます。
リソースを特定するスキーム名とアドレスを://でつないで書きます。
LPI-Japan 55 https://linuc.org
4 WEB サーバーの構築 4.2 Web サーバーの仕組み
図 11 Web サーバーの動作の仕組み
LPI-Japan 56 https://linuc.org
4 WEB サーバーの構築 4.3 これから構築する Web サーバーの概略
図 12 実習の環境
表 3: 講師
項目 設定値
ホスト名 host0.jp
IP アドレス 192.168.1.10
表 4: 受講生 A
項目 設定値
役割 Web サーバー
ホスト名 host1.alpha.jp
IP アドレス 192.168.1.101
LPI-Japan 57 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定
表 5: 受講生 B
項目 設定値
役割 Web ブラウザー
ホスト名 host2.beta.jp
IP アドレス 192.168.1.102
Web サーバーの動作に必要なパッケージおよび設定ファイルを確認し、サービスを起動して動作を確認します。
4.4.1 必要なパッケージを確認
rpm コマンドで必要なパッケージがインストールされているかを確認します。
httpd パッケージの確認
# rpm -q httpd
httpd -2.4.6 -88. el7. centos . x86_64
パッケージがインストールされていない場合は次のように表示されます。
httpd パッケージがない場合
# rpm -q httpd
パ ッ ケ ー ジ httpd は イ ン ス ト ー ル さ れ て い ま せ ん 。
4.4.2 必要なパッケージをインストール
httpd のインストール
LPI-Japan 58 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定
--> 依 存 性 解 決 を 終 了 し ま し た 。
依存性を解決しました
================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー
容量
================================================================================
イ ン ス トー ル 中:
httpd x86_64 2.4.6 -88. el7. centos base 2.7 M
依 存 性 関 連 で の イ ン ス トー ル を し ま す:
httpd -tools x86_64 2.4.6 -88. el7. centos base 90 k
mailcap noarch 2.1.41 -2. el7 base 31 k
ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 1 パ ッ ケ ー ジ (+2 個 の 依 存 関 係 の パ ッ ケ ー ジ )
総 ダ ウ ン ロ ー ド 容 量 : 2.8 M
イ ン ス ト ー ル 容 量 : 9.6 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
(1/3): httpd -tools -2.4.6 -88. el7. centos . x86_64 .rpm | 90 kB 00:00
(2/3): httpd -2.4.6 -88. el7. centos . x86_64 .rpm | 2.7 MB 00:00
(3/3): mailcap -2.1.41 -2. el7. noarch .rpm | 31 kB 00:00
--------------------------------------------------------------------------------
合計 2.6 MB/s | 2.8 MB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : mailcap -2.1.41 -2. el7. noarch 1/3
イ ン ス トー ル 中 : httpd -tools -2.4.6 -88. el7. centos . x86_64 2/3
イ ン ス トー ル 中 : httpd -2.4.6 -88. el7. centos . x86_64 3/3
検証中 : httpd -tools -2.4.6 -88. el7. centos . x86_64 1/3
検証中 : mailcap -2.1.41 -2. el7. noarch 2/3
検証中 : httpd -2.4.6 -88. el7. centos . x86_64 3/3
イ ン ス トー ル:
httpd. x86_64 0:2.4.6 -88. el7. centos
依 存 性 関 連 を イ ン ス トー ル し ま し た:
httpd -tools. x86_64 0:2.4.6 -88. el7. centos mailcap . noarch 0:2.1.41 -2. el7
完 了 し ま し た!
4.4.3 設定ファイルの修正
LPI-Japan 59 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定
httpd のインストール
# cat /etc/httpd/conf/httpd.conf
( 略 )
#
# ServerRoot : The top of the directory tree under which the server 's
# configuration , error , and log files are kept.
#
# Do not add a slash at the end of the directory path. If you point
# ServerRoot at a non -local disk , be sure to specify a local disk on the
# Mutex directive , if file -based mutexes are used. If you wish to share the
# same ServerRoot for multiple httpd daemons , you will need to change at
# least PidFile .
#
ServerRoot "/ etc/httpd"
#
# Listen : Allows you to bind Apache to specific IP addresses and/or
# ports , instead of the default . See also the <VirtualHost >
# directive .
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses .
#
# Listen 12.34.56.78:80
Listen 80
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule ' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example :
# LoadModule foo_module modules / mod_foo .so
#
Include conf. modules .d/*. conf
( 略 )
ディレクティブでデフォルトの設定と同じ内容の多くはコメントになっています。いくつかの基本的なディレクティブを次の表
にまとめました。このデフォルトで設定されているディレクティブは最小限必要な項目なので、これらのディレクティブの設定
値があれば (ディレクトリなどがあれば)、Apache は動作します。
表 6: 基本的なディレクティブ
ディレクティブ名 内容 設定例
Listen サービスを受けるポート番号 80
DocumentRoot 公開するディレクトリ /var/www/html
ServerName サーバーの名前 www.alpha.jp
DirectoryIndex /をアクセスした時にアクセスするファイル index.html
LPI-Japan 60 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定
ディレクティブ名 内容 設定例
4.4.4 テストファイルの作成
Web サーバーの機能を一文に要約すると、クライアントが要求するドキュメントや画像などのデータを転送する働きをするのが
Web サーバーです。Web サーバーが動作するかチェックするためには/var/www/html ディレクトリに index.html ファイルを
作成します。
テストファイルの作成
4.4.5 ファイアウォールの設定
HTTP アクセスの許可
さらに、設定を保存しておきます。
Firewall ルールの保存
Apache の起動
Apache の起動
LPI-Japan 61 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定
Tasks: 6
CGroup : / system .slice/httpd. service
├ ─ 27616 /usr/sbin/httpd -DFOREGROUND
├ ─ 27617 /usr/sbin/httpd -DFOREGROUND
├ ─ 27618 /usr/sbin/httpd -DFOREGROUND
├ ─ 27619 /usr/sbin/httpd -DFOREGROUND
├ ─ 27620 /usr/sbin/httpd -DFOREGROUND
└ ─ 27621 /usr/sbin/httpd -DFOREGROUND
2 月 18 15:39:15 centos7 systemd [1]: Starting The Apache HTTP Server ...
2 月 18 15:39:15 centos7 systemd [1]: Started The Apache HTTP Server .
4.4.7 自動起動の設定
「enabled」と表示されます。この例のように「disabled」と表示される場合には、自動起
自動起動の設定がされている場合には、
動設定が行われていません。次のようにして、自動起動設定を行います。
Apache の自動起動の設定
図 13 ブラウザーの表示
LPI-Japan 62 https://linuc.org
4 WEB サーバーの構築 4.5 ページが見つからないとき
図 14 隣の受講生のブラウザー表示
4.5 ページが見つからないとき
図 15 テストページ
エラーページのファイル群
# ls /usr/share/httpd/error/
HTTP_BAD_GATEWAY .html.var HTTP_REQUEST_ENTITY_TOO_LARGE .html.var
HTTP_BAD_REQUEST .html.var HTTP_REQUEST_TIME_OUT .html.var
HTTP_FORBIDDEN .html.var HTTP_REQUEST_URI_TOO_LARGE .html.var
HTTP_GONE .html.var HTTP_SERVICE_UNAVAILABLE .html.var
HTTP_INTERNAL_SERVER_ERROR .html.var HTTP_UNAUTHORIZED .html.var
HTTP_LENGTH_REQUIRED .html.var HTTP_UNSUPPORTED_MEDIA_TYPE .html.var
HTTP_METHOD_NOT_ALLOWED .html.var HTTP_VARIANT_ALSO_VARIES .html.var
HTTP_NOT_FOUND .html.var README
HTTP_NOT_IMPLEMENTED .html.var contact .html.var
HTTP_PRECONDITION_FAILED .html.var include
「アクセスしたページが見つからない」などの理由によって、それに対応するエラーページが表示されます。
LPI-Japan 63 https://linuc.org
4 WEB サーバーの構築 4.5 ページが見つからないとき
Apache はアクセス情報とエラー情報をログに記録しています。また、エラーメッセージに対応するエラーページを表示します。
ここでは Aapche がエラーを表示したときのエラーコードに対する意味を説明します。
表 7: Apache のエラーコード
番号 理由 意味
LPI-Japan 64 https://linuc.org
4 WEB サーバーの構築 4.6 アクセス制御
4.5.2 ログファイルの確認
ログの確認
表 8: ログ関係のディレクティブ
ディレクティブ名 内容 設定例
4.6 アクセス制御
LPI-Japan 65 https://linuc.org
4 WEB サーバーの構築 4.6 アクセス制御
4.6.1 テキストファイルを作成
認証をかけたディレクトリとファイルを作成します。
認証を掛けるディレクトリとページの作成
アクセス制御を設定する前であれば、制限をかけたいディレクトリやファイルであっても見えてしまいます。Web ブラウザーで
以下のアドレスにアクセスできることを確認します。
図 16 認証を掛ける前のページ
4.6.2 アクセス制御を設定
Apache でアクセス制御を設定するには設定ファイルにアクセス制御の設定を追加し、コマンドでパスワードファイルを作りま
す。/etc/httpd/conf/httpd.conf 設定ファイルに/var/www/html/secret ディレクトリの設定を追記します。
/etc/httpd/conf/httpd.conf ファイルの最下行に追記
表 9: アクセス制御関係のディレクティブ
ディレクティブ名 内容 設定例
次にパスワードファイルを作成します。パスワードファイルは重要なファイルなので、他のユーザーから見えないように設定し
ます。ファイル作成後、Apache を動かしている apache ユーザーからのみ読みこめるように、ファイルの所有者とモードを変更
します。
4.6.3 設定の再読み込み
設定を変更したので、Apache に設定を再読み込みさせます。
設定の再読み込み
Web ブラウザーで自分のアドレス(http://www.alpha.jp/secret)を確認します。認証のダイアログが表示されるので、初めに
登録していない適当なユーザー名と適当なパスワードを入力すると何度も認証のダイアログが表示されること (認証エラー) を確
認します。次に登録した linuc ユーザーとパスワードを入力すると作成したファイルが表示されます。
図 17 認証を掛けたページへのアクセス
4.6.5 ログファイルの確認
認証時のログファイルを確認します。
認証時のログの確認
LPI-Japan 67 https://linuc.org
4 WEB サーバーの構築 4.7 バーチャルホストを作成する
192.168.1.101 - linuc [18/ Feb /2019:16:55:08 +0900] "GET / secret / HTTP /1.1" 304 - "-"
" Mozilla /5.0 (X11; Linux x86_64 ; rv :60.0) Gecko /20100101 Firefox /60.0"
認証に失敗するとエラーログファイルにユーザーがみつからないというエラーメッセージが残ります。
4.7 バーチャルホストを作成する
• DNS で 1 つの IP アドレスに対して別々のホスト名を割り当てる
• Apache でバーチャルホストの設定を行う
• Linux にそれぞれのバーチャルホスト用のディレクトリを作成する
4.7.1 IP アドレスと名前の確認
DNS を確認
4.7.2 バーチャルホストの設定
表 10: バーチャルホスト関係のディレクティブ
ディレクティブ 内容 具体例
/etc/httpd/conf.d/virtualhost.conf ファイルを作成し、次のように設定を行います。
/etc/httpd/conf.d/virtualhost.conf を作成
LPI-Japan 68 https://linuc.org
4 WEB サーバーの構築 4.7 バーチャルホストを作成する
VirtualHost のブロック内では、ドメイン名、ドメインにアクセスしたときに表示するコンテンツの参照先、サーバーの管
理者のメールアドレス、ログの出力先を定義します。上記のように設定した場合は、www.alpha.jp にアクセスした場合は
/var/www/html 配下のコンテンツが表示され、ログが/var/log/httpd/access_log に保存されます。エラーがあった場合はエ
ラーログが/var/log/httpd/error_log に保存されます。
4.7.3 テストファイルを作成
テスト用ページの作成
4.7.4 設定ファイルの再読み込み
バーチャルホストの定義を書き加えて設定ファイルを変更したので、Apache に設定ファイルを再読み込みさせます。
設定ファイルの再読み込み
LPI-Japan 69 https://linuc.org
4 WEB サーバーの構築 4.7 バーチャルホストを作成する
図 18 vhost1.alpha.jp の表示
図 19 vhost2.alpha.jp の表示
4.7.6 ログファイルの確認
正しく起動したかをログファイルが作られているかで確認してみてください。
バーチャルホストログの確認
# ls -l /var/log/httpd
合 計 20
-rw -r--r--. 1 root root 8482 2 月 18 17:13 access_log
-rw -r--r--. 1 root root 7075 2 月 18 17:26 error_log
-rw -r--r--. 1 root root 144 2 月 18 17:28 vhost1 .alpha.jp - access_log
-rw -r--r--. 1 root root 0 2 月 18 17:26 vhost1 .alpha.jp - error_log
-rw -r--r--. 1 root root 210 2 月 18 17:33 vhost2 .alpha.jp - access_log
-rw -r--r--. 1 root root 0 2 月 18 17:26 vhost2 .alpha.jp - error_log
LPI-Japan 70 https://linuc.org
5 メールサーバーの構築
5 メールサーバーの構築
5.1 用語集
メールサーバー
電子メールのサービスを行います。クライアントよりメールを受け取り、バケツリレーの方式で相手先のメールサーバーまで送
ります。また、受信用のメールサーバーでは、送ってきたメールを蓄積しておいて、クライアントの要求に応じて応答します。
電子メールの送信、転送のときに利用されるプロトコルのことです。
SMTP 認証
SMTP でのメールを送信する際に認証を行う機構です。迷惑メール対策としてのメール中継の制限を、この認証機能で許可す
る、といった利用方法があります。
クライアントが電子メールを取り寄せるときに利用されるプロトコルです。シンプルな設計で、IMAP4 と比べて機能が少ない
です。
クライアントが電子メールを取り寄せるときに利用されるプロトコルです。メールのフォルダ機能サポート等、多機能です。
Postix
Dovecot
Thunderbird
5.2 メールサーバー実習の説明
メールサーバーの設定と動作確認を行います。メールは、インターネットにおいて、Web に並んで重要なサービスです。メール
サーバーを設定し、実際にメールをやり取りすることで、動作原理を確認してみましょう。
LPI-Japan 71 https://linuc.org
5 メールサーバーの構築 5.2 メールサーバー実習の説明
5.2.1 メールとメールサーバー
メールは、メールサーバーを介してやり取りが行われます。
メールサーバーがメールを受け取ると、宛先のメールアドレスを担当しているメールサーバーまでバケツリレー方式で送られま
す。これは、Thunderbird/Outlook のようなメールクライアントソフトからのメールでも、Gmail/Hotmail/Yahoo メールのよ
うな Web メールからのメールでも、動作原理は同じです。
電子メールは、送受信でプロトコルが異なります。POP3 は電子メールを受信するときに利用するプロトコルです。非常にシン
プルなプロトコルで、ユーザー名、パスワードを利用して接続し、メールの内容を受信します。
IMAP4
5.2.2 メールのやり取り
インターネット上で、沢山の人が電子メールを利用しています。電子メールは以下の手順でやり取りされます。
1. 送信側のメールクライアントからメールを送信します
2. メールは送信用メールサーバーを経由して相手のメールサーバーに配信されます
3. 相手の受信側のメールサーバーにメールが届きます
4. 受信側のメールクライアントで受信側のメールサーバーに接続します
5. メールが受信され、メールを見ることができます
• 1 台のマシンで、メールサーバーとメールクライアントの 1 台 2 役とします
• 自分のメールサーバーに、自分のメールアカウントを作成します
• 相手のメールサーバーに、相手のメールアカウントが作成されます
• 自分のメールクライアントは、自分のメールサーバーを送受信用サーバーとして設定します
LPI-Japan 72 https://linuc.org
5 メールサーバーの構築 5.3 実習の進め方
5.3 実習の進め方
本章では、次の手順で実習を行います。実習でのメールの送受信は、大きく分けて 2 回あります。
mail コマンドを利用する
図 20 実習の流れ
LPI-Japan 73 https://linuc.org
5 メールサーバーの構築 5.3 実習の進め方
メールクライアントソフトを利用する
図 21 メールクライアントを使った実習の流れ
5.3.1 実習後の注意点
設定したメールサーバーは、あくまで実習用にメールのやり取りをするために設定されています。ですが、セキュリティ等決し
て頑丈に設定してある訳ではないので、以下の点に留意します。
• 決してグローバル環境には接続しない。
• 実習後はメールサーバーを止める、もしくは本体自体を止める。LAN の中に不正中継を探すマシンがあった場合、それに
利用される可能性があるからです。
5.3.2 実習で使用するソフトウェアについて
Postix
mail コマンド
本実習では、メールで送るときと届いたメールを読むときに利用します。
Dovecot
LPI-Japan 74 https://linuc.org
5 メールサーバーの構築 5.3 実習の進め方
Thunderbird
saslauthd
LPI-Japan 75 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール
5.3.3 実習環境
実習では、受講生二人一組で実習を行います。本章では、それを便宜的に「A さん」
「B さん」と呼びます。特に明示がない場合
は、両者とも作業を行います。どちらか片方の方が作業をするときは、「次は A さんの作業です」といったように、作業する方
を明示します。
設定は、alpha.jp のマシン上で行うものとします。ホスト名は、各自読み替えてください。
図 22 実習環境
postix パッケージの確認
# rpm -q postfix
postfix -2.10.1 -7. el7. x86_64
パッケージがインストールされていない場合は次の様に表示されます。
postix パッケージの確認
# rpm -q postfix
パ ッ ケ ー ジ postfix は イ ン ス ト ー ル さ れ て い ま せ ん 。
5.4.1 必要なパッケージをインストール
postix のインストール
LPI-Japan 76 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール
依存性を解決しました
================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
postfix x86_64 2:2.10.1 -7. el7 base 2.4 M
ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 1 パッ ケー ジ
総 ダ ウ ン ロ ー ド 容 量 : 2.4 M
イ ン ス ト ー ル 容 量 : 12 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
postfix -2.10.1 -7. el7. x86_64 .rpm | 2.4 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : 2: postfix -2.10.1 -7. el7. x86_64 1/1
検証中 : 2: postfix -2.10.1 -7. el7. x86_64 1/1
イ ン ス トー ル:
postfix . x86_64 2:2.10.1 -7. el7
完 了 し ま し た!
/etc/postix/main.cf の確認
LPI-Japan 77 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール
# postXXX commands .
#
command_directory = /usr/sbin
( 略 )
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system . The default is to use the fully - qualified domain name
# from gethostname (). $myhostname is used as a default value for many
# other configuration parameters .
#
# myhostname = host. domain .tld
# myhostname = virtual . domain .tld
/etc/postix/main.cf の編集
次のパラメータを探して設定します。
表 11: 設定が必要な項目
パラメータ 内容 設定例
自ホスト名とドメインの設定
自ホスト名とドメインの設定(/etc/postix/main.cf)
LPI-Japan 78 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール
メールを受け付ける IP アドレスの設定
メールを受け付ける IP アドレスの設定(/etc/postix/main.cf)
受信するメールドメインの設定
mydestination には、このメールサーバが受信するドメインを設定します。
受信するメールドメインの設定(/etc/postix/main.cf)
# The local machine is always the final destination for mail addressed
# to user@[the.net.work. address ] of an interface that the mail system
# receives mail on (see the inet_interfaces parameter ).
#
# Specify a list of host or domain names , /file/name or type:table
# patterns , separated by commas and/or whitespace . A /file/name
# pattern is replaced by its contents ; a type:table is matched when
# a name matches a lookup key (the right -hand side is ignored ).
# Continue long lines by starting the next line with whitespace .
#
# See also below , section " REJECTING MAIL FOR UNKNOWN LOCAL USERS ".
#
# mydestination = $myhostname , localhost .$mydomain , localhost
# mydestination = $myhostname , localhost .$mydomain , localhost , $mydomain
mydestination = alpha.jp ← 設定を追加
クライアントの設定
LPI-Japan 79 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール
クライアントの設定(/etc/postix/main.cf)
SMTP 認証の設定
SMTP 認証の設定(/etc/postix/main.cf)
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks , permit_sasl_authenticated ,
reject_unauth_destination
5.4.3 書式のチェック
/etc/postix/main.cf の修正ができたら、書式チェックを行っておきます。
main.cf の書式チェック
# postfix check
書式が正しい場合には、何も表示されません。エラーが表示された場合には、エラー内容をよく見て修正します。
5.4.4 ファイアウォールの設定
Postix の再起動の前に、メールサーバーでメールの受信ができるようにファイアウォールのサービス許可設定を行います。
SMTP アクセスの許可
さらに、設定を保存しておきます。
Firewall ルールの保存
LPI-Japan 80 https://linuc.org
5 メールサーバーの構築 5.5 アカウントの作成
postix サービスを再起動します。
postix サービスの再起動
postix サービスの自動起動を確認します。
自動起動設定の確認
saslauthd の起動
sasluauthd の自動起動設定も行っておきます。
saslauthd の自動起動設定
5.5 アカウントの作成
それでは、実際にメールを送信する前に、宛先となるアカウントを作成します。
usera の作成
userb の作成
LPI-Japan 81 https://linuc.org
5 メールサーバーの構築 5.6 メールの送受信
ユ ー ザ ー userb の パ ス ワ ー ド を 変 更 。
新 し い パ ス ワ ー ド : userbpass ← 入 力 文 字 は 非 表 示
新 し い パ ス ワ ー ド を 再 入 力 し て く だ さ い : userbpass ← 入力文字は非表示
passwd : す べ て の 認 証 ト ー ク ン が 正 し く 更 新 で き ま し た 。
5.6 メールの送受信
次にメールを送信します。メールの送受信は作成した一般ユーザーで行います。一般ユーザーで操作できるよう別の端末を起動
し、su コマンドを使ってユーザーを切り替えます。メールの送信は mail コマンドを使用します。
5.6.1 ログの確認用端末の設定
1.「端末」を起動します
2. tail コマンドを実行して、/var/log/maillog を表示します。-f オプションを付けて実行すると、ログが書き込まれる毎に
再読み込みされて最新のログを閲覧できます。
メールログの確認
5.6.2 メール送受信用端末の起動とユーザー切り替え
メール送受信用の端末を起動し、su コマンドでユーザーの切り替えを行います。
1.「端末」を起動します
2. su コマンドでユーザーを切り替えます
usera に切り替え
userb に切り替え
# su - userb
[ userb@host2 ~]$ id
uid =1001( userb) gid =1001( userb) groups =1001( userb ) ,12( mail)
context = unconfined_u : unconfined_r : unconfined_t :s0 -s0:c0.c1023
メール送信
LPI-Japan 82 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
EOT
メールの確認
& q ← qを 入 力
Held 1 message in /var/spool/mail/userb
5.7 メールクライアントソフトでのメールの送受信
通常のメールサーバーの運用では、メールの利用者はメールクライアントを使用してメールの送受信を行います。送信は SMTP、
受信は IMAP や POP3 をプロトコルとして使用します。IMAP サーバーを利用してメールを受信できるよう、IMAP サーバー
である Devecot と、メールクライアントとして Thunderbird をインストールしてメールを送受信してみます。
それでは早速、必要なパッケージを追加して、クライアントでメールを送受信できるように設定してみましょう。まずは IMAP
サーバーである Dovecot をインストールします。インターネットに接続できない環境では、GUI から admin でログインし、イ
ンストールメディアが自動マウントされた状態でインストール作業を進めます。
dovecot パッケージのインストール
LPI-Japan 83 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
図 23 メールクライアントソフトでのメールの流れ
依存性を解決しました
================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
dovecot x86_64 1:2.2.36 -3. el7 base 4.4 M
依 存 性 関 連 で の イ ン ス トー ル を し ま す:
clucene -core x86_64 2.3.3.4 -11. el7 base 528 k
ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス ト ー ル 1 パ ッ ケ ー ジ (+1 個 の 依 存 関 係 の パ ッ ケ ー ジ )
総 ダ ウ ン ロ ー ド 容 量 : 4.9 M
イ ン ス ト ー ル 容 量 : 16 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
(1/2): clucene -core -2.3.3.4 -11. el7. x86_64 .rpm | 528 kB 00:15
LPI-Japan 84 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
イ ン ス トー ル:
dovecot . x86_64 1:2.2.36 -3. el7
依 存 性 関 連 を イ ン ス トー ル し ま し た:
clucene -core. x86_64 0:2.3.3.4 -11. el7
完 了 し ま し た!
/etc/dovecot/dovecot.conf
全体的な設定ファイルです。デフォルトの設定がコメントアウトで記述されています。特に変更は必要ありません。
dovecot.conf を開く
/etc/dovecot/dovecot.conf の確認
( 略 )
# Protocols we want to be serving .
# protocols = imap pop3 lmtp ← IMAP/POP3/LMTP が 使 用 可 能
/etc/dovecot/conf.d/10-mail.conf
10-mail.conf を編集
LPI-Japan 85 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
/etc/dovecot/10-mail.conf(メールボックスの設定)
( 略 )
# mail_location = maildir :~/ Maildir
# mail_location = mbox :~/ mail:INBOX =/ var/mail /%u
# mail_location = mbox :/ var/mail /%d/%1n/%n:INDEX =/ var/ indexes /%d/%1n/%n
#
# <doc/wiki/ MailLocation .txt >
#
mail_location = mbox :~/ mail:INBOX =/ var/mail /%u ← 修正
次に、同じファイルの中のメールを管理するためのグループの設定を追加します。
/etc/dovecot/10-mail.conf(グループ設定)
/etc/dovecot/conf.d/10-auth.conf
認証を設定するファイルです。今回は暗号化していない平文での認証を許可し、Linux のログイン情報を認証に利用できるよう
に設定します。
10-auth.conf を編集
/etc/dovecot/10-auth.conf
##
## Authentication processes
##
/etc/dovecot/conf.d/10-ssl.conf
10-ssl.conf の編集
LPI-Japan 86 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
/etc/dovecot/10-ssl.conf
##
## SSL settings
##
5.7.3 ファイアウォールの設定
さらに、設定を保存しておきます。
Firewall ルールの保存
dovecot サービスを再起動します。
dovecot サービスの起動
自動起動設定も行っておきます。
dovecot の自動起動設定
LPI-Japan 87 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
依存性を解決しました
================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー
容量
================================================================================
イ ン ス トー ル 中:
thunderbird x86_64 52.9.1 -1. el7. centos base 76 M
ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 1 パッ ケー ジ
総 ダ ウ ン ロ ー ド 容 量 : 76 M
イ ン ス ト ー ル 容 量 : 144 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
thunderbird -52.9.1 -1. el7. centos . x86_64 .rpm | 76 MB 00:22
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : thunderbird -52.9.1 -1. el7. centos . x86_64 1/1
検証中 : thunderbird -52.9.1 -1. el7. centos . x86_64 1/1
イ ン ス トー ル:
thunderbird . x86_64 0:52.9.1 -1. el7. centos
完 了 し ま し た!
LPI-Japan 88 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
3.「アプリケーション」メニューから「インターネット」→「Thunderbird」を選択します。
LPI-Japan 89 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
5.「メ ー ル ア カ ウ ン ト を 設 定 す る」 を ク リ ッ ク す る と、「メ ー ル ア カ ウ ン ト 設 定」 ダ イ ア ロ グ が 表 示 さ れ ま す。
6. 以下のように設定して「続ける」をクリックします。
表 12: アカウント設定の設定値
設定項目 値
あなたの名前 UserA
メールアドレス usera@alpha.jp
パスワード userapass
パスワードを記憶する チェックしておく
LPI-Japan 90 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
7.「アカウント設定が、一般的なサーバー名で検索したことにより見つかりました。」と表示されます。
図 24 メールアカウント画面
もし、アカウントの検索時「Thunderbird はあなたのアカウント設定を見つけられませんでした。
」のように表示された場
合には、次のような設定になるように手動設定をし、
「再テスト」ボタンをクリックします。
表 13: メールアカウント設定の設定値
カテゴリ 項目 設定値
ユーザ名 usera
受信サーバー サーバーのホスト名 mail.alpha.jp
プロトコル IMAP
受信ポート番号 143
SSL 接続の保護なし
認証方式 通常のパスワード
送信サーバー サーバーのホスト名 mail.alpha.jp
送信ポート番号 25
SSL 接続の保護なし
認証方式 通常のパスワード
8.「完了」をクリックします。すると、接続が暗号化されないため、警告が表示されます。
「接続する上での危険性を理解しました」をチェックし、
「完了」ボタンをクリックします。
5.7.7 メールの送信
メールを送信するには、
「作成」ボタンをクリックしてメール作成ウインドウを呼び出します。
1. 宛先に自分のメールアドレス(usera@alpha.jp)を指定して、メールを作成、送信してみます。
2.「受信」ボタンをクリックして、メールが受信できることを確認します。
3. 宛先に他の受講生のメールアドレス(userb@beta.jp)を指定して、メールを作成、送信してみます。
4. 相手がメールを受信できたこと、相手からのメールを受信できることを確認します。
LPI-Japan 91 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信
図 25 警告画面
5.7.8 起動時のスタートページの設定
インターネットに接続できない環境で実習をしている場合には、起動時に「サーバーが見つかりませんでした」のエラーが表示
されることがあります。エラーが表示されないようにするには、以下の手順で設定を修正します。
1. 三本線のボタンからメニューを表示し、「設定」→「設定」を選択します。
図 26 メニューから設定を選ぶ
1.「Thunderbird スタートページ」の「起動時にメッセージペインにスタートページを表示する」のチェックを外して、「閉
じる」をクリックします。
LPI-Japan 92 https://linuc.org
5 メールサーバーの構築 5.8 まとめ
図 27 メニューから設定を選ぶ
5.8 まとめ
LPI-Japan 93 https://linuc.org
6 ネットワークとセキュリティの管理
6 ネットワークとセキュリティの管理
CentOS では、基本的なネットワークやセキュリティの設定はインストール時に行われます。ここでは、これらの設定を管理す
るための方法について説明します。
6.1 用語集
ネットワークインターフェース
LAN ケーブルを接続して、外部のマシンとの間でデータをやり取りするための物理的なインターフェースです。
ループバックインターフェース
マシン内部でデータをやり取りするための仮想的なインターフェースです。
IP(Internet Protocol)
IP は、ネットワークに接続したコンピューター間でデータをやり取りするためのプロトコルです。
IP アドレス
ネットワークアドレス
ホストが属しているネットワーク自体を指し示す IP アドレスです。
ブロードキャスト
ホストが属しているネットワーク全体を指し示す IP アドレスです。
ネットマスク
IP アドレスのうち、どこまでがネットワーク部で、どこまでがホスト部かを示すための値です。IP アドレスとネットマスクの 2
つの値から、ネットワークアドレス、ブロードキャストアドレスを割り出すことができます。
デフォルトゲートウェイ
インターネットは、小さなネットワークが相互に接続したネットワークです。小さなネットワーク間を接続する機器としてルー
ター (ゲートウェイ) が使われます。ゲートウェイは 1 つのネットワークに複数設置することができますが、特に指定が無い場合
にはデフォルトゲートウェイを使って外部のネットワークとの通信を行います。
IP アドレスなどのネットワーク設定を自動的に割り当てるプロトコルです。
LPI-Japan 94 https://linuc.org
6 ネットワークとセキュリティの管理 6.1 用語集
ポート番号
データの転送エラーやデータ転送量などの情報を通知するためのプロトコルです。
ping コマンド
LPI-Japan 95 https://linuc.org
6 ネットワークとセキュリティの管理 6.2 ネットワーク管理
6.2 ネットワーク管理
ネットワークが上手く使えない場合には、確認のためにネットワークインターフェースが正しく設定されているかを調べる必要
があります。また、設定が間違っている場合には、インターフェースの設定を変更する必要があります。ここでは、ネットワー
クインターフェースの確認と設定の方法について解説します。
6.2.1 ネットワークインターフェースの確認
ネットワークインターフェースの確認
# ip addr show
1: lo: <LOOPBACK ,UP ,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN group default qlen
1000
link/ loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3 : <BROADCAST ,MULTICAST ,UP ,LOWER_UP > mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
link/ether 08:00:27: cb:f6 :31 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.101/24 brd 192.168.1.255 scope global noprefixroute enp0s8
valid_lft forever preferred_lft forever
inet6 2001: db8 ::10/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80 ::40 f4 :1400:1 f0d :132b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0 : <NO -CARRIER ,BROADCAST ,MULTICAST ,UP > mtu 1500 qdisc noqueue state DOWN group
default qlen 1000
link/ether 52:54:00:96:78:2 c brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0 -nic: <BROADCAST ,MULTICAST > mtu 1500 qdisc pfifo_fast master virbr0 state DOWN
group default qlen 1000
link/ether 52:54:00:96:78:2 c brd ff:ff:ff:ff:ff:ff
6.2.2 ネットワークインターフェースの再設定
インストール時に IP アドレスの設定を間違えた時などは、ネットワークインターフェースを再設定します。設定は、GNOME
の管理画面から行うことができます。
GNOME のデスクトップのアプリケーションメニューから「システムツール」→「設定」を選択します。表示された設定画面の
左側のメニューから「ネットワーク」を選択します。
「有線」の欄にある歯車のボタンをクリックすると、接続プロファイルの設定画面が表示されます。「IPv4」のタブをクリックす
ると、次のような画面になります。
LPI-Japan 96 https://linuc.org
6 ネットワークとセキュリティの管理 6.2 ネットワーク管理
図 28 設定画面
図 29 ネットワーク詳細設定画面
LPI-Japan 97 https://linuc.org
6 ネットワークとセキュリティの管理 6.2 ネットワーク管理
この画面で、設定を変更することで、ネットワークインターフェースの設定を変更することができます。変更したら、
「適用」ボ
タンを押して元の画面に戻ります。
「有線」の項目にあるスイッチを、一旦「オフ」に変えます。再度、
「オン」に変えるとネット
ワークインターフェース設定が変更されます。
6.2.3 ネットワークインターフェースの動作確認
ping コマンドによる確認
# ping 192.168.1.101 ← 自 分 の IP ア ド レ ス
PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq =1 ttl =64 time =0.209 ms
64 bytes from 192.168.1.101: icmp_seq =2 ttl =64 time =0.151 ms
64 bytes from 192.168.1.101: icmp_seq =3 ttl =64 time =0.174 ms
64 bytes from 192.168.1.101: icmp_seq =4 ttl =64 time =0.144 ms
64 bytes from 192.168.1.101: icmp_seq =5 ttl =64 time =0.144 ms
^C
--- 192.168.1.101 ping statistics ---
5 packets transmitted , 5 received , 0% packet loss , time 3998 ms
rtt min/avg/max/mdev = 0.144/0.164/0.209/0.027 ms
6.2.4 サービスのポート番号を確認
ss コマンドによる確認
# ss -at
State Recv -Q Send -Q Local Address :Port Peer Address :Port
LISTEN 0 50 *: microsoft -ds *:*
LISTEN 0 50 *: netbios -ssn *:*
LISTEN 0 100 *: pop3 *:*
LISTEN 0 100 *: imap *:*
LISTEN 0 128 *: sunrpc *:*
LISTEN 0 5 192.168.122.1: domain *:*
LISTEN 0 10 192.168.1.101: domain *:*
LISTEN 0 10 127.0.0.1: domain *:*
LISTEN 0 128 *: ssh *:*
( 略 )
lsof -i コマンドを実行すると現在開かれているすべてのポートを表示します。
lsof コマンドによる確認
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 655 rpc 6u IPv4 15791 0t0 UDP *: sunrpc
rpcbind 655 rpc 7u IPv4 15855 0t0 UDP *:821
rpcbind 655 rpc 8u IPv4 15856 0t0 TCP *: sunrpc ( LISTEN )
rpcbind 655 rpc 9u IPv6 15857 0t0 UDP *: sunrpc
rpcbind 655 rpc 10u IPv6 15858 0t0 UDP *:821
rpcbind 655 rpc 11u IPv6 15859 0t0 TCP *: sunrpc ( LISTEN )
LPI-Japan 98 https://linuc.org
6 ネットワークとセキュリティの管理 6.3 SSH によるリモートログイン
avahi -dae 672 avahi 12u IPv4 17393 0t0 UDP *: mdns
avahi -dae 672 avahi 13u IPv4 17394 0t0 UDP *:37814
chronyd 707 chrony 1u IPv4 17271 0t0 UDP localhost :323
chronyd 707 chrony 2u IPv6 17272 0t0 UDP localhost :323
dhclient 943 root 6u IPv4 20446 0t0 UDP *: bootpc
sshd 1155 root 3u IPv4 22236 0t0 TCP *: ssh ( LISTEN )
sshd 1155 root 4u IPv6 22370 0t0 TCP *: ssh ( LISTEN )
( 略 )
lsof コマンドによる確認
6.3.2 パスワードによる認証
ssh コマンドは特別な設定を行わなくても、パスワード認証でリモートログインすることができます。
ssh による接続
LPI-Japan 99 https://linuc.org
6 ネットワークとセキュリティの管理 6.3 SSH によるリモートログイン
Are you sure you want to continue connecting (yes/no)? yes ← yes を 入 力
Warning : Permanently added 'localhost ' (ECDSA) to the list of known hosts.
usera@localhost 's password : userapass ← 実際には非表示
Last failed login: Tue Feb 19 15:23:31 JST 2019 from 192.168.7.1 on ssh:notty
There were 5 failed login attempts since the last successful login.
Last login: Tue Feb 19 14:36:42 2019
[ usera@host1 ~]$ exit ← リ モー ト ロ グ イ ン を 修 了
ログアウト
Connection to localhost closed .
[ root@host1 admin ]# ← 元 の ユ ー ザ ー root に 復 帰
6.3.3 公開鍵による認証
公開鍵認証は、あらかじめサーバーに設置した公開鍵と対になっている秘密鍵を持っているユーザーしかリモートログインでき
ない認証方法です。
以下の手順で公開鍵認証を設定します。
1. 公開鍵と秘密鍵を生成する
ssh-keygen コマンドを使用して一対の公開鍵 (id_dsa.pub) と秘密鍵 (id_dsa) を生成します。鍵のファイルはホームディ
レクトリに作られた.ssh ディレクトリに保存されます。
秘密鍵には不正利用を防止するためのパスフレーズを設定します。接続時にパスフレーズを正しく入力できないと、秘密
鍵は利用できないので、公開鍵認証による接続はできません。このパスフレーズは SSH クライアント側で秘密鍵に対して
処理されるので、ネットワーク上には情報は流れません。
公開鍵と秘密鍵の作成
2. 接続先に~/.ssh/authorized_keys を作成する
ユーザーに SSH での接続を許可するには、ユーザーアカウントを作成し、そのユーザーのホームディレクトリに
~/.ssh/authorized_keys ファイルを作成しておきます。~/.ssh/のパーミッションは 700(drwx——)、authorized_keys
ファイルのパーミッションは 600(-rwx——) に設定する必要があります。
認証用ファイルの作成
3. 公開鍵認証で接続する
公開鍵認証で接続します。ssh コマンドの使用法自体はパスワード認証と同じですが、パスワードの代わりに秘密鍵に設
定したパスフレーズの入力が必要です。
公開鍵での接続
6.3.4 パスワード認証の禁止
パスワード認証が有効になっていると、パスワードの総当たり攻撃により不正にリモートログインできてしまいます。公開鍵認
証で接続できるようになった後には、OpenSSH サーバーの設定を変更してパスワード認証を禁止しておきます。
1. パスワード認証で接続できることを確認します。
パスワード認証での確認
# ssh localhost
root@localhost 's password :
Last login: Tue Feb 19 17:13:43 2019
[ root@host1 ~]# exit
ログアウト
Connection to localhost closed .
2. 設定ファイル/etc/ssh/sshd_conig を修正します。
パスワード認証の禁止
( 略 )
# To disable tunneled clear text passwords , change to no here!
# PasswordAuthentication yes
# PermitEmptyPasswords no
PasswordAuthentication no ← 変更
( 略 )
3. 設定を変更後、sshd 設定の再読み込み
sshd のリロード
接続の確認
# ssh localhost
Permission denied (publickey ,gssapi -keyex ,gssapi -with -mic ).
6.4 ファイアウォールの設定
ファイアウォールはネットワークにおいて様々なアクセス制限を行い、ネットワークからの攻撃や不正なアクセス等を防ぐ機能
です。CentOS7 のファイアウォール機能は、irewalld によって管理されています。irewalld では、ネットワークインターフェー
スへのパケットの受信の許可、拒否のルールを管理しています。irewalld の設定は irewall-cmd というコマンドで、設定を行い
ます。
6.4.1 ファイアウォール設定の確認
許可されているサービスを調べるには、–list-services オプションを使います。
許可サービスの確認
6.4.2 許可サービスの追加
許可サービスを追加するには、次のように–add-service オプションを使います。
許可サービスの追加
利用可能なサービスの調査
pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy -dhcp ptp pulseaudio
puppetmaster quassel radius redis rpc -bind rsh rsyncd samba samba - client sane sip
sips smtp smtp - submission smtps snmp snmptrap spideroak - lansync squid ssh
syncthing syncthing -gui synergy syslog syslog -tls telnet tftp tftp - client tinc
tor -socks transmission - client upnp - client vdsm vnc - server wbem -https xmpp -bosh
xmpp - client xmpp -local xmpp - server zabbix -agent zabbix - server
6.4.3 許可サービスの取り消し
許可されているサービスを停止するには、–remove-service オプションを使います。
許可サービスの追加
6.4.4 ファイアウォール設定の保存
–add-service、–remove-service などで行ったファイアウォールルールの変更は、一時的なものです。そのため、再起動をすると
失われてしまいます。再起動後も設定をに有効にするには、次のように–runtime-to-permanent オプションを使って、設定を保
存します。
許可サービスの追加
Linux サーバー構築標準教科書
2012 年 6 月 1 日 V2.0.0 発行
2012 年 6 月 20 日 V2.0.1 発行
2019 年 10 月 1 日 V3.0.0 発行
© LPI-Japan
図 1.4 ターミナル画面が表示されます
パスワード認証が成功すると、ターミナル画面が表示されてログインシェルが起動します。
1. 鍵生成ダイアログを呼び出します。
図 1.5 「生成」ボタンをクリックします
2. 公開鍵と秘密鍵を保存します。
図 1.6 パスフレーズを入力して、公開鍵と秘密鍵をそれぞれ保存します
パスフレーズを入力し、
「公開鍵の保存」ボタン、
「秘密鍵の保存」ボタンをクリックして、それぞれ
の鍵ファイルを保存します。
3. 鍵生成ダイアログを閉じます。
保存後、「キャンセル」ボタンをクリックしてダイアログを閉じます。
図 1.7 「From:」に作成した公開鍵を指定します
2. 公開鍵ファイルを選択します。
「TTSSH: Secure File Copy」ダイアログが表示されます。上側の「From:」の右横にある「...」
ボタンをクリックしてファイルダイアログを開き、保存した公開鍵ファイル(id_rsa.pub)
ファイルを選択します。
3. 公開鍵ファイルをコピーします。
「Send」ボタンをクリックすると、ファイルがサーバ側のユーザのホームディレクトリにコ
ピーされます。
4. 公開鍵ファイルを確認します。
[sshuser@server ~]$ ls
id_rsa.pub sftptestfile testdir
1. 公開鍵ファイルを設置します。
2. コピーした公開鍵は、Linux での公開鍵の設置と同じ手順で authorized_keys に追加してお
きます。以下は、初めてサーバに公開鍵を登録する場合のコマンド例です。
これで、TeraTerm を使って公開鍵認証でログインができました。
公開鍵認証による接続ができるようになったら、OpenSSH サーバの設定を変更してパスワード認証
による接続を禁止しておきます。
PasswordAuthentication no ← no に変更
PermitRootLogin no ← no に変更
• root で直接ログインする
• 一般ユーザでログインした後、su コマンドを実行して管理者ユーザ root に切り替える
• 一般ユーザでログインした後、sudo コマンドを使って root 権限でコマンドを実行する
どの方法も一長一短がありますが、root で直接ログインするのは許さず、一般ユーザでログインし
た後、su コマンドか sudo コマンドを使用させることが多いようです。
また、root 権限を使った作業を中断して席を離れる際には、ログアウトするか画面をロックするな
どして、他人に勝手に操作されないようにするなど十分注意を払う必要があります。もちろん、一
般ユーザでのログイン時も同様に気を付けましょう。
サーバの設置場所も重要です。サーバに物理的にアクセスされてしまうと、システムの様々なセ
キュリティ対策も用を為さなくなってしまいます。サーバはロックのかかったマシンルームやサー
バラック内に設置し、許可された作業者のみアクセスできるようにすることが望ましいでしょう。
目次
まえがき 5
執筆者・制作担当者紹介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
松田 神一(第 1 版企画・進行担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
宮原徹(第 1 版企画・執筆担当、第 2 版監修/株式会社びぎねっと). . . . . . . . . . . . . . . . . . . . . . . . . 5
喜田紘介(第 2 版執筆担当/株式会社アシスト/ NPO 法人 日本 PostgreSQL ユーザ会理事) . . . . . . . . . . . 5
高橋征義(第 1 版 PDF 版・EPUB 版制作担当/株式会社達人出版会) . . . . . . . . . . . . . . . . . . . . . . . 6
中谷徹(第 2 版 PDF 版・EPUB 版・Kindle 版制作担当/ NPO 法人 LPI-Japan). . . . . . . . . . . . . . . . . 6
木村 真之介 (意見交換用 Wiki サイト作成) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
教科書開発に協力いただいた皆さん (第 1 版) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
著作権 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
使用に関する権利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
非営利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
改変禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
本教材の使用に関するお問合せ先 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
この教科書の目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
想定している実習環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
データベース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
マシンの構成と HDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
ネットワーク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
仮想環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
クラウド環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
その他の情報源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1 SQL によるデータベースの操作基礎編 10
1.1 データベース利用の基本パターン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 psql ツールの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.1 psql でデータベースに接続する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.2 psql のヘルプを表示する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2.3 メタコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.4 psql を終了する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.5 表の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.6 表定義の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.7 表とテーブル、リレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 pgAdmin4(GUI ツール) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4 SQL の実行方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.1 複数行入力のプロンプト表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.2 テキストファイルからの読み込み実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5 データの検索(SELECT). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5.1 全件全項目検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5.2 SELECT 項目リスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.5.3 WHERE 句による絞り込み検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.6 ORDER BY 句による並べ替え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.7 表の結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.7.1 JOIN 句による結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.7.2 表別名の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.8 行データの入力(INSERT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.9 データの更新(UPDATE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
LPI-Japan 1 https://oss-db.jp
目次 目次
1.10 行データの削除(DELETE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2 データ型 28
2.1 数値データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.1 integer 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.2 numeric 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.3 その他の数値型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2 文字列データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.1 character varying 型 (varchar 型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.2 character 型 (char 型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.2.3 text 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.3 日付・時刻データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3 表 33
3.1 表の作成(CREATE TABLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.1 表を作成する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.2 staf 表にデータを格納する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2 表定義の修正(ALTER TABLE). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.1 ALTER TABLE による変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.2 表定義の修正は原則として行わない . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 表の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.1 DROP TABLE 文による表の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.2 DROP TABLE、DELETE、TRUNCATE の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4 行データのセーブ・ロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.1 行データのセーブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.2 CSV ファイルのロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.3 \copy メタコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4 基礎編 演習 40
4.1 演習 1:データ操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.1.1 データ操作演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.1.2 解答例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2 演習 2:郵便番号データベース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.2.1 郵便番号データのダウンロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.2.2 郵便番号データベース表の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.2.3 データのロードと文字コードについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2.4 郵便番号データの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5 SQL によるデータベースの操作応用編 45
5.1 演算子と関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.1.1 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.1.2 関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.1.3 GROUP BY 句と集約関数の組み合わせ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.1.4 HAVING 句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.1.5 WHERE 句、GROUP BY 句、HAVING 句の適用順序 . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.2 副問い合わせ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.1 EXISTS 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.2 IN 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.3 日付・時刻型データの取り扱い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.3.1 日付形式を確認・設定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.3.2 現在時刻を取得する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.3.3 文字列の入力値を日付型の列に格納する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4 複雑な結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.4.1 外部結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
LPI-Japan 2 https://oss-db.jp
目次 目次
5.4.2 クロス結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.4.3 自己結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.5 LIMIT 句による検索行数制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.5.1 LIMIT と並び順の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.5.2 OFFSET 句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6 データベース定義の応用 59
6.1 主キー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.1.1 主キーを指定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.1.2 主キーの動作を確認する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.1.3 複数列からなる主キー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2 外部キー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.1 参照整合性制約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.2 外部キーを指定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.3 CREATE TABLE 文で主キー、外部キーを設定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.2.4 主キー、外部キーは必要か? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.3 正規化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4 NULL について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4.1 NOT NULL 制約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4.2 NULL の判定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4.3 NULL の集約関数での取り扱い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.4.4 空文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.5 シーケンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.5.1 シーケンスの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.5.2 シーケンスの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.5.3 シーケンスを SQL 文で使用する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.5.4 シーケンスと飛び番 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
7 マルチユーザーでの利用 70
7.1 ユーザーの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
7.1.1 ユーザーとロール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
7.1.2 スーパーユーザー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.2 接続と認証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.2.1 接続認証の設定を確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.2.2 接続ユーザーの指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.2.3 パスワード認証の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.2.4 パスワードの設定、変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.2.5 設定値の再読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.2.6 パスワード認証による接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.3 ネットワーク経由接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.3.1 ネットワーク経由接続の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.3.2 PostgreSQL の再起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.3.3 psql を使ったネットワーク経由接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.4 アクセス権限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.4.1 アクセス権限の付与 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.4.2 アクセス権限の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.4.3 アクセス権限の取り消し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.5 トランザクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.5.1 読み取り一貫性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.5.2 ロック機構と更新の競合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.5.3 デッドロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
8 パフォーマンスチューニング 85
LPI-Japan 3 https://oss-db.jp
目次 目次
8.1 インデックス(索引) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.1.1 主キーのインデックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.1.2 インデックスの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.1.3 インデックスを削除する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.1.4 インデックスは万能ではない . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2 SQL 実行プランの分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2.1 インデックスが存在しない場合の SQL 実行プラン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2.2 インデックスが存在する場合の SQL 実行プラン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.3 インデックスが存在しても必ず使われるわけではない . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.3 バキューム処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.1 PostgreSQL のデータ管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.2 VACUUM と VACUUM FULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.3 VACUUM ANALYZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.4 自動バキュームデーモン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.4 クラスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
9 バックアップとリストア 90
9.1 バックアップ手法の整理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.1.1 主なバックアップ手法一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.2 ファイルのコピー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.3 pg_dump コマンドによるバックアップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
9.4 pg_restore によるリストア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
10 Web アプリケーションとの連携 93
10.1 PHP とは? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.2 PHP の動作イメージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.3 Apache と PHP 環境の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.3.1 Apache と PHP をパッケージでインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.3.2 Apache+PHP の設定とテスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
10.4 PHP と PostgreSQL の連携 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
10.4.1 データ検索ページの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
10.4.2 フォームからのデータの取得方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.4.3 フォームからの入力を SQL 文に組み込む . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
11 実習環境の構築方法 103
11.1 OS のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1.1 OS ユーザーの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1.2 セキュリティの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.2 PostgreSQL のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.2.1 手順 1 yum リポジトリの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.2.2 手順 2 PostgreSQL のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
11.2.3 手順 3 PostgreSQL 利用環境の初期設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
11.2.4 参考 yum を使わないインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
11.3 データベースの初期化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.3.1 データベースクラスタと initdb コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.3.2 データディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.3.3 initdb コマンドの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.4 データベースを起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
11.5 動作の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
12 付録 実習の準備方法 113
12.1 データベースの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.2 表の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.3 データの入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
LPI-Japan 4 https://oss-db.jp
目次 目次
まえがき
このたび、特定非営利活動法人エルピーアイジャパンは、オープンソースデータベース技術者教育に利用していただくことを
目的とした教材、
「オープンソースデータベース標準教科書」を開発し、インターネット上にて公開し、提供することとなりま
した。
この「オープンソースデータベース標準教科書」は、データベース技術習得のニーズの高まりに応えるべく、まったく初めて
データベースについて学習する人のために開発されました。既にリリースされ好評を得ている「Linux 標準教科書」「Linux
サーバー構築標準教科書」の姉妹版となります。
公開にあたっては、
「オープンソースデータベース標準教科書」に添付されたライセンス(クリエイティブ・コモンズ・ライセ
ンス表示 - 非営利 - 改変禁止)の下に公開されています。
本教材は、最新の技術動向に対応するため、随時アップデートを行っていきます。また、テキスト作成やアップデートについ
ては、意見交換のメーリングリストで、誰でもオープンに参加できます。
• https://oss-db.jp/ossdbtext/text.shtml
メーリングリストの URL
• http://list.ospn.jp/mailman/listinfo/linux-text
• http://oss-db.jp/oss-db-wiki/
執筆者・制作担当者紹介
松田神一(第 1 版企画・進行担当)
本教科書は、データベースを初めて触る方でも迷わないためのガイドとなるよう、できるだけ簡潔に分かりやすく、実際に動
かしてみて理解できることを目標に執筆しました。一方で、データベースは OS と同じく奥が深いソフトウェアのため、本教
科書で解説できたのはほんのさわりに過ぎません。特に運用管理やパフォーマンス、データベース設計については、より詳細
な解説書にあたってみてください。この教科書を手に取った方のデータベーススキル修得の一助になれば幸いです。
LPI-Japan 5 https://oss-db.jp
目次 目次
ことができますし、私の場合は各実行例ごとに、もう少し違うコマンドでも状態を確認してみるなど、本書をきっかけに幅を
広げようと思って 2 周目、3 周目に取り組みました。それ以降は PostgreSQL のマニュアルを隅々まで読み込むような、詳細
を知らなければならない仕事をしてきたわけですが、自身がセミナー講師を担当する側になって、たまに本書を読み返してい
ます。これから学習される方向けの外せない部分や難しいポイントを確認しては「なるほど、この説明か。
」と、その度になに
か発見があり、より良い仕事の助けとさせていただきました。
教科書開発に協力いただいた皆さん (第 1 版)
本教科書は、オープンソースソフトウェア開発の手法を取り入れ、何回かのフェーストゥフェースのミーティングと、メーリ
ングリストを使ったコミュニケーションで構成の企画および原稿のレビューなどを行いました。
• 案浦浩二
• 石井達夫(SRA OSS, Inc. 日本支社)
• 伊津野匡
• 上田和章(ネットプラン松山)
• 岡田賢治(株式会社ネットマイスター)
• 加藤剛(株式会社アークシステム)
• 綱川貴之(富士通株式会社)
• 遠山洋平(株式会社びぎねっと)
• 永安悟史(アップタイム・テクノロジーズ合同会社)
• 濱田大助(日本文理大学)
• 早坂一王(株式会社クレスコ)
LPI-Japan 6 https://oss-db.jp
目次 目次
• 古橋勇作(日本 HP)
• 本間裕一(株式会社エヌサイト)
• 三谷篤(SRA 西日本)
• 吉田貴紀(SRA OSS, Inc. 日本支社)
• 吉田敏和(NTT コムウェア株式会社)
著作権
本教材の著作権は特定非営利活動法人エルピーアイジャパンに帰属します。
使用に関する権利
表示
本教材は、特定非営利活動法人エルピーアイジャパンに著作権が帰属するものであることを表示してください。
非営利
本教科書は、非営利目的で教材として自由に利用することができます。商業上の利得や金銭的報酬を主な目的とした営利目的
での利用は、特定非営利活動法人エルピーアイジャパンによる許諾が必要です。ただし、本教科書を利用した教育において、
本教科書自体の対価を請求しない場合は、営利目的の教育であっても基本的に利用できます。その場合も含め、LPI-Japan 事
務局までお気軽にお問い合わせください。
(※)営利目的の利用とは以下のとおり規定しております。
営利企業または非営利団体において、商業上の利得や金銭的報酬を目的に当教材の印刷実費以上の対価を受講者に請求して当
教材の複製を用いた研修や講義を行うこと。
改変禁止
本教科書は、改変せず使用してください。ただし、引用等、著作権法上で認められている利用を妨げるものではありません。
本教科書に対する改変は、特定非営利活動法人エルピーアイジャパンまたは特定非営利活動法人エルピーアイジャパンが認め
る団体により行われています。
• http://list.ospn.jp/mailman/listinfo/linux-text
本教材の使用に関するお問合せ先
特定非営利活動法人エルピーアイジャパン(LPI-Japan)事務局
〒106-0041 東京都港区麻布台 1-11-9 BPR プレイス神谷町 7F
TEL:03-3568-4482
E-Mail:info@lpi.or.jp
LPI-Japan 7 https://oss-db.jp
目次 目次
この教科書の目的
本書の目的は、データベースの経験の無い技術者を対象に、基本的なデータベースの操作方法について実習を通して学習す
ることにあります。SQL 文を使ってデータベースを操作したり、データベースの作成や管理についての基礎を学習します。
OSS-DB エンジニアのスキルを認定する OSS-DB 技術者認定試験のための教育および学習にも役立てていただけます。
想定している実習環境
本書での実習環境として、以下の環境を構築しています。
データベース
OS
マシンの構成と HDD
ネットワーク
利用する PC は、ネットワークで接続されており、インターネットにも接続できることを前提としています。接続されていな
い場合には、別の方法で PostgreSQL のパッケージをダウンロードおよびコピーしてインストールを行ってください。
仮想環境
クラウド環境
その他の情報源
• オープンソースデータベース技術者認定試験
– https://oss-db.jp/
• 日本 PostgreSQL ユーザ会(JPUG)
– https://www.postgresql.jp/
• PostgreSQL のマニュアル (JPUG のサイトから「日本語ドキュメント」)
LPI-Japan 8 https://oss-db.jp
目次 目次
– https://www.postgresql.jp/document/
• メーリングリスト(pgsql-jp)
– https://www.postgresql.jp/npo/mailinglist
• Let’s PostgreSQL
– http://lets.postgresql.jp/
LPI-Japan 9 https://oss-db.jp
1 SQL によるデータベースの操作基礎編
1 SQL によるデータベースの操作基礎編
1.1 データベース利用の基本パターン
データベースの役目は、利用者からの要求に応じて様々なデータを管理することです。それらを分類すると、以下のようなパ
ターンに分けることができます。
• 表を作成する(CREATE TABLE)
「表(TABLE)
データベースにデータを保管するには、 」を作成する必要があります。表の項目名や、データの種類(文
字や数値など)を指定する必要があります。
• データを挿入する(INSERT)
データベースにデータを保管することを「挿入 (INSERT)」と呼びます。データの種類に合わせたデータを挿入する必
要があります。
• データを検索する(SELECT)
データベースからデータを取り出すことを「検索 (SELECT)」と呼びます。条件を指定して一部を取り出したり、複数
の表から組み合わせでデータを取り出すなど、様々な検索が行えるのがデータベースのメリットです。
• データを更新する(UPDATE)
データベースのデータを修正することを「更新 (UPDATE)」と呼びます。すべてのデータを一括で修正したり、条件を
指定して一部のデータだけを修正したりできます。
• データを削除する(DELETE)
データベースからデータを取り除くことを「削除 (DELETE)」と呼びます。条件を指定して、取り除きたいデータを絞
り込みます。
注意:ここからの作業は第 11 章で説明しているセットアップが行われていることを前提としています。うまく作業が行えな
い場合には、セットアップが正しく行われていることを確認してください。
su コマンドでユーザーを切り替えるには、以下のように su コマンドに-(ハイフン)をつけて実行するようにしてください。
[root@localhost ~]# su - postgres
[postgres@localhost ~]$
LPI-Japan 10 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.2 psql ツールの利用
■1.2.1.2 データベース一覧を表示する
■1.2.1.3 データベースに接続する
以下のように、psql の引数として接続したいデータベースの名前を指定して実行します。
[postgres@localhost ~]$ psql ossdb
psql (10.1)
Type "help" for help.
ossdb=#
LPI-Japan 11 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.2 psql ツールの利用
1.2.3 メタコマンド
LPI-Japan 12 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.2 psql ツールの利用
ossdb=# \q
[postgres@localhost ~]$
1.2.5 表の確認
1.2.6 表定義の確認
ossdb=# \d orders
Table "public.orders"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
order_id | integer | | |
order_date | timestamp without time zone | | |
customer_id | integer | | |
prod_id | integer | | |
qty | integer | | |
ossdb=# \d prod
Table "public.prod"
Column | Type | Collation | Nullable | Default
-----------+---------+-----------+----------+---------
prod_id | integer | | |
prod_name | text | | |
price | numeric | | |
1.2.7 表とテーブル、リレーション
本書ではデータの格納先を「表」と記述していますが、psql の実行結果には「リレーション」や「テーブル」と表記されてい
ます。基本的に表とテーブルは同じものと考えて構いません。リレーションは、本来的な意味ではデータの集合を指していま
すが、リレーショナルデータベースではリレーションは表形式で表されますので、リレーションと表もほぼ同義と考えて良い
でしょう。同様に、「行」と「レコード」や「タプル」
、「列」と「カラム」も同義語になります。
LPI-Japan 13 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.3 pgAdmin4(GUI ツール)
• pgAdmin プロジェクト
– https://www.pgadmin.org/
図 1 psql と pgAdmin4
複数の管理対象データベースを登録しておいて、操作対象を切り替えながらデータベースの稼動状態、表や索引の一覧やそれ
ぞれの定義情報、状態を確認できます。
代表的な機能としては、データベースを選択した状態で上部メニューより「ツール」→「クエリツール」を選択すると SQL を
実行したり、よく使う SQL を保存しておくことができます。
データベース名を右クリックして表示されるメニューから「Backup」したり、バックアップを使った「Restore」で簡単にデー
タをファイルに出力したり、戻すこともできます。テーブル名を右クリックすると「先頭 n 件のデータを取得」したり、テー
ブルのメンテナンスが行えるといった形で、GUI ならではの直感的な操作が可能です。ぜひいろいろ試してみてください。
1.4.1 複数行入力のプロンプト表示
LPI-Japan 14 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.4 SQL の実行方法
図 2 pgAdmin4 を用いた状態確認
図 3 pgAdmin4 から SQL 実行
LPI-Japan 15 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.4 SQL の実行方法
表記 動作モード
データベース名=# 通常のプロンプト
データベース名-# 2 行目以降のプロンプト
1.4.2 テキストファイルからの読み込み実行
psql はテキストファイルから読み込んだ内容を実行する機能があります。同じ処理を何度も繰り返し実行したい場合には、あ
らかじめメタコマンドや SQL コマンドをファイルに記述して、psql に読み込ませて実行できます。
LPI-Japan 16 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)
1.5 データの検索(SELECT)
データの検索はデータベース利用の一番の基本です。データベースは様々な種類のデータを表形式で保管しているので、その
データを必要な形で取り出すのがデータの検索です。データの検索には SQL の SELECT 文を使用します。
1.5.1 全件全項目検索
データベースの表データを全件、全項目で取り出すのが全件全項目検索です。*(アスタリスク) を指定することで、対象とな
る検索表の全項目を検索します。
SELECT * FROM 表
LPI-Japan 17 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)
SELECT 文で検索したい列名をカンマ区切りで並べて指定します。
検索で取り出すデータ行を条件で絞り込むには、WHERE 句を使用します。
■1.5.3.2 主な条件式
条件式 意味
= 等しい
<> 等しくない
> よりも大きい
< よりも小さい(未満)
>= 以上
<= 以下
BETWEEN 範囲指定
LIKE 部分一致
それぞれの条件式を使ってどのような結果が得られるか見てみましょう。
■1.5.3.3 等号、不等号
LPI-Japan 18 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)
• よりも大きい (>)、よりも小さい(未満)(<)
ある列の値が指定した条件値よりも大きい、あるいは小さい(未満)データを取り出します。以下の例では、prod 表か
ら price 列の値が 70 よりも大きい行データを検索します。price 列の値が 70 のりんごは含まれません。
ossdb=# SELECT * FROM prod WHERE price > 70;
prod_id | prod_name | price
---------+-----------+-------
3 | メロン | 100
(1 row)
• 以上 (>=)、以下 (<=)
ある列の値が指定した条件値以上、あるいは以下のデータを取り出します。以下の例では、prod 表から price 列の値が
70 以上の行データを検索します。price 列の値が 70 のりんごも含まれます。
ossdb=# SELECT * FROM prod WHERE price >= 70;
prod_id | prod_name | price
---------+-----------+-------
2 | りんご | 70
3 | メロン | 100
(2 rows)
■1.5.3.4 範囲検索
• A 以上 B 以下
条件式に 2 つの値を指定し、その間の範囲に該当するデータを取り出します。以下の例では、prod 表から price 列の値
が 10 以上 80 以下の行データを検索します。price 列が 50 のみかん、70 のりんごが含まれ、範囲外であるメロンは含
まれません。
ossdb=# SELECT * FROM prod WHERE price BETWEEN 10 AND 80;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
LPI-Japan 19 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)
2 | りんご | 70
(2 rows)
この結果は、不等号を使った「以上、以下」を組み合わせた場合と同じです。
ossdb=# SELECT * FROM prod WHERE price >= 10 AND price <= 80;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
(2 rows)
■1.5.3.5 部分一致検索
• 指定した値がデータのどこかに一致(中間一致検索)
文字列中に「ん」を含むものを検索します。検索したい文字を % で囲みました。文字列なので’(シングルクォート) で
囲む点はこれまでの検索と同じです。以下の例では、文字列中に「ん」を含む「みかん」
「りんご」が該当します。
(「メ
ロン」は「ン」を含みますが、コンピューターは「ん」と「ン」を通常は区別します。
)
• 前方一致検索、後方一致検索
文字列の最後に「ん」を含むものを検索します。先ほど同様 % と組み合わせますが、文字列の最後であることを表すた
「ん」の後の % は指定しません。このような検索を後方一致検索と呼びます。以下の例では、文字列の最後に「ん」
めに、
を含む「みかん」が該当します。
前方一致検索の場合は、検索したい文字列を先頭にします。(例:’ り %’ とすると「りんご」が該当)
• 該当する文字位置を指定する場合
指定した値が文字列中の何文字目にあるか指定する検索です。先ほどの % は複数文字を表しましたが、その代わりに 1
文字につきひとつの_(アンダースコア)を使います。以下の例では、3 文字目が「ん」であるものを検索するためにア
ンダースコアを 2 つ並べて「__ん」を条件にしており、結果として「みかん」が検索されています。アンダースコア 1
文字分では結果は得られません。
LPI-Japan 20 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.6 ORDER BY 句による並べ替え
(0 rows)
• 指定した文字列を「含まない」検索
一致=に対して、不一致を表す<>があったように、LIKE に対してその文字列を含まないことを表す NOT LIKE が用意さ
れています。以下の例では、NOT LIKE を使って「ん」を含まないものを検索します。
「メロン」のみ該当します。
ossdb=# SELECT * FROM prod WHERE prod_name NOT LIKE '% ん %';
prod_id | prod_name | price
---------+-----------+-------
3 | メロン | 100
(1 row)
同様に「前方(後方)不一致検索」も可能です。
ossdb=# SELECT * FROM prod WHERE prod_name NOT LIKE '% ん';
prod_id | prod_name | price
---------+-----------+-------
2 | りんご | 70
3 | メロン | 100
(2 rows)
検索結果を指定した順番に並べ替えるには、ORDER BY 句を使用します。リレーショナルデータベースではデータを集合とし
て扱うため、並び順を指定しない限り結果の表示順を保証しません。ORDER BY 句で並べ替えを指定することで、期待した
順番で行データを取り出すことができます。DESC を指定すると、降順で並べ替えが行われます。
1.7 表の結合
リレーショナルデータベースでは、表と表を結びつけてデータを取り出すことができます。表を結びつけることを「結合」と
呼びます。
LPI-Japan 21 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.7 表の結合
■1.7.1.1 JOIN 〜 ON 構文
FROM 表 1
JOIN 表 2 ON 表 1. 列 = 表 2. 列
結合の使い方を順を追ってみていきましょう。
• 単一の表を検索
以下の例では、結合を行う元となる表である orders 表の order_id 列、customer_id 列、prod_id 列、qty 列を SELECT
項目リストに指定した SELECT 文です。
ossdb=# SELECT order_id,customer_id,prod_id,qty FROM orders;
order_id | customer_id | prod_id | qty
----------+-------------+---------+-----
1 | 1 | 1 | 10
2 | 2 | 2 | 5
3 | 3 | 3 | 8
4 | 2 | 1 | 3
5 | 3 | 2 | 4
(5 rows)
-- ↑ ↑
-- 「customer 表」「prod 表」から合致する値を取得する
LPI-Japan 22 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.7 表の結合
customer_id customer_name
1 佐藤商事
2 鈴木物産
3 高橋商店
LPI-Japan 23 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.7 表の結合
5 | りんご
(5 rows)
• 3 つの表を結合
この 2 つの JOIN 句を 1 つの SELECT 文にまとめます。最初に実行した SELECT 文は以下の通りでした。
SELECT order_id,customer_id,prod_id,qty
FROM orders
図 5 3 つの表の JOIN
LPI-Japan 24 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.8 行データの入力(INSERT)
1.7.2 表別名の利用
■1.7.2.1 表別名の指定方法
FROM 表名 別名
JOIN 表名 別名
1.8 行データの入力(INSERT)
表に行データを入力するには、INSERT 文を使用します。
値に文字列データを指定する場合には、'(シングルクォート)で括る必要があります。
1.9 データの更新(UPDATE)
行データを更新するには、UPDATE 文を使用します。
LPI-Japan 25 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.10 行データの削除(DELETE)
1.10 行データの削除(DELETE)
LPI-Japan 26 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.10 行データの削除(DELETE)
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
(3 rows)
LPI-Japan 27 https://oss-db.jp
2 データ型
2 データ型
PostgreSQL では、データをいくつかのデータ型に分類して保管しています。これまで利用してきたサンプルデータベースで
は、以下の 3 つのデータ型を使用しています。
• 数値データ型
• 文字列データ型
• 日付データ型
2.1 数値データ型
数値データ型は、いわゆる「数字」を保管するためのデータ型です。データベースでは四則演算をはじめ、様々な数値演算の
ための関数などが用意されているので、簡単に数値データを加工して取り扱うことができます。
2.1.1 integer 型
2.1.2 numeric 型
numeric(精度, 位取り)
LPI-Japan 28 https://oss-db.jp
2 データ型 2.2 文字列データ型
2.1.3 その他の数値型
■2.1.3.1 数値型一覧表
データ型 サイズ 範囲
2.2 文字列データ型
文字列データ型は、文字のデータを保管することができます。数値型のような演算に比べて大小比較や演算などを行うことは
できませんが、LIKE 演算子のように部分一致検索などを行うことができます。
文字数に上限のある可変長の文字列型です。可変長ですから、文字数制限内であれば何文字の文字データでも構いません。上
限を超える文字列を格納しようとするとエラーになります。
LPI-Japan 29 https://oss-db.jp
2 データ型 2.2 文字列データ型
文字数に上限のある固定長の文字列型です。固定長のため、足りない分の文字数は空白で埋められます。
上限である 3 文字を超える文字列を格納しようとするとエラーになります。文字列数の長さは半角、全角にかかわらず長さ 3
(3 文字)までです。
ossdb=# INSERT INTO char_test VALUES ('ABC');
INSERT 0 1
ossdb=# INSERT INTO char_test VALUES (' あいうえお');
ERROR: value too long for type character(3)
ossdb=# INSERT INTO char_test VALUES (' あいう');
INSERT 0 1
ossdb=# INSERT INTO char_test VALUES ('AIUEO');
ERROR: value too long for type character(3)
ossdb=# SELECT * FROM char_test;
string
--------
あ
ABC
あいう
(3 rows)
LPI-Japan 30 https://oss-db.jp
2 データ型 2.3 日付・時刻データ型
2.2.3 text 型
■2.2.3.1 文字列型一覧表
データ型 説明
2.3 日付・時刻データ型
日付・時刻データ型は、日付だけを格納するデータ型、時刻だけを格納するデータ型、両方を同時に格納するデータ型の3つ
が使用できます。目的に応じて使い分けるとよいでしょう。なお、本項では日付・時刻データ型の紹介とし、日付・時刻デー
タを検索する際の特有の記述については後述します。
■2.3.0.1 日付・時刻データ型一覧表
データ型 説明
LPI-Japan 31 https://oss-db.jp
2 データ型 2.3 日付・時刻データ型
LPI-Japan 32 https://oss-db.jp
3 表 3.1 表の作成(CREATE TABLE)
3 表
3.1.1 表を作成する
表を作成するには、列の名前と、その列にどのようなデータが入るのかを決めなければいけません。ここでは、以下のような
3 つの列を持つテーブルを作成します。
列名 データ型
社員番号 id integer 型
氏名 name text 型
誕生日 birthday date 型
ossdb=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+-------+----------
public | char_test | table | postgres
public | customer | table | postgres
public | date_test | table | postgres
public | numeric_test | table | postgres
public | orders | table | postgres
LPI-Japan 33 https://oss-db.jp
3 表 3.2 表定義の修正(ALTER TABLE)
ossdb=# \d staff
Table "public.staff"
Column | Type | Collation | Nullable | Default
----------+---------+-----------+----------+---------
id | integer | | |
name | text | | |
birthday | date | | |
メタコマンド\h で構文のヘルプを確認してみましょう。ここでは詳細を覚える必要はありませんが、変更対象の表を指定し、
さらに「新しい列を追加する(=ADD COLUMN)
」のような action を指定することをヘルプから読み取ってみてください。
ossdb=# \h ALTER TABLE
Command: ALTER TABLE
Description: change the definition of a table
Syntax:
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
action [, ... ]
(略)
ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]
(略)
LPI-Japan 34 https://oss-db.jp
3 表 3.2 表定義の修正(ALTER TABLE)
3.2.2 表定義の修正は原則として行わない
• 正しい設計になっているか
例えば、上記では staf 表に dept_cd 列を追加しましたが、所属部門を staf 表で管理することは理想的な対応だったで
しょうか。SELECT * FROM staff; とすれば所属情報込みでスタッフを一覧表示できることは確かに便利かもしれま
せん。しかし、1 名のスタッフが複数部門に所属するケースは起こりえないでしょうか。
このような場合は、新たに所属部門表を作成し「01 番のスタッフは A という組織に所属する」という事実を表すよう
「01 番のスタッフは同時に C という組織に所属する」場合はもう一行追加すればよいのです。
にします。
■3.2.2.1 所属部門表の例
スタッフ ID 部門コード 意味
01 A スタッフ 01 は A という組織に所属
02 B スタッフ 02 は B という組織に所属
03 C スタッフ 03 は C という組織に所属
01 C スタッフ 01 は C という組織に所属(同時に A と C に所属していることがわかる)
• 表定義の変更作業そのものがどんな影響を及ぼすか
仮に、スタッフ一覧に部門コードを持つことが適切であったとして、変更作業そのものがシステム全体に悪影響を及ぼ
す可能性があります。
小規模なスタッフ表であれば問題は少ないかもしれませんが、数百万人のデータを収めたウェブサービスの会員表であ
る場合はどうでしょうか。利用者がログインするたびに参照されているような場合、表の変更作業中は誰もログインで
きなくなり社会的影響にまで及ぶことを考慮します。(これは極端な例で、実際のデータベース製品の実装では変更中
の参照は許されていることが多いです。しかし、データの更新などはブロックされてしまいますので無視できるもので
はありません。
)
この場合もやはり上記のような所属部門表を新規に作成することで、利用者の操作を妨げることなく必要なデータは保
LPI-Japan 35 https://oss-db.jp
3 表 3.3 表の削除
持することができます。
• 短期の対策と中長期の対策
さしあたって必要なデータを格納するために、新規に所属部門表を作成したとします。しかし、やはり設計上はスタッ
フ一覧に部門コードを持つことが最適という場合もあるでしょう。
大規模メンテナンスのためのサービス休止期間を利用者にアナウンスし、理想的な表に変更することは長期的な対策と
しては有用です。
3.3 表の削除
LPI-Japan 36 https://oss-db.jp
3 表 3.3 表の削除
LPI-Japan 37 https://oss-db.jp
3 表 3.4 行データのセーブ・ロード
--------
(0 rows)
3.4 行データのセーブ・ロード
3.4.1 行データのセーブ
COPY TO 文で行データをファイルにセーブできます。
LPI-Japan 38 https://oss-db.jp
3 表 3.4 行データのセーブ・ロード
customer_id | customer_name
-------------+---------------
1 | 佐藤商事
2 | 鈴木物産
3 | 高橋商店
(3 rows)
具体的な使用例はこの後の演習で解説します。
LPI-Japan 39 https://oss-db.jp
4 基礎編 演習
4 基礎編 演習
4.1 演習 1:データ操作
4.1.1 データ操作演習
4.1.2 解答例
• 商品表の価格列を指定して UPDATE
ossdb=# \d prod
Table "public.prod"
Column | Type | Collation | Nullable | Default
-----------+---------+-----------+----------+---------
prod_id | integer | | |
prod_name | text | | |
price | integer | | |
LPI-Japan 40 https://oss-db.jp
4 基礎編 演習 4.1 演習 1:データ操作
(4 rows)
ossdb=# UPDATE prod SET price = price/1.1 WHERE price >= 100;
UPDATE 1
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 55
2 | りんご | 77
4 | バナナ | 34
3 | メロン | 100
(4 rows)
• COPY コマンドでデータをファイルにセーブ
• 演習 1-5: 表を再度作成します
• 表の作成時は列ごとに格納するデータに合わせた型を指定する
• 演習 1-6: データをファイルからコピーします
• セーブ時と同様、COPY コマンドを使用
LPI-Japan 41 https://oss-db.jp
4 基礎編 演習 4.2 演習 2:郵便番号データベース
---------+-----------+-------
1 | みかん | 55
2 | りんご | 77
4 | バナナ | 34
3 | メロン | 100
(4 rows)
4.2 演習 2:郵便番号データベース
4.2.1 郵便番号データのダウンロード
• http://www.post.japanpost.jp/zipcode/download.html
• 郵便番号データのダウンロード
以下の例は、wget コマンドを使って郵便番号 CSV データをダウンロードして、unzip コマンドで解凍しています。
[postgres@localhost ~]$ wget http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
--2018-01-29 01:14:02-- http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
www.post.japanpost.jp (www.post.japanpost.jp) を DNS に問いあわせています... 43.253.37.203
www.post.japanpost.jp (www.post.japanpost.jp)|43.253.37.203|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1686409 (1.6M) [application/zip]
`ken_all.zip' に保存中
[postgres@localhost ~]$ ls
customer.csv ken_all.zip test.sql
[postgres@localhost ~]$ unzip ken_all.zip
Archive: ken_all.zip
inflating: KEN_ALL.CSV
[postgres@localhost ~]$ ls -l KEN_ALL.CSV
-rw-rw-r--. 1 postgres postgres 12288638 12 月 22 14:22 KEN_ALL.CSV
4.2.2 郵便番号データベース表の作成
郵便番号データを格納するための表をデータベースに作成します。
• 郵便番号データ項目
データの項目は以下の通りです。
内容 備考
LPI-Japan 42 https://oss-db.jp
4 基礎編 演習 4.2 演習 2:郵便番号データベース
内容 備考
• 郵便番号データ用の表定義
以下の例は、文字列データを char 型および text 型で定義した表作成のための CREATE TABLE 文です。
ossdb=# CREATE TABLE zip (
lgcode char(5),
oldzip char(5),
newzip char(7),
prefkana text,
citykana text,
areakana text,
pref text,
city text,
area text,
largearea integer,
koaza integer,
choume integer,
smallarea integer,
change integer,
reason integer
);
CREATE TABLE
• 郵便番号データサンプル
データは以下のような内容です。
[postgres@localhost ~]$ head -5 KEN_ALL_UTF8.CSV
01101,"060 ","0600000","ホツカイドウ","サツポロシチユウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下
01101,"064 ","0640941","ホツカイドウ","サツポロシチユウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘",0,0,1,0,0
01101,"060 ","0600041","ホツカイドウ","サツポロシチユウオウク","オオドオリヒガシ","北海道","札幌市中央区","大通東",0,0,1
01101,"060 ","0600042","ホツカイドウ","サツポロシチユウオウク","オオドオリニシ (1-19 チヨウメ)","北海道","札幌市中央区","
01101,"064 ","0640820","ホツカイドウ","サツポロシチユウオウク","オオドオリニシ (20-28 チヨウメ)","北海道","札幌市中央区",
4.2.3 データのロードと文字コードについて
LPI-Japan 43 https://oss-db.jp
4 基礎編 演習 4.2 演習 2:郵便番号データベース
コード変換をする方法があります。
• psql メタコマンドを使用する方法
\encoding メタコマンドを使用すると、psql が扱うデータの文字コードを変更できます。
以下の例は、\encoding メタコマンドで psql が扱うデータの文字コードをシフト JIS に変更しています。データベー
スは UTF-8 で格納するので、シフト JIS から UTF-8 への文字コード変換が行われます。
ossdb=# \encoding SJIS
ossdb=# \copy zip from KEN_ALL.CSV with csv
COPY 124165
ossdb=# \encoding UTF-8
• Linux のコマンドを使用する方法
Linux であれば nkf コマンドで文字コード変換が行えます。他に iconv コマンドも使用できますが、改行コードを別
途 dos2unix コマンドで変換する必要があります。Linux 環境によっては nkf コマンドがインストールされていない場
合がありますので、その場合には yum コマンドでインストールしてください。
• nkf コマンドで郵便番号データを UTF-8 に変換
[postgres@localhost ~]$ nkf -w KEN_ALL.CSV > KEN_ALL_UTF8.CSV
4.2.4 郵便番号データの確認
ロードされた郵便番号データを確認します。
LPI-Japan 44 https://oss-db.jp
5 SQL によるデータベースの操作応用編
5 SQL によるデータベースの操作応用編
• 以降の実行例は、prod 表が以下の状態になっている前提で記載します。
ossdb=# DROP TABLE prod;
DROP TABLE
ossdb=# CREATE TABLE prod ( prod_id integer,
prod_name text,
price numeric );
CREATE TABLE
ossdb=# INSERT INTO prod(prod_id,prod_name,price) VALUES
(1,' みかん',50),
(2,' りんご',70),
(3,' メロン',100),
(4,' バナナ',30);
INSERT 0 4
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
4 | バナナ | 30
(4 rows)
5.1 演算子と関数
5.1.1 演算子
• AND/OR 演算子
SELECT 文などに指定する WHERE 句の条件で、複数の条件を設定したい場合には AND 演算子、OR 演算子が使用
できます。
AND 演算子は指定した条件が両方満たされる場合、OR 演算子は指定した条件のいずれかが満たされる場合に SQL 文
の結果が表示されます。
以下の例は、prod 表の price 列の値が 50 よりも大きく、100 よりも小さい行データのみを検索しています。
ossdb=# SELECT * FROM prod WHERE price > 50 AND price < 100;
prod_id | prod_name | price
---------+-----------+-------
2 | りんご | 70
(1 row)
LPI-Japan 45 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数
• LIKE 演算子
ある列の値が指定した条件に部分的に一致する行データを取り出します。
以下の例では、customer 表の customer_name 列が「鈴木」で始まる行データを検索しています。
なお LIKE 演算子は便利な反面、性能上検索速度が遅くなる場合があるので、注意して使う必要があるでしょう。
ワイルドカード 内容
_ 1 文字
% 0 文字以上の文字列
• BETWEEN 演算子
ある列の値が指定した 2 つの条件値の範囲内にあるデータを取り出します。2 つの条件値は AND で指定します。条件
値そのものも含まれるので「○以上、○以下」という条件であると考えればよいでしょう。
以下の例では、prod 表の price 列が 50 から 70 の間の行データを検索しています。
ossdb=# SELECT * FROM prod WHERE price BETWEEN 50 AND 70;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
(2 rows)
5.1.2 関数
• 集約関数
集約関数を使用すると、データを SQL 文で集計することができ、データを一括で処理して 1 つの結果を返します。
■5.1.2.1 主な集約関数
関数 説明
count 関数 対象データの件数を返す
sum 関数 対象データ(数値)の合計値を返す
avg 関数 対象データ(数値)の平均値を返す
LPI-Japan 46 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数
関数 説明
max 関数 対象データ(数値または文字)の最大値を返す
文字の場合、コード順で大小を評価
min 関数 対象データ(数値または文字)の最小値を返す
文字の場合、コード順で大小を評価
• count 関数
count 関数はデータの行数を数える関数です。
ossdb=# SELECT count(order_id) FROM orders;
count
------
5
(1 row)
• sum 関数
sum 関数は指定された列の合計を計算する関数です。
ossdb=# SELECT sum(qty) FROM orders;
sum
----
30
(1 row)
• avg 関数
avg 関数は指定された列の平均を計算する関数です。
ossdb=# SELECT avg(qty) FROM orders;
avg
-------------------
6.0000000000000000
(1 row)
• max 関数
max 関数は指定された列の最大値を計算する関数です。
ossdb=# SELECT max(qty) FROM orders;
max
-----
10
(1 row)
• min 関数
min 関数は指定された列の最小値を計算する関数です。
ossdb=# SELECT min(qty) FROM orders;
min
-----
3
(1 row)
参考: 文字データの最大/最小
文字データの大小関係は、文字コードの並び順により評価されます。
以下の例では、「あ」~「お」を表す UTF-8 の文字コードを表示し、その順序通りに並べ替えが行われていることを確認して
います。max 関数や min 関数の結果も並び順に従っていることがわかります。
LPI-Japan 47 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数
GROUP BY 句を使うと、指定された列で行をグループ化し、それぞれのグループ毎に集約関数の計算を行うことができます。
5.1.4 HAVING 句
LPI-Japan 48 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数
(3 rows)
1. WHERE 句による行に対する絞り込み
2. GROUP BY 句によるグループ化
3. HAVING 句によるグループに対する絞り込み
まず WHERE 句で検索対象になる行全体に対して絞り込みが行われます。この時点で除外された行は集約関数の対象にはな
りません。次に GROUP BY 句によるグループ化が行われます。HAVING 句はこのグループに対して集約関数で計算を行い、
指定された演算子に基づいて絞り込みを行います。
SQL を考えると以下のようになるでしょう。
SELECT 年齢, 地域,count(*),avg(点数)
FROM 生徒一覧
WHERE 年齢 BETWEEN 16 AND 18 --------- ② 年齢の条件で分類に関係ないデータを除外
GROUP BY 年齢, 地域--------------------- ① 年齢、地域別に分類
HAVING avg(点数) >= 80;---------------- ③ 平均点が 80 点を超えるグループを抽出
LPI-Japan 49 https://oss-db.jp
7 マルチユーザーでの利用
7 マルチユーザーでの利用
PostgreSQL はマルチユーザーのデータベースです。複数のユーザーを使い分けることで、あるユーザーは表のデータを更新
でき、あるユーザーは検索のみ行えるようにするなど、ユーザー毎に行えるデータベースの操作を変えたりすることができ
ます。
7.1 ユーザーの作成
ユーザーを確認するには\du メタコマンドを実行します。
7.1.1 ユーザーとロール
LPI-Japan 70 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証
7.1.2 スーパーユーザー
データベースには一番最初に初期化した際に、データベースに対するすべての権限を持ったユーザーが作成されます。これを
スーパーユーザーと呼びます。Linux における root ユーザーや、Windows における Administrator ユーザーのようなもの
と考えればよいでしょう。PostgreSQL では、Linux 上でデータベースの初期化(initdb コマンドの実行)を行った OS ユー
ザーの名前でスーパーユーザーが作成されます。このユーザーのユーザ名は慣習的に postgres となっています。
7.2 接続と認証
7.2.1 接続認証の設定を確認
各項目の設定は、左から順に以下のようになっています。
• 接続方法(TYPE)
クライアントがどのように PostgreSQL に接続するかを指定します。
■7.2.1.1 接続方法の設定
接続タイプ 説明
• データベース(DATABASE)
接続認証の対象となるデータベースを指定します。all と記述するとすべてのデータベースが対象となります。
• ユーザー(USER)
接続認証の対象となるユーザーを指定します。all と記述するとすべてのユーザーが対象となります。
• 認証方法(METHOD)
認証方式を指定します。
LPI-Japan 71 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証
■7.2.1.2 認証方法の設定
認証メソッド 説明
trust 認証なしに接続
reject 接続拒否
md5 MD5 パスワード認証
password 平文パスワード認証
scram-sha-256 SCRAM 認証
gss GSSAPI 認証
sspi SSPI
ident IDENT 認証
peer peer 認証
pam PAM 認証
ldap LDAP 認証
radius RADIUS 認証
cert SSL クライアント証明書認証
RPM からインストールした場合のデフォルトの設定では、ローカルホストでの接続で、すべてのデータベース、ユーザーに
対して trust 認証を行うことが設定されています。
7.2.2 接続ユーザーの指定
psql でデータベースに接続する際、本来はどのユーザーで接続するか指定する必要がありますが、明示的に指定されなかった
場合には psql を実行した Linux のユーザー名が暗黙の内に指定されます。接続ユーザーは\set メタコマンドを実行して変数
USER の値で確認できます。
ossdb=# \set
AUTOCOMMIT = 'on'
COMP_KEYWORD_CASE = 'preserve-upper'
DBNAME = 'ossdb'
ECHO = 'none'
ECHO_HIDDEN = 'off'
ENCODING = 'UTF8'
FETCH_COUNT = '0'
HISTCONTROL = 'none'
HISTSIZE = '500'
HOST = '/var/run/postgresql'
IGNOREEOF = '0'
ON_ERROR_ROLLBACK = 'off'
ON_ERROR_STOP = 'off'
LPI-Japan 72 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証
PORT = '5432'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
QUIET = 'off'
SERVER_VERSION_NAME = '10.1'
SERVER_VERSION_NUM = '100001'
SHOW_CONTEXT = 'errors'
SINGLELINE = 'off'
SINGLESTEP = 'off'
USER = 'postgres'
VERBOSITY = 'default'
VERSION = 'PostgreSQL 10.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-b
VERSION_NAME = '10.1'
VERSION_NUM = '100001'
ossdb=> \set
(該当箇所のみ抜粋)
DBNAME = 'ossdb'
USER = 'sato'
7.2.3 パスワード認証の設定
7.2.4 パスワードの設定、変更
パスワード認証が有効になると、パスワードが設定されていないユーザーはデータベースに接続できなくなるので、パスワー
ドを設定しておきます。
• 既存ユーザーにパスワード設定
LPI-Japan 73 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証
• 強度の高いパスワード格納方式
pg_hba.conf で指定する認証方式には、password、md5、scram-sha-256 という 3 つのパスワード格納方式が指定で
きます。このうち、デフォルトの格納方式は md5 ですが、近年では暗号化強度が弱いとされ、PostgreSQL 10 からは
scram-sha-256 が利用可能になっています。
[postgres@localhost ~]$ psql ossdb
ossdb=# SET password_encryption = 'scram-sha-256';
SET
ossdb=# ALTER USER postgres PASSWORD 'postgres';
ALTER ROLE
7.2.5 設定値の再読み込み
PostgreSQL の各設定には、その設定が反映されるタイミングが定められています。ほぼすべてのパラメーターが起動時に読
み込まれるほか、pg_hba.conf の設定やその他の一部のパラメーターは設定の再読み込みで反映されるようになっています。
PostgreSQL の停止または再起動は、他のユーザーがデータベースを使用している場合、デフォルトでは実行中の処理を中断
して停止処理が優先される動作になっています。重要な処理の実行に影響しないよう、メンテナンス時間帯を設けて作業を行
うことが大切ですが、このように他の処理への影響を軽微にできる方法が用意されている場合もあります。
7.2.6 パスワード認証による接続
パスワード認証が有効になったかどうかを確認します。
LPI-Japan 74 https://oss-db.jp
7 マルチユーザーでの利用 7.3 ネットワーク経由接続
ossdb=# \q
[postgres@localhost ~]$ psql ossdb sato
Password for user sato:
psql (10.1)
Type "help" for help.
ossdb=> \q
7.3 ネットワーク経由接続
7.3.1 ネットワーク経由接続の設定
以下の例では、すべてのインターフェースからの接続を受け付けるように設定しています。
[postgres@localhost ~]$ vi $PGDATA/postgresql.conf
-----
#listen_addresses = 'localhost' # what IP address(es) to listen on;
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost', '*' for all
# (change requires restart)
#port = 5432 # (change requires restart)
LPI-Japan 75 https://oss-db.jp
7 マルチユーザーでの利用 7.4 アクセス権限
以下の例では、サーバーの IP アドレスに対してネットワーク経由接続を行っています。
[postgres@localhost ~]$ psql -h 192.168.101.10 -p 5432 -U sato ossdb
Password for user sato:
psql (10.1)
Type "help" for help.
ossdb=>
7.4 アクセス権限
1 つのデータベースに複数のユーザーが接続できる場合、アクセス権限を設定することで表などに対する操作を制御すること
ができます。
7.4.1 アクセス権限の付与
アクセス権限を付与するには、GRANT 文を使用します。
LPI-Japan 76 https://oss-db.jp
9 バックアップとリストア 9.2 ファイルのコピー
9 バックアップとリストア
データベースのバックアップとリストアは、重要なデータを扱うデータベースにとって重要な作業です。ハードディスクの障
害などでデータが失われた時、あらかじめ取得しておいたバックアップから確実にリストアが行えるようにしておく必要があ
ります。
9.1 バックアップ手法の整理
データベースのデータは、多数のユーザーにより同時に更新される可能性があり、テキスト文書や表計算ソフトのファイルを
USB メモリにコピーするような単純な手法ではバックアップになりません。
以下のようなバックアップ手法を知り、利用目的に応じて使い分ける必要があります。
9.1.1 主なバックアップ手法一覧
手法 復旧ポイント 説明
本書では、バックアップ手法の一例として、環境準備や事前設定が不要で簡単に試すことができる「ファイルコピー」と
「pg_dump」を紹介します。
9.2 ファイルのコピー
最も確実で簡単なバックアップは、ファイルレベルでのバックアップです。必要となるファイルをすべてコピーすることで
バックアップができます。ただし、ファイルのコピーを行うには PostgreSQL を完全に停止する必要があります。
LPI-Japan 90 https://oss-db.jp
9 バックアップとリストア 9.3 pg_dump コマンドによるバックアップ
/var/lib/pgsql/10/data/pg_wal/
/var/lib/pgsql/10/data/pg_wal/archive_status/
/var/lib/pgsql/10/data/pg_wal/000000010000000000000003
/var/lib/pgsql/10/data/pg_wal/000000010000000000000004
:
[postgres@localhost ~]$ ls -l backup.tar
-rw-rw-r--. 1 postgres postgres 95887360 1月 23 12:34 backup.tar
[postgres@localhost ~]$ pg_ctl start
サーバの起動完了を待っています....
2018-02-05 02:09:45.616 JST [4866] LOG: redirecting log output to logging collector process
2018-02-05 02:09:45.616 JST [4866] HINT: Future log output will appear in directory "log".
完了
サーバ起動完了
注意:この方法はデータベースを構成する すべてのファイルを利用者自身が指定する必要があります。テーブルスペース機能
を用いて複数ディレクトリに分かれて保持されているデータがある場合、もれなく取得しなければなりません。
LPI-Japan 91 https://oss-db.jp
9 バックアップとリストア 9.4 pg_restore によるリストア
/* ossdb データベースを復旧 */
警告: リストアにてエラーを無視しました: 1
ossdb=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+----------+----------
public | char_test | table | postgres
public | customer | table | postgres
public | date_test | table | postgres
public | numeric_test | table | postgres
public | order_id_seq | sequence | postgres
public | orders | table | postgres
public | prod | table | postgres
public | student | table | postgres
public | varchar_test | table | postgres
public | zip | table | postgres
(10 rows)
LPI-Japan 92 https://oss-db.jp
10 WEB アプリケーションとの連携
10 Web アプリケーションとの連携
データベースの一般的な利用方法として、Web アプリケーションと連携してデータベースでデータの管理を行う形がありま
す。このように Web アプリケーションの背後で動作するデータベースを「バックエンドデータベース」と呼びます。この章で
は、Web アプリケーション開発でよく利用されている言語「PHP」との組み合わせでのバックエンドデータベースとしての利
用方法を学びます。
LPI-Japan 93 https://oss-db.jp
10 WEB アプリケーションとの連携 10.3 Apache と PHP 環境の設定
依存性を解決しました
================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
================================================================================================
インストール中:
php x86_64 5.4.16-43.el7_4 updates 1.4 M
php-pgsql x86_64 5.4.16-43.el7_4 updates 86 k
依存性関連でのインストールをします:
httpd x86_64 2.4.6-67.el7.centos.6 updates 2.7 M
httpd-tools x86_64 2.4.6-67.el7.centos.6 updates 88 k
libzip x86_64 0.10.1-8.el7 base 48 k
mailcap noarch 2.1.41-2.el7 base 31 k
php-cli x86_64 5.4.16-43.el7_4 updates 2.7 M
php-common x86_64 5.4.16-43.el7_4 updates 565 k
php-pdo x86_64 5.4.16-43.el7_4 updates 98 k
トランザクションの要約
================================================================================================
インストール 2 パッケージ (+7 個の依存関係のパッケージ)
総ダウンロード容量: 7.7 M
インストール容量: 27 M
Is this ok [y/d/N]: y
Downloading packages:
(1/9): libzip-0.10.1-8.el7.x86_64.rpm | 48 kB 00:00:01
(2/9): mailcap-2.1.41-2.el7.noarch.rpm | 31 kB 00:00:01
(3/9): httpd-tools-2.4.6-67.el7.centos.6.x86_64.rpm | 88 kB 00:00:01
(4/9): php-5.4.16-43.el7_4.x86_64.rpm | 1.4 MB 00:00:01
(5/9): httpd-2.4.6-67.el7.centos.6.x86_64.rpm | 2.7 MB 00:00:02
(6/9): php-pdo-5.4.16-43.el7_4.x86_64.rpm | 98 kB 00:00:00
(7/9): php-common-5.4.16-43.el7_4.x86_64.rpm | 565 kB 00:00:00
(8/9): php-pgsql-5.4.16-43.el7_4.x86_64.rpm | 86 kB 00:00:00
(9/9): php-cli-5.4.16-43.el7_4.x86_64.rpm | 2.7 MB 00:00:00
-------------------------------------------------------------------------------------------------
合計 3.1 MB/s | 7.7 MB 00:00:02
LPI-Japan 94 https://oss-db.jp
10 WEB アプリケーションとの連携 10.3 Apache と PHP 環境の設定
インストール:
php.x86_64 0:5.4.16-43.el7_4 php-pgsql.x86_64 0:5.4.16-43.el7_4
依存性関連をインストールしました:
httpd.x86_64 0:2.4.6-67.el7.centos.6 httpd-tools.x86_64 0:2.4.6-67.el7.centos.6
libzip.x86_64 0:0.10.1-8.el7 mailcap.noarch 0:2.1.41-2.el7
php-cli.x86_64 0:5.4.16-43.el7_4 php-common.x86_64 0:5.4.16-43.el7_4
php-pdo.x86_64 0:5.4.16-43.el7_4
完了しました!
インストールが終わったら、動作テストを行います。
テスト用の PHP を埋め込んだファイル index.php を、Apache が HTML ファイルを参照する/var/www/html ディレクトリ
に作成します。
[root@localhost ~]# echo "<?php phpinfo(); ?>" > /var/www/html/index.php
[root@localhost ~]# cat /var/www/html/index.php
<?php phpinfo(); ?>
Web サーバーを起動します。
以下の例では、systemctl のサブコマンド list-unit-files で httpd の起動に用いるサービス名を確認し、start でサー
ビスを起動、status や ps コマンドで正常に起動したことを確認しています。
[root@localhost ~]# systemctl list-unit-files | grep httpd
httpd.service disabled
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
LPI-Japan 95 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携
関数名 説明
LPI-Japan 96 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携
関数名 説明
pg_ield_name() 列名を取得します。
pg_fetch_object() 行データを取得します。
pg_close() PostgreSQL との接続を終了します。
また、使用している他の(PostgreSQL 操作以外の)関数は以下の通りです。
関数名 説明
LPI-Japan 97 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携
図 11 phpinfo
10.4.1 データ検索ページの作成
selectProd.php
<html>
<body>
<?php
$dbcon = pg_connect("dbname=ossdb user=postgres password=password");
if (!$dbcon) {
die("<hr>pg_connect 失敗<hr>");
}
$sql = "SELECT * FROM prod";
echo "SQL=$sql<brx>\n";
$result = pg_query ($dbcon, $sql);
if (!$result) {
pg_last_error($dbcon);
LPI-Japan 98 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携
ファイルを作成したら、Web ブラウザからアクセスして結果を確認します。
http://localhost/selectProd.php
10.4.2 フォームからのデータの取得方法
test.html
<html>
<body>
<form action="test.php" method="post">
<input type=text name="foo">
<input type=submit>
</form>
</body>
</html>
test.php
<?php
echo htmlspecialchars($_POST['foo']);
LPI-Japan 99 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携
図 12 selectProd
?>
selectForm.html
<html>
<body>
検索したいテーブル名を入力して下さい。
<form action="selectForm.php" method="post">
<input type=text name="table">
<input type=submit>
</form>
</body>
</html>
図 13 testhtml
selectForm.php
<html>
<body>
<?php
$dbcon = pg_connect("dbname=ossdb user=postgres password=password");
if (!$dbcon) {
die("<hr>pg_connect 失敗<hr>");
}
$table = $_POST['table'];
$sql = "SELECT * FROM $table";
echo "SQL=$sql<brx>\n";
$result = pg_query ($dbcon, $sql);
if (!$result) {
pg_last_error($dbcon);
die( "pg_exec 失敗<hr>");
}
$numrows = pg_num_rows($result);
$fnum = pg_num_fields($result);
echo "<table border>";
echo "<tr>";
for ($x = 0; $x < $fnum; $x++) {
echo "<td><b>";
echo htmlspecialchars(strtoupper(pg_field_name($result, $x)));
図 14 testphp
echo "</b></td>";
}
echo "</tr>";
for ($i = 0; $i < $numrows; $i++) {
$row = pg_fetch_object($result, $i);
echo "<tr align='center'>";
for ($x = 0; $x < $fnum; $x++) {
$fieldname = pg_field_name($result, $x);
echo "<td>";
echo htmlspecialchars($row->$fieldname);
echo "</td>";
}
echo"</tr>";
}
echo "</table>";
pg_close($dbcon);
?>
</body>
</html>
作成したフォームにアクセスし、検索したい表の名前を入力します。
http://localhost/selectForm.html
図 15 selectFormhtml
11 実習環境の構築方法
11.1 OS のインストール
11.1.1 OS ユーザーの作成
図 16 selectFormphp.png
11.1.2 セキュリティの設定
セキュリティの設定では、外部からの攻撃などを受けない環境であることを確認した上で、ファイアーウォールや SELinux
は無効にしていることを想定しています。
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld.service
注意:開発中の最新版(α版、β版や RC 版)が同ページで配布されていることがありますが、不具合修正の後、数か月後に
正式リリースされるものですので、新機能検証などの目的以外では利用しないことを推奨します。
(中略)
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : pgdg-centos10-10-2.noarch
検証中 : pgdg-centos10-10-2.noarch
インストール:
pgdg-centos10.noarch 0:10-2
完了しました!
依存性を解決しました
================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
================================================================================================
インストール中:
postgresql10 x86_64 10.1-1PGDG.rhel7 pgdg10 1.5 M
postgresql10-contrib x86_64 10.1-1PGDG.rhel7 pgdg10 587 k
postgresql10-devel x86_64 10.1-1PGDG.rhel7 pgdg10 2.0 M
postgresql10-server x86_64 10.1-1PGDG.rhel7 pgdg10 4.3 M
依存性関連でのインストールをします:
libicu-devel x86_64 50.1.2-15.el7 base 702 k
postgresql10-libs x86_64 10.1-1PGDG.rhel7 pgdg10 347 k
トランザクションの要約
================================================================================================
総ダウンロード容量: 9.3 M
インストール容量: 40 M
Is this ok [y/d/N]: y
Downloading packages:
警告: /var/cache/yum/x86_64/7/base/packages/libicu-devel-50.1.2-15.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signatur
libicu-devel-50.1.2-15.el7.x86_64.rpm の公開鍵がインストールされていません
(1/6): libicu-devel-50.1.2-15.el7.x86_64.rpm | 702 kB 00:00:00
(2/6): postgresql10-contrib-10.1-1PGDG.rhel7.x86_64.rpm | 587 kB 00:00:02
(3/6): postgresql10-10.1-1PGDG.rhel7.x86_64.rpm | 1.5 MB 00:00:03
(4/6): postgresql10-libs-10.1-1PGDG.rhel7.x86_64.rpm | 347 kB 00:00:00
(5/6): postgresql10-devel-10.1-1PGDG.rhel7.x86_64.rpm | 2.0 MB 00:00:01
(6/6): postgresql10-server-10.1-1PGDG.rhel7.x86_64.rpm | 4.3 MB 00:00:03
-----------------------------------------------------------------------------------------------------
合計 1.4 MB/s | 9.3 MB 00:00:06
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 から鍵を取得中です。
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-4.1708.el7.centos.x86_64 (@anaconda)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
上記の処理を行います。よろしいでしょうか? [y/N]y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : postgresql10-libs-10.1-1PGDG.rhel7.x86_64 1/6
インストール中 : postgresql10-10.1-1PGDG.rhel7.x86_64 2/6
インストール中 : libicu-devel-50.1.2-15.el7.x86_64 3/6
インストール中 : postgresql10-devel-10.1-1PGDG.rhel7.x86_64 4/6
インストール中 : postgresql10-server-10.1-1PGDG.rhel7.x86_64 5/6
インストール中 : postgresql10-contrib-10.1-1PGDG.rhel7.x86_64 6/6
検証中 : postgresql10-server-10.1-1PGDG.rhel7.x86_64 1/6
検証中 : postgresql10-libs-10.1-1PGDG.rhel7.x86_64 2/6
検証中 : postgresql10-devel-10.1-1PGDG.rhel7.x86_64 3/6
検証中 : postgresql10-contrib-10.1-1PGDG.rhel7.x86_64 4/6
検証中 : libicu-devel-50.1.2-15.el7.x86_64 5/6
検証中 : postgresql10-10.1-1PGDG.rhel7.x86_64 6/6
インストール:
postgresql10.x86_64 0:10.1-1PGDG.rhel7 postgresql10-contrib.x86_64 0:10.1-1PGDG.rhel7
postgresql10-devel.x86_64 0:10.1-1PGDG.rhel7 postgresql10-server.x86_64 0:10.1-1PGDG.rhel7
依存性関連をインストールしました:
libicu-devel.x86_64 0:50.1.2-15.el7 postgresql10-libs.x86_64 0:10.1-1PGDG.rhel7
完了しました!
インストールが完了すると、以下の通りディレクトリとバイナリが配置されています。
[postgres@localhost ~]$ ls /usr/pgsql-10/
bin doc include lib share
インストール直後はデータベースが作成されておらず、次のステップ以降で利用者が作成します。インストールした
PostgreSQL は、OS ユーザー postgres が初期化ユーザーとして管理権限を持っているので、su コマンドでユーザー postgres
に変更して操作を行います。PostgreSQL に対する各種操作がしやすいように OS 側の設定を行います。なお、データディレ
クトリの位置はデータベース作成時に指定できますが、その際に本項の設定(環境変数と起動スクリプト)が正しく設定され
ている必要があります。本書ではデフォルトの位置(/var/lib/pgsql/10/data)に作成することとします。
■11.2.3.1 環境変数の設定
環境変数 説明
PGDATA データディレクトリ位置を指定します。
PGHOME PostgreSQL のインストールディレクトリを指定します。
PATH PostgreSQL インストールディレクトリ配下の bin を指定します。
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
■11.2.3.2 起動スクリプトの確認
インターネットへの接続が行えないなどの制限がある場合には、Web サイトから以下のパッケージをダウンロードしてサー
バーに配置し、RPM コマンドでインストールしてください。
http://yum.pgrpms.org/packages.php
https://yum.postgresql.org/10/redhat/rhel-7-x86_64/repoview/postgresqldbserver10.group.html
以下のパッケージをダウンロードしサーバーに配置します。
パッケージ名 説明
各パッケージのリンク先にはさらに複数マイナーバージョンが配布されている場合があります。本書ではいずれも 10.1 を利
用しています。
11.3 データベースの初期化
データベースクラスタを作成します。この作業をデータベースの初期化と呼び、インストール後に 1 回だけ行います。
11.3.2 データディレクトリ
データベースクラスタを構成するすべてのファイルやディレクトリは 1 つのディレクトリ配下にまとめて配置されます。この
ディレクトリをデータディレクトリと呼び、環境変数 PGDATA で指定されます。initdb 時、環境変数 PGDATA が参照さ
れ、ここで指定した位置にデータベースクラスタが作成されます。
データベースクラスタはロケール"C"で初期化されます。
デフォルトのテキスト検索設定は english に設定されました。
データベージのチェックサムは無効です。
警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.conf を編集する、もしくは、次回 initdb を実行する時に-A オプショ
ン、または、--auth-local および--auth-host を使用することで変更するこ
とができます。
11.4 データベースを起動
PostgreSQL が正しく起動されている場合、ステータスは以下のようになります。
[root@localhost ~]# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-10.service; disabled; vendor preset: disabled)
Active: active (running) since 月 2018-01-22 01:59:14 JST; 6s ago
Docs: https://www.postgresql.org/docs/10/static/
Process: 22602 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} (code=exited, status=0/SUCC
Main PID: 22611 (postmaster)
CGroup: /system.slice/postgresql-10.service
tq22611 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data/
tq22614 postgres: logger process
tq22616 postgres: checkpointer process
tq22617 postgres: writer process
tq22618 postgres: wal writer process
tq22619 postgres: autovacuum launcher process
tq22620 postgres: stats collector process
mq22621 postgres: bgworker: logical replication launcher
(以下略)
11.5 動作の確認
12 付録 実習の準備方法
実習で使用するデータベースを作成し、データベースに接続します。そして、表を作成し、初期データを入力します。
12.1 データベースの作成
ossdb=#
12.2 表の作成
以下は実行例です。
ossdb=# CREATE TABLE prod
(prod_id integer,
prod_name text,
price integer);
CREATE TABLE
(略)
12.3 データの入力
-- 複数行を同時に INSERT
INSERT INTO customer(customer_id,customer_name) VALUES
(1,' 佐藤商事'),
(2,' 鈴木物産'),
(3,' 高橋商店');
以下は実行例です。