プロダクト開発の概要
今回のプロダクト開発では、フレームワークを利用して開発したWebアプリケーションを公開するための一連の流れについて学習します。
Conoha Wing の設定
今回は共用のレンタルサーバーを利用した Web アプリケーションの公開を行います。
レンタルサーバーとは、1台の Web サーバーを複数人で共有し安価に Web サーバーを利用する仕組みです。
第1章では Conoha WING と呼ばれる レンタルサーバーのホスティングサービスを利用し、基礎的な設定を行います。
ネットワークとセキュリティの基礎
Web サーバーを利用する際には、ネットワークに関する基礎的な知識が必要になります。
各種設定を単なるおまじないではなく、どの様な意味があり、何のために実行しているのかを理解できる様になるため、初歩のネットワーク知識を身につけていきましょう。
また、セキュリティに関連する設定方法についても学んでいきます。
Linux の基本コマンド
レンタルサーバーを操作する時には、 ssh と呼ばれるものを利用して、遠隔でサーバーにアクセスし Linux の各種コマンドを実行する必要があります。
Linux の基本コマンドを理解し、サーバー操作の基本を身につけましょう。
バージョン管理とGit
継続的に Web アプリケーションの開発を行い、適宜最新のものを公開したり、不具合があった場合に過去のバージョンに戻ったりするためには、バージョン管理用のソフトウェアを利用する必要があります。
バージョン管理用ソフトウェアのデファクトスタンダードである Git を利用し、バージョン管理の基本を学びます。
リポジトリからの環境構築
Git を利用して保存されたアプリケーションの履歴データを「リポジトリ」と呼びます。
GitHub と言うサービスを利用してクラウド上にアップロードされている既存のリポジトリを、ローカルにダウンロード(クローン)して、開発環境を整えるための基本的な手順を学びます。
既存サイトのセキュリティ修正
Web アプリケーションを公開する際には、各種のセキュリティに配慮する必要があります。
どの様なセキュリティ項目に配慮する必要があり、具体的にどの様に対策すれば良いのかを学びます。
コードの品質
公開した Web アプリケーションは、その後メンテナンスを繰り返し継続的に運用されていきます。
非効率で品質の低いコードは、一見要件を満たしている様に見えても、
問題が発生した際に、どの部分のコードが問題になっているのか判別しにくい
1箇所を修正するたびに複数の関連箇所を修正する必要がある
効率的なコードに比べて動作が著しく遅い
などの問題が発生しやすくなります。
高い品質のコードとはどの様なものかを学びます。
デプロイ方法
リポジトリ上に構築された Web アプリケーションをレンタルサーバー上にダウンロードして公開するためには、一連のプロセスで順序よく設定を行う必要があります。
公開(デプロイ)のための一連の操作方法を学びます。
最終課題・オリジナルサービスのデプロイ
ここまで学んだ内容を利用して、要件に従ってリポジトリ上にオリジナルサービスを構築し、デプロイしていただきます。
この章では
この章では、レンタルサーバーの契約・セットアップの方法と、動作確認を行います。
(なお、今回紹介するレンタルサーバーの契約は有料になります。学習の際に、実際にレンタルサーバーの契約を行って学習するかどうかは受講者様の任意となり、終了の要件とはなりません。)
学習の全体像
レンタルサーバー とは
レンタルサーバーとは、運営会社が保有するサーバー(Webサーバーがインストールされたマシン)の利用権を貸し出すサービスで、ホスティングサービスとも呼ばれます。
レンタルサーバーには共用サーバーと専用サーバーという契約形態があります。
共用サーバーとは、一つのサーバーを複数人で利用する契約形態で、比較的安価に利用できると言う特徴があります。安価な代わりに、権限を与えられた一部の設定項目を除いて、サーバーの設定は予め設定された内容から変更できない、他のユーザーのサービスの稼働率が高い場合に自分のサービスの動作に影響する可能性があるなどの欠点があります。
専用サーバーとは、一つのサーバーを占有する契約形態で、料金は共用サーバーに比べて高くなりますが、管理者権限を利用してサーバーの設定変更が可能であり、他のユーザーの影響を受けない、などのメリットがあります。
今回のテキストでは、比較的安価な共用サーバーを利用して Web アプリケーションのデプロイ方法を学びます。
Conoha WING とは
レンタルサーバーとして、今回は Conoha WING を利用します。
Conoha WING は GMOインターネット株式会社の提供するサービスの一つで、WINGパックプランを利用すると独自ドメインの取得がセットになると言う特徴があります。
Conoha WING は まず Conoha サービスにアカウント登録したうえで、コントロールパネルから利用したいサーバーを追加し、契約を行います。
Conoha WING のサーバー詳細
Conoha WING で利用できるサーバーの詳細は以下の通りです。(Wingパック、ベーシックプラン)
ディスク容量(SSD) | |
OS | CloudLinux |
Webサーバー | Apache + nginx |
サイト数 | 無制限 |
ドメイン | 無制限 |
データベース | MySQL |
データベース数 | 無制限 |
Conoha WING の料金について
Conoha WING は有料のサービスです。
利用料金は利用するプランと支払い方法に応じて増減します。
詳しくは下記のページをご参照ください。
https://www.conoha.jp/wing/pricing/?btn_id=wing-glonavi_pricing
以降の説明では、WINGパックのご契約を前提に解説を行います。
Conoha WING 登録の流れ
Conoha WING における登録の流れについて解説を行います。
1. Conoha にアカウントを登録する
https://www.conoha.jp/wing/?btn_id=top_wing
上記のリンクの「ログイン」ボタンをクリックすると、以下の画面に遷移します。
「新規アカウント登録はこちら」のリンクをクリックしましょう。
以降、画面の指示に従い、会員登録を済ませていきましょう。
Conoha にログインする
会員登録が済んだら、再度以下のリンクから Conoha にログインしましょう。
https://www.conoha.jp/wing/?btn_id=top_wing
ログインが完了すると、Conohaのダッシュボード画面が表示されるので、WING のタブを表示させましょう。
サーバーの追加
追加ボタンをクリックし、サーバーの追加画面に遷移します。
ご希望の契約期間を選択し、任意の初期ドメイン名を入力して「続ける」ボタンをクリックしましょう。
なお、無料独自ドメインを利用できるのは3ヶ月以上の契約期間が前提となるWINGパックのみですのでお気をつけください。
お支払い画面で支払い方法を選択し、決済ボタンをクリックすると、支払いが行われサーバーが追加されます。
独自ドメインの取得を促すポップアップが表示される場合、現時点では取得しないようにしておきましょう。
SSH とは
SSH とは Secure SHell(セキュアシェル) の略で、ネットワーク上のマシンにアクセスして安全に操作するための仕組みです。
SSH を利用することで、自分が直接操作しているコンピュータ(以下、クライアント)から、安全(Secure) にサーバーを操作できます。
通信の暗号化
SSH ではクライアントとサーバーの間の通信が暗号化されます。これにより、サーバーへのログイン情報など、重要な情報が外部に漏れることを防いでいます。
認証方法
SSH でサーバーにログインする際の認証方法は、大きく分けて
- パスワード認証方式
- 公開鍵認証方式
の2種類があります。
公開鍵認証方式では、キーペアと呼ばれる2つのファイルを生成します。このキーペアは漏洩しても問題ない「公開鍵」と呼ばれるファイルと「秘密鍵」と呼ばれる秘匿すべきファイルで構成されます。
公開鍵をサーバーに、秘密鍵をクライアントに保管します。秘密鍵を持っているのは正式なユーザーのみのため、サーバーにログインする際にサーバー側の公開鍵とクライアント側の秘密鍵が一致していれば認証完了です。
秘密鍵ファイルを保持しているユーザーのみログインでき、またその仕組みによって秘密鍵そのものを送信する必要がなくなっている公開鍵認証方式は、パスワードを知っていれば誰でもログインでき、パスワードが盗み見られる可能性があるパスワード認証方式に比べて、より安全であると言われています。
Conoha WING における SSH
Conoha WING ではこの公開鍵認証方式を利用してサーバーにログインする仕組みになっています。
次節で、SSHを利用した具体的なサーバーへのアクセス方法について確認します。
FTPクライアントの使い方
Conoha WING へのファイルの送受信には FTP クライアントを利用するのが便利です。
FTP クライアントとは
FTP クライアントとは、FTP(File Transfer Protocol)と言う仕組みを利用して、ファイルの送受信を行うためのソフトウェアです。
このテキストでは、フリーで利用できる FTP クライアント FileZilla を利用したファイルの送受信方法をお伝えします。
FileZilla のダウンロード
上記のページから FileZilla をダウンロードし、インストールしてください。
ssh キーの生成
画像の指示に従い、「+SSH Key」のボタンをクリックしてください。
新しく作成する SSH キーペアに任意の名前を設定し、保存ボタンをクリックしてください。
ssh キーをダウンロード
保存ボタンをクリックすると、以下のウィンドウが表示されます。
「ダウンロード」ボタンをクリックして、秘密鍵をダウンロードします。
ダウンロードしたファイルは、紛失すると該当のキーペアによる接続ができなくなります。
紛失しない様、大切に保管しておきましょう。
ユーザーディレクトリ直下に .ssh というフォルダを作成してその中に保管するのが一般的です。
また、保存場所に移動後、ssh キーファイルのプロパティを開き、保存場所のパスを確認してメモしておきましょう。
ssh 情報の確認
ダウンロード後、該当のキーをクリックするとそのキーの詳細情報が確認できます。
FileZilla による接続で利用するので、この画面を開いたままにしておきましょう。
FileZilla で サーバーに接続
必要な設定が揃ったので、FileZilla を利用してサーバーに接続しましょう。
FileZillaのウィンドウ左上、サイトマネージャーを開いて以下の様に設定します。
接続ボタンをクリックして、サーバー内のファイル、フォルダの一覧が表示されれば成功です。
エラーが発生する場合は、接続情報の設定に誤りがないか確認してみましょう。
サンプルファイルの作成
FileZillaでの接続に成功したら、サンプルファイルをアップロードして動作確認を行いましょう。
index.php12<?phpecho
'Hello, WING!';
上記のファイルをローカルのエディタで作成もしくは cloud9 上で作成してダウンロードしておきます。
FileZilla でアップロード
右ペインで home/[ユーザー名]/public_html/[ドメイン名] となっているフォルダを選択します。
左ペインで、先ほど準備した index.php を選択して右クリックし、コンテキストメニューからアップロードを選択します。
成功すると、index.php が右ペインに現れます。
動作確認
アップロードが完了したら、Webブラウザから、該当のドメイン
http://設定したサブドメイン名.conohawing.設定したドメイン
にアクセスしましょう。
上記の様に表示されれば動作確認はバッチリです。
データベースの動作確認
つづいて、データベースの動作確認を行いましょう。
データベースの作成
データベースの作成は Conoha ダッシュボードから行います。
サイト管理 > データベースに移動しましょう。
データベース名を「[あらかじめ設定された文字列]_sample」で作成しておきましょう。
ユーザーの作成
続いて、データベースを利用するユーザーを作成します。
ユーザー名、パスワードを設定し、データベースのネームタグを指定したら「保存」をクリックします。
phpMyAdmin にログインする
作成したユーザーを選択し、 phpMyAdmin のリンクをクリックしましょう。
作成したユーザー名・パスワードでログインします。
作成したデータベースを選択し、テーブル messages を以下の設定で作成します。
ひとこと掲示板の動作確認
以下のサンプルを作成して、前回 index.php をアップロードした home/[ユーザー名]/public_html/[ドメイン名] のフォルダにアップロードしましょう。
上部のデータベースの接続情報部分には Conoha の管理画面から
- 接続先ホスト
- データベースユーザ名
- データベースのパスワード
- データベース名
を確認して入力してください。
bbs.php<?php
$host
= '接続先ホスト'; // 接続先ホスト
$username
= 'データベースユーザ名'; // データベースユーザ名
$password
= 'データベースのパスワード'; // データベースのパスワード
$dbname
= 'データベース名'; // データベース名
$charset
= 'utf8'; // データベースの文字コード
$messages
= [];$errors
= [];
// MySQL用のDSN文字列
$dsn
= 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset;
if($_SERVER['REQUEST_METHOD'] === 'POST'){
$name
= ''; if(isset($_POST['name']) === true){
$name
= $_POST['name']; }
$comment
= '';
if(isset($_POST['comment']) === true){
$comment
= $_POST['comment'];
}
if($name
=== ''){
$errors[] = '名前を入力してください';
}
if(mb_strlen($name) > 20){
$errors[] = '名前は20文字以内で入力してください';
}
if($comment
=== ''){
$errors[] = 'コメントを入力してください';
}
if(mb_strlen($comment) > 100){
$errors[] = 'コメントは100文字以内で入力してください';
}
}
try
{
// データベースに接続
$dbh
= new
PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
if($_SERVER['REQUEST_METHOD'] === 'POST'
&& count($errors) === 0){
try
{
$sql
= 'INSERT INTO messages(name, comment) VALUES(?, ?)';
// SQL文を実行する準備
$stmt
= $dbh->prepare($sql);
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $comment, PDO::PARAM_STR);
// SQLを実行
$stmt->execute();
} catch
(PDOException $e) {
echo
'書き込みできませんでした。理由:'.$e->getMessage();
}
}
// SQL文を作成
$sql
= 'SELECT name, comment, created from messages';
// SQL文を実行する準備
$stmt
= $dbh->prepare($sql);
// SQLを実行
$stmt->execute();
// レコードの取得
$messages
= $stmt->fetchAll();
} catch
(PDOException $e) {
echo
'接続できませんでした。理由:'.$e->getMessage();
}
function
h($string){
return
htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>一言掲示板</title>
</head>
<body>
<?php foreach($errors
as
$error){ ?>
<p><?php print
h($error); ?></p>
<?php } ?>
<form method="POST">
<label for="name">名前: </label>
<input type="text"
id="name"
name="name">
<label for="comment">コメント: </label>
<input type="text"
id="comment"
name="comment">
<input type="submit"
value="投稿する">
</form>
<ul>
<?php foreach($messages
as
$message){ ?>
<li>
<?php print
h($message['name']); ?>:
<?php print
h($message['comment']); ?>:
<?php print
h($message['created']); ?>
</li>
<?php } ?>
</body>
</html>
http://[設定したサブドメイン名].conohawing.[設定したドメイン]/bbs.php
にアクセスして、掲示板に書き込めれば、データベースは正しく動作しています。
まとめ
この章では、Conoha WING の利用開始と基本的な使い方について学びました。
レンタルサーバーは、基本的な設定が予め行われているため、スピーディに利用開始できます。
ssh と データベース の設定を理解しておくことでスムーズに初期設定を済ませられるので復習しておきましょう。
ネットワークとセキュティ
この章ではネットワークとセキュリティの基礎知識について学びます。
Webサーバーを利用する際には、ネットワークに関する基礎的な知識が必要になります。
各種設定を単なるおまじないではなく、どのような意味があり、何のために実行しているのかを理解できるようになるため、初歩のネットワーク知識を身につけていきましょう。
また、セキュリティに関連する設定方法についても学んでいきます。
TCP/IPとは
インターネット上でのデータのやりとりに使われるプロトコル(規約、取り決め)がTCP/IPと呼ばれるものです。
パケット通信
TCP/IPの仕組みを理解するためにまずデータの送受信はパケット通信という仕組みで行われていることを理解する必要があります。データをネットワーク上を通じて送信する場合、巨大なファイルをそのまま送信することはできないため、パケットと呼ばれる小さな塊に分割して送信することになります。
パケット(小包)と呼ばれるのは、各パケットがデータの小さな塊と、データの宛先との組み合わせでできていることを意味しています。宛先の書かれた小包によく似ていますね。
TCP
Transmission Control Protocol の略で、データの送受信を制御するためのプロトコルです。パケットは一つの大きなファイルを分割したものです。一つの大きなファイルをどう分割するか、また分割されて送られてきたパケットをどうやって元のファイルに戻すのかが TCP で決められています。
IP
Internet Protocol の略で、ネットワーク間のプロトコルです。一つ一つのパケットをどのような形式にするかを決めているのが IP というプロトコルです。データのどの部分に宛先を示すデータを書くか、宛先はどのような形式で書くかなどが決められています。
まとめ
上記の TCP(ファイルをパケットに分割するときのルール)とIP(パケットを送信するときのルール)を合わせて TCP/IP と呼ばれます。特に IP と言う言葉は耳にする機会が多くなるので意味合いを確認しておきましょう。
サーバーとは
インターネットの仕組みの最大の特徴は「クライアントサーバーシステム」であるということです。
普段何気なく使っている「サーバー」という言葉が本質的に何を表しているのかを学んで行きましょう
クライアントサーバーシステム
インターネットがどういう仕組みであるかを正しく理解するために重要なのはこのクライアントサーバーシステムという概念です。
クライアントサーバーシステムとは文字通り「クライアント」と「サーバー」によって構成されるシステムです。
サーバーの由来
サーバー(Server)とは元々英語で「給仕人」のことで、いわゆる執事をイメージしていただくと良いでしょう。24時間不眠不休でクライアントから要求(リクエスト)を出されるのを待ち続けるプログラムです。
サーバーは普段は待ち受け状態ですが、リクエストを受けると必要な仕事を行い、その結果をクライアントに返信(レスポンス)します。
クライアントとは
クライアントとは「依頼人」のことで、いわゆるご主人様をイメージすると良いでしょう。クライアントは必要に応じてサーバーにリクエストを行い、返ってくるレスポンスを受け取ります。
インターネットアプリケーションの基本はクライアントサーバーシステム
この、クライアントサーバーシステムがインターネット上のアプリケーションの基本です。
例えばWebの仕組みの場合にはクライアントに当たるのはWebブラウザです。
例えばChromeのようなWebブラウザにURLを入力すると、該当するサーバーにリクエストが送られて、結果としてWebページのデータがレスポンスとして返って来ます。
この時、あらかじめ用意してあるファイルをそのままレスポンスとして渡すのがWebページ、サーバー上のデータを操作して、その結果をレスポンスとして渡すのがWebアプリケーションということになります。
サーバーという言葉が意味するもの
サーバーは元々上記の様な働きをするプログラムを指し、別名デーモンとも呼ばれます。Webブラウザからのリクエストを待ち続ける Web サーバープログラムや、SSHクライアントからのリクエストを待ち続けるSSHサーバー(sshd)などが挙げられます。
しかし、一般にはこのサーバープログラムが稼働しているマシンそのものもサーバーと呼ばれることがあるので、どちらの文脈で「サーバー」ということがが使われているか注意する必要があります。
IP アドレスとは
IPアドレスとはIPパケットを送受信する宛先を示す番号です。
IPV4とIPV6と言う2つのプロトコルがあります。
IPV4は32ビットの数値、IPV6は128ビットの数値で一つのアドレスを表します。ここでは基本的なIPV4の仕組みについて説明します。
IPV4
IPV4では32ビットを8ビットずつ4つに分割し0-255までの10進数4つをドットで連結した形式(ドットアドレス)で表現するのが一般的です。
例) 192.168.0.1
最上位のビットに近い側をネットワーク部、最下位のビットに近い部分をホスト部と呼びます。どの部分までがネットワーク部でどの部分までがホスト部を示すかについては、以前はアドレスクラスというもので決められていたが、現在は可変長サブネットマスクやCIDR(Classless Inter-Domain Routingの略, サイダーと読む)の使用が一般的です。
ドメインとは
IPアドレスは意味を持たないため、人間にとって覚えにくいものです。
そこで、人間が意味を理解できる単語などでIPアドレスにドメイン名という別名をつけることが可能です。スマートフォンの電話帳において電話番号と個人名などが結びつけられているのと同じ様に、IPアドレスはドメイン名と結びつけられています。
例えばウィキペディアのIPアドレスは198.35.26.96です。しかし単なる番号の羅列は覚えづらく、不便です。
そこで、このIPアドレスに wikipedia.org という別名をつけることで番号の羅列を記憶しなくてもwikipediaのwebサイトにアクセスできるようになっています。
ドメインの取得と仕組み
ドメイン名は世界中で絶対に重複しないようになっています。
DNS(Domain Name System)によってドメイン名とIPアドレスの正引き、逆引きが行われています。
ドメイン名はICANN(Internet Corporation for Assigned Names and Numbers)という組織によって一元管理されています。
- 先願主義
- whois情報の公開
- 商標権者優先
などのルールがあります。
ドメインの取得
ドメインは、レジストリとレジストラと呼ばれる組織によって取り扱われています。それらの役割分担について確認し、私たちがドメインを取得するためにはどの様な組織に何を依頼するのか確認しておきましょう。
レジストリとは
レジストリとは NIC(Network Information Center)とも呼ばれるトップレベルおよびセカンドレベルのドメイン名のデータベースを維持管理する組織です。
.com や .net 、 .jp などのドメインによってレジストリは異なります。例えば .com / .net は VeriSign という組織によって管理されています。
レジストラ
レジストラとはレジストリと契約しドメイン登録の業務を行う業者です。ICANNによって認定されています。
私たちがドメインの取得手続きを申し込むのはこのレジストラになります。多くのレジストラは複数のレジストリから提供されるドメイン名を扱っています。
例えるならば、携帯電話のキャリアがレジストリにあたり、代理店がレジストラにあたるというイメージを持っておくと良いでしょう。
私たちが携帯電話を契約する時には通常メーカーではなく代理店に対して申し込む様に、ドメイン名を取得するにレジストラに対して申し込むことになります。
- お名前.com
- バリュードメイン
- ムームードメイン
など様々なレジストラがあり、それぞれに独自の料金設定があります。
WINGにおけるドメイン名の登録
Conoha WING では、 WING パックで契約を行った場合、独自ドメインを1つ無料で取得できます。
この節では WING での独自ドメイン取得手続きについて解説します。
新規ドメインの取得
Conoha ダッシュボードの左メニュー「ドメイン」をクリックすると、以下のウィンドウが表示されます。
追加する、をクリックしてください。
取得したいドメイン名が利用可能かどうかを検索できる画面になるので、取得したいドメイン名を入力し、虫メガネのアイコンをクリックします。
チェックマークと「カートに追加」ボタンが表示されているドメイン名は利用可能です。
ドメイン名を決めたら、「カートに追加」ボタンをクリックし、「追加済み」と表示されたら「次へ」をクリックしましょう。
申し込み画面が表示されるので、各種情報を入力し、「次へ」をクリックしましょう。
上記の画面で、取得したいドメイン名に誤りがないことを確認し、「決定」ボタンをクリックするとドメインの取得が行われます。
自動的にドメインリスト画面に遷移し、取得したドメイン名が表示されます。
サーバーにドメインを追加
続いて、サーバーにドメインが追加されていることを確認します。
左メニューから「サーバー管理」 > 「ドメイン」をクリックします。
表示されるドメインリストに取得したドメイン名が含まれていれば、正しく追加されています。
FileZilla から確認
FileZilla で、 home/[ユーザー名]/public_html/ を確認すると home/[ユーザー名]/public_html/[取得したドメイン名] というフォルダが確認できます。
該当のフォルダが確認できれば、ドメイン取得関連の処理は完了です。
home/[ユーザー名]/public_html/[取得したドメイン名] にテスト用のファイルをアップロードし、
http://[取得したドメイン名]/[テスト用のファイル名]
にアクセスして、表示を確認しておきましょう。
ただし、設定したドメイン名が反映されるまでにしばらく時間がかかります。表示されない場合は 15分から1時間程度待って確認すると良いでしょう。
(FileZilla の使い方に忘れている場合は、 1-6 FTPクライアントの使い方 1-7 サンプルファイルの作成を参考にしてみましょう。)
DNS とは
IPアドレスとドメイン名の相互変換を行うサーバープログラムがDNSサーバーです。
ドメイン名からIPアドレスを調べることを正引き、IPアドレスからドメイン名を調べることを逆引きと言います。
例えば、Webブラウザのアドレスバーにドメイン名を打ち込むと、まずはその情報がDNSサーバーに送信され、対応するIPアドレスが取得されます。
取得したIPアドレスを利用して初めて該当のWebサーバーにアクセスできる仕組みになっています。
Conoha WING における DNS サーバー
Conoha WING の WING パックで独自ドメインを取得した場合、自動的に DNSサーバーが設定されています。
設定を確認してみましょう。
上記の様な形式で設定されています。(各レコードの意味合いについてはこのテキストでは割愛します。)
HTTPS と SSL
新規作成した独自ドメインは、現時点では暗号化通信ができない状態になっています。
暗号化通信を可能にするためには、SSLの設定を行い https でのアクセスを可能にする必要があります。
SSL とは
Secure Sockets Layer とは、通信内容を暗号化する仕組みです。公開鍵暗号を応用して、受信者のみが復号できる暗号化を施すため、パケット通信の内容が盗み見られたとしても、元の情報を読み取ることはできなくなります。
HTTPS とは
HTTPS とは Hypertext Transfer Protocol Secure の省略系で、HTMLなどの通信に使われるデータを暗号化する安全な通信規約のことです。
HTTP では通信データは平文、すなわち暗号化されていないそのままのテキストデータで送受信されているのに対して、 HTTPS では通信データが暗号化されます。
この暗号化の際に、前述の SSL が利用されます。
URLの最初の部分が http:// から始まっていれば HTTP による通信、 https:// から始まっていれば HTTPS による通信です。
Conoha WING における HTTPS
HTTPS を利用するためには各種のSSL設定が必要になります。
Conoha WING においては、あらかじめ設定されている xxxx.conohawing.com ではHTTPS が利用できますが、取得した独自ドメインでは SSL 設定を行って初めて HTTPS が利用できます。
SSL証明書の取得
それでは、Conoha WINGにおけるSSL証明書の取得方法を確認しましょう。
まず、サイト管理 > サイトセキュリティ を選択して 「切り替え」ボタンを押すと、設定対象のドメインを切り替えられます。
作成した独自ドメインの「切り替え」ボタンをクリックすると、画面遷移するので、再度 サイトセキュリティ画面に移動します。
無料独自SSLを展開して、利用設定を ON にします。
これで、SSLの設定が完了します。
これで、しばらく(数時間から1日程度)待つと
で独自ドメインにアクセスできる様になります。
通信は暗号化される様になりました。これで SSL の設定は完了です。
ポートとは
ポートとは、ネットワーク上におけるコンピュータの受付窓口の様なものです。
ポートには 0 から 65535 までのいずれかの数値が割り振られています。これをポート番号と呼びます。
まずは市役所の窓口のようなものが0番窓口から65535番窓口まである様なものだと思っていただけると良いでしょう。
ポート番号
上述の通り、各ポートに割り振られた番号をポート番号と呼びます。これらの窓口では、各サーバープログラムがリクエストを待ち続けることになります。
市役所の窓口に、各受付担当が配属されているのと同じ様なイメージです。
ウェルノウン(よく知られた)ポート
ウェルノウンポート とは、各サービスごとのよく利用されるポート番号のことです。
ウェルノウンポートには 0 〜 1023番のポートが利用されています。
- Webサーバー(HTTP): 80番ポート
- Webサーバー(HTTPS): 443番ポート
- SSHサーバー: 22番ポート
といった様に、各サーバープログラム(サービス)ごとにポート番号が設定されています。
ウェルノウンポートを利用するのは必須ではありません。
「このマシンでは8080番を Webサーバー(HTTP) の窓口にしよう!」
といったことも可能です。
ファイアウォールとは
ファイアウォールとは、各ポートに対して行われるアクセス制限をおこなうソフトウェアです。火事の被害を防ぐための防火壁の様に、特定のポートに対するアクセスを遮断する役割を果たします。
アクセス元の制限
例えば社内でファイルの共有を行う場合にはLAN経由で同僚のマシンから自分のマシンのポートに対してアクセスが行われることになります。
この時、「社内LANではファイルの共有を受け付けたいが、インターネットからこのファイルに不特定多数の方にアクセスされるのは困る」というケースが発生します。
その場合に、このファイル共有で利用するポートについて
- 社内LAN: アクセスを受け付ける
- インターネット: アクセスを受け付けない
などの設定ができるのがファイアウォールと呼ばれるソフトウェアです。
自分自身のみがアクセス
前述のポートはざっくりと3種類のネットワークに対して開かれています。自分自身とLANとインターネットです。
例えば、Webページの開発を行う時には、Webサーバーを立ち上げて自分自身だけがアクセスできる様にしておくことが多くなります。
この場合、LANに対してもインターネットに対してもアクセスを受け付けない様に設定しておくのが望ましいです。
LANからのみアクセス
前述の社内ファイル共有の様なケースでは、
- LAN: アクセスを受け付ける
- インターネット: アクセスを受け付けない
という設定をするのが望ましくなります。
インターネットからアクセスを受け付ける
自分自身で Web サーバーを立ち上げてサイトを公開する場合には、該当のポートについて、インターネット上からのアクセスも受け付けることになります。
オンラインゲームなども、各ゲームサーバーから自分のマシンへの通信を受け付ける必要があるので、インターネット上からのアクセスを受け付ける必要が出てきます。オンラインゲームを利用する時にポート開放手続きを求められるケースがあるのはこのためです。
不要なポートを閉じる
ポートは0番から65535番までありますが、全てのポートが利用されていることはまずありません。その場合、そもそも利用しないポートが大量に存在します。いわば、受付がいない窓口が大量にあるということになります。
このときに、利用していないポートは閉じておくことが重要です。
そもそもネットワーク上からアクセスする必要があるポートはごくわずかです。
基本的には全てのポートをLANからもインターネットからもアクセスできない様に設定しておき、通信が必要なポートのみ、必要な対象(LAN or インターネット)からのアクセスを受けつける様に設定しておくのが望ましくなります。
IP制限
インターネット上からアクセスを受け付ける場合も、インターネット上の特定のコンピュータからアクセスを受け付けたい場合もあります。
その場合に利用されるのがIP制限です。
インターネット上の特定のコンピュータは IP アドレスによって識別できるので、
- 開発者AのIPアドレスからはアクセスを受け付ける
- それ以外のIPアドレスからはアクセスを受け付けない
の様な設定が可能です。これにより、インターネットを通じて開発者Aさんは様々なところからアクセスできるが、それ以外の人のアクセスは受け付けない、といった使い方ができる様になります。
また、Webサーバーを公開しているが、特定の迷惑ユーザーからのアクセスのみ遮断する、といったことも可能です。
WAFの設定
Conoha WING では WAF(Web Application Firewall) と呼ばれる、Webアプリケーションのセキュリティに特化したファイアウォールを利用できます。
WAF とは
WAFはファイアウォールの一種ですが、単に特定のネットワークからのアクセスを制限するだけでなく、特定の通信パターンを認識し、攻撃であると認識してポートを遮断する機能を持っています。
これにより、悪意を持ったユーザーからのアクセスを動的に遮断できます。
WAF の必要性
上記の機能は Web アプリケーションにとってとても重要です。Webアプリケーションには多かれ少なかれ何らかの脆弱性を抱えていることが多く、悪意を持ったユーザーはそれを探し出して攻撃してきます。
Webアプリケーションは、インターネットを通じて不特定多数からのアクセスを受け付ける必要があるのであらかじめアクセスを遮断することは困難です。
WAFでは、様々な脆弱性に対する典型的な攻撃のパターンを認識し、それらのパターンを認識次第該当の通信を遮断します。そして、攻撃として認識するパターンは日々更新され新たな攻撃にも対処できる様になっています。
Conoha WING における WAF の設定
Conoha WING では サイト管理 > サイトセキュリティ から WAF の設定が可能です。
WAF をON にするだけで上記の機能が有効化されます。
まとめ
この章では、基本的なネットワーク用語とセキュリティの基礎的な考え方について学びました。
今回取り上げた内容は、Webアプリケーションの公開には切っても切れない必要不可欠な部分になります。
世界中の誰もがアクセスできる Web アプリケーションは、いわば往来のど真ん中に自動販売機をおく様なもので、厳重なセキュリティを施さなければ容易に攻撃の対象となってしまいます。
とくに、ログインが必要なアプリケーションの場合、つねに個人情報を守る必要があります。単にサービスにアクセスするために任意に設定したパスワードさえ、同じユーザーが複数のサービスで使いまわしている可能性があるので個人情報ととらえることができます。
サーバー利用の際の基礎知識をしっかり身につけ、各設定項目の意味合いを理解できる様に知識を広げていきましょう。
この章で学ぶこと
この章では Conoha WING や AWS Cloud9 で利用されている Linux の使い方について学びます。
Linux ではシェルと呼ばれる各種コマンドを受け取る仕組みを通じてコンピュータを操作します。
今回はその中でも広く利用されている bash のコマンドについて解説します。
学習の全体像
リポジトリのクローン
課題用リポジトリをクローンします。
GitLab の画面左上「プロジェクト」を開き、 laravel を選択しましょう。
クローンのボタンを押して「HTTPSでクローン」のコピーボタンをクリックするとクローンURLがクリップボードにコピーされます。
cd
~/environmentgit clone [フォークしたリポジトリでクローンurlを確認]
各種ファイルのダウンロードが終わるまでしばらく待ちましょう。
Laravelの初期設定
つづいて、clone した Laravel プロジェクトを動作させるための初期設定を行います。
セットアップ
下記の setup.sh を新規作成し、以下の内容をコピー & ペーストしてください。
(講師注: Amazon Linux 2 用のインストールスクリプトです。)
#!/bin/bash
# PHP 7.2 を削除
# sudo yum remove php*
# lamp-mariadb10.2-php7.2 を無効化
# sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2
# 利用するphpのバージョンを7.4に切り替え
sudo
amazon-linux-extras disable php7.2
sudo
amazon-linux-extras install
-y php7.4sudo
yum clean metadata && sudo
yum -y install
php-devel php-xml php-gd php-intl php-mbstring php-opcache php-xmlrpc
# タイムゾーンの設定
sudo
timedatectl set-timezone Asia/Tokyo
# ロケールの設定
sudo
localectl set-locale LANG=ja_JP.utf8
# PHPの設定ファイルを追加
sudo
echo
"date.timezone = Asia/Tokyo"
|sudo
tee
/etc/php.d/999-php-codecamp.inisudo
echo
"display_errors = On"
|sudo
tee
-a /etc/php.d/999-php-codecamp.inisudo
echo
"mbstring.internal_encoding = UTF-8"
|sudo
tee
-a /etc/php.d/999-php-codecamp.ini
# MariaDB をインストール
sudo
amazon-linux-extras install
-y mariadb10.5
# mariadb を起動
sudo
systemctl start mariadb
# 自動起動設定
sudo
systemctl enable
mariadb
上記を保存して、
bash
setup.sh
を実行するとインストールが開始されます。終了までしばらく待ちましょう。
mariadb の設定
sudo
mysql_secure_installation
上記のコマンドを実行し、mariadb のセキュリティ設定を行います。
上記の画面で root ユーザーの現在のパスワードを求められるので、そのまま Enter を押します(現在のパスワードは空白)
続いて、上記の画面で unix ソケットの設定について聞かれます。こちらは n を入力して Enter を押します。
root ユーザーのパスワードを変更するかと聞かれるので Y を入力して Enter を押します。
パスワードの入力は、入力した文字列が表示されません。「secret」とキー入力して Enter を押すと再度パスワード入力を求められるので、 もう一度「secret」とキー入力して Enter を押します。
匿名ユーザーを削除するか聞かれます。セキュリティ上削除すべきなので、 Y を入力して Enter を押します。
現在利用している仮想マシン以外からのアクセスを禁止するか聞かれます。Y を入力して Enter を押します。
test という名前のテスト用データベースを削除するか聞かれます。Y を入力して Enter を押します。
最後に設定変更を反映させるために、特権テーブルの再読み込みを行うか聞かれます。Y を入力して Enter を押します。
以上で初期設定は完了です。
接続確認
最後に、正しく設定できているか確認するため、データベースに接続確認しておきましょう。
mysql -u root -p
と入力し、パスワードを聞かれるので「secret」と入力して Enter を押します。
上記の画面が表示されれば確認完了です。
exit;
で画面を抜けましょう。
composer のインストール
Laravel は composer と呼ばれる PHP の各種ライブラリをインストールするツール(パッケージマネージャ)を利用してインストールします。
curl -sS https://getcomposer.org/installer
| php
cloud9 のターミナルから、上記のコマンドを実行すると、composer がインストールされます。
composer のインストール位置を変更
composer のインストール先を現在のディレクトリから /usr/bin/ というディレクトリに移動させます。
sudo
mv
composer.phar /usr/bin/composer
これで composer を利用する準備は完了です。
composer の起動テスト
composer
上記のコマンドを実行して、各種コマンドの一覧が表示されればインストール成功です。
隠しファイルの表示
画面左の歯車マーク(画像参照)をクリックし、「Show Hiddwn Files」にチェックを入れます。
これにより、隠しファイルが表示されるようになります。
laravel フォルダを右クリックし、コンテキストメニューから 「Refresh」を選択して表示を更新しておきましょう。
.env.example から .env を作成
以降の操作はクローンした laravel ディレクトリで行います。
cd
~/environment/laravel/
で該当のディレクトリに移動し、
cp
.env.example .env
上記のコマンドで .env.example から .env を作成しておきましょう。
.envの修正
つづいて、laravelの環境設定ファイルとなる隠しファイル .env を修正します。
.env(省略)DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=Laravel
DB_USERNAME=root
DB_PASSWORD=secret
上記のDB_CONNECTION=mysql から始まる行をさがして、 DB_DATABASEとDB_PASSWORDの値を上記のように編集して保存すれば完了です。
composer で必要なファイルをインストール
composer install
上記のコマンドを実行するだけで自動的に必要なライブラリがインストールされます。
アプリケーションキーの初期化
php artisan key:generate
上記のコマンドで、 Laravel が各種暗号化に利用するアプリケーションキーが作成されます。
このコマンドを忘れると動作しないので気をつけましょう。
データベースの初期設定
続いて、データベースの初期設定を行いましょう。
データベースにログイン
mysql -u root -p
上記のコマンドを実行すると
Enter password:
と聞かれますので「secret」と入力し、Enter キーを押すとログインできます。
データベースの作成
続いて
CREATE
DATABASE
laravel;
上記の内容を入力して Enter キーを押すと、「laravel」という名称のデータベースが作成されます。
作成したデータベースの確認
では、正しくデータベースが作成できたか確認しておきましょう。
SHOW DATABASES;
データベースの一覧が表示されますので、その中に先ほど作成した
laravel
が存在していれば OK です。
SQL の入力画面から抜ける
これでこのプロジェクトで利用するデータベースの作成が完了しました。
exit;
上記を実行すると通常のターミナルに戻ります。
以上でデータベースの設定は終わりです。
データベースのマイグレーション
Laravel では、データベースの更新履歴をマイグレーションファイルとして残しているため、クローンしたリポジトリに合わせたテーブルの作成が一瞬でまとめて実行できます。
php artisan migrate
上記のコマンドを実行すると、元のリポジトリで実行されていた全てのマイグレーションがまとめて実行されます。
マイグレーションファイルの意義を際確認しておきましょう。
seed データの投入
Laravel では seed という仕組みを利用することで、データベースの初期データを投入できます。
php artisan db:seed
上記のコマンドを実行すると、Seeder クラスの処理が実行されて、初期データが投入されます。
以下の UsersTableSeeder と PostsTableSeeder クラスの run メソッドの内容を確認しておきましょう。
database/seeds/UsersTableSeeder.phppublic
function
run() {
$users
= [
[
'id'
=> 1,
'name'
=> 'admin',
'password'
=> 'admin',
'admin'
=> 1,
],
[
'id'
=> 2,
'name'
=> 'testuser1',
'password'
=> 'password',
'admin'
=> 0,
],
[
'id'
=> 3,
'name'
=> 'testuser2',
'password'
=> 'password',
'admin'
=> 0,
],
];
foreach($users
as
$user){
DB::table('users')->insert($user);
}
database/seeds/PostsTableSeeder.phppublic
function
run() {
$posts
= [
[
'user_id'
=> 1,
'comment'
=> 'こんにちは!管理者です。',
],
[
'user_id'
=> 1,
'comment'
=> 'こんばんは!管理者です。',
],
[
'user_id'
=> 1,
'comment'
=> 'おはようございます!管理者です。',
],
[
'user_id'
=> 2,
'comment'
=> 'こんにちは。',
],
[
'user_id'
=> 2,
'comment'
=> 'こんばんは。',
],
[
'user_id'
=> 2,
'comment'
=> 'おはようございます!',
],
];
foreach($posts
as
$post){
\App\Post::create($post);
}
}
動作確認
最後に、各画面の動作確認を行いましょう。
php artisan serve --port=$PORT
上記のコマンドで Laravel の開発用サーバーを立ち上げて、各画面を確認しましょう。
1. ログイン画面
作成中!!!
2. サインアップ画面
3. 一覧画面
4. 新規投稿画面
5. 投稿編集画面
6. プロフィール編集画面
デプロイ方法
この章では、Laravel で作成したWebアプリケーションのデプロイ方法を学びます。
デプロイとは、開発環境で制作しているアプリケーションを、本番環境で公開することです。
公開するための方法はいくつかありますが、今回はリモートリポジトリに push した環境を、本番環境で clone してから公開用の各種設定を行う流れで実施します。
リポジトリの準備
まずは、ここまで作成したリモートリポジトリについて、デプロイの準備を整えます。
今回は、ここまでプルリクエストをマージしてきた develop ブランチを開発環境用とし 、 master ブランチの内容を本番環境に反映させることとします。
ここまで develop にマージしてきた内容を本番環境に反映させるため、あらかじめ develop ブランチを master ブランチにマージするプルリクエストを発行して、マージしておきましょう。
リポジトリのclone
続いて、リポジトリの clone を行います。
ssh での接続
ssh を利用して Conoha WING のサーバーに接続します。
Cloud9 に ssh キーをアップロード
まず、以前に Conoha WING からダウンロードした ssh用の秘密鍵を AWS Cloud9 にアップロードします。
まず、ドラッグ & ドロップでエディタ上のトップ階層(~/environment/)にアップロードしましょう。
続いて ~/.ssh というフォルダに mv コマンドで移動させて、chmod コマンドでパーミッションを600にしておきましょう。
ssh コマンドで Conoha WING に接続
ssh
-i ~/.ssh/[秘密鍵のファイル名] -p [sshのポート番号] [sshユーザー]名@[サーバーのドメイン名]
上記のコマンドを実行すると、Cloud9 から Conoha WING のサーバーにログインできます。
composer のインストール
続いて、composer をインストールします。
curl -sS https://getcomposer.org/installer
| php
上記のコマンドで composer をインストールし、
./composer.phar self-update
上記のコマンドでアップデートを確認しておきましょう。
クローン先のフォルダを作成
続いて、クローン先のフォルダを作成します。
mkdir
~/laravel_projects
作成したらこのフォルダに移動しておきましょう。
cd
~/laravel_projects
git clone を実行
続いて、
git clone laravel のクローンURL
を実行し、このフォルダ内にリポジトリがクローンされれば準備完了です。
本番環境の設定
つづいて、クローンした Laravel プロジェクトが動作するように各種設定を行いましょう。
データベースの作成
Conoha WING の 管理画面にアクセスして、1-8 を参考に [接頭辞]_production という名前のデータベースを作成しておきましょう。
このデータベースが本番環境で利用されるデータベースになります。
また、データベースユーザーの接続先データベースに、新しく作成したデータベースを追加しておきましょう。
.env ファイルの修正
続いて、.env ファイルを修正します。
cd
development_sample
まず上記のコマンドでプロジェクトフォルダに移動して、
cp
.env.example .env
上記のコマンドで .env を .env.example からコピーし、
DB の接続情報を Conoha WING における
- データベースのホスト名
- データベースユーザーのユーザー名
- パスワード
- データベース名
に修正しておきます。
1 章の動作確認で利用した bbs.php を参考にすると良いでしょう。
修正の際には vim を利用しましょう。
必要なライブラリのインストール
続いて、php 関連のライブラリをインストールしましょう。
~/composer.phar install
上記のコマンドで、プロジェクトで利用される各種 php 系のモジュールが vendor フォルダにまとめてインストールされます。
アプリケーションキーの初期化
php artisan key:generate
上記のコマンドで、 Laravel が各種暗号化に利用するアプリケーションキーが作成されます。
このコマンドを忘れると動作しないので気をつけましょう。
本番データの投入
続いて、作成した環境に必要なテーブルとレコードを投入しましょう。
マイグレーションの実行
まず、マイグレーションを実行します。
php artisan migrate
上記のコマンドを実行します。
接続情報が正しく設定されていれば、今回のプロジェクトで利用されるテーブルがまとめて設定されます。
さらに、
php artisan db:seed
上記を実行して、シードデータをデータベースに投入しておきましょう。
動作確認
最後に、
cd
~/public_html/[独自ドメイン名]
でドメインのルートディレクトリに移動し、
rm
index.php
で確認用のphpファイルを削除し、
ln
-s ~/laravel_projects/development_sample/public/index.php index.phpln
-s ~/laravel_projects/development_sample/public/css
./css
として、シンボリックリンクを張りましょう。
これにより
「独自ドメインの index.php にアクセスすると、自動的に Laravel プロジェクトの public/index.php にアクセスしていることになる」
という状況にします。
.htaccess の書き換え
続いて、全てのアクセスを public/index.php でうけるために .htaccess の追記を行います。
~/public_html/[独自ドメイン名] のフォルダで
vim .htaccess
として、 .htaccess のファイルを書き換えます。
.htaccess<IfModule mod_rewrite.c>
RewriteEngine On RewriteCond %{REQUEST_FILENAME}
!-f RewriteRule ^ index.php [L]
</IfModule>
こちらを保存して完了です。
本番環境の更新
本番環境の更新を行う場合には 該当のプロジェクトフォルダで git pull を実行します。
- 開発環境で修正や機能追加をおこない、プルリクエストを通じてdevelop にマージしておく
- 本番環境を更新するタイミングで、develop ブランチを master ブランチにマージ
- 本番環境で git pull を実行し、更新を反映させる
- マイグレーションが更新されている場合は、本番環境で再度 php artisan migrate を実行する。
以上が基本的な本番環境の更新の流れとなります。
まとめ
この章では、開発環境から本番環境へのデプロイの流れについて確認できました
がんばってプログラミングを学習していきましょう