エンジニアHubPowered by エン転職

若手Webエンジニアのための情報メディア

今日からはじめる休日個人開発 〜 クラウドサービスの選定から、WebサーバでPHPを動かすまで

プライベートで何か開発していますか? 個人で休日に気軽に何かを作ってみよう! という企画をスタートします。

皆さん、プライベートで何か開発していますか?「何か作りたい」という気持ちはあるものの、いまひとつ何から始めたらいいのか分からず、動けないままの人も多いと思います。

そんな皆さんのために、仕事以外にも休日に個人で気軽に何かを作ってみよう! という企画をスタートします。今回は、OSをインストールしたてのクラウドサーバを、プログラムが実行できるWebサーバとして動かすまでの手順を解説します。

個人で開発するときの実行環境を選ぶ

現在では、個人で開発したプログラムの実行環境も、用途にあった形で選ぶことができます。物理的にサーバを借りるものから、クラウドで環境を借りるものまでさまざまです。以下のような環境が考えられるでしょう。

ローカル サーバを用意せず、手元にあるマシンを利用して開発を行う。自分だけが使用するツールの開発であればこのパターンでまかなえる。ただし、サービスを外部に提供したい場合には、開発はローカルで実施したとしても、公開は下記のいずれかの環境で行うのが一般的。
オンプレミス 物理サーバを自前で用意してサービスを提供する。空調管理に気を付けたり、グローバルIPを準備したり、手間やコストはかかるが、ネットワークからサーバまでの環境を物理的にも閉じることができるので、きちんとした環境を準備できればセキュリティ面や安定運用の面のメリットがある。
レンタルサーバ 共有型のレンタルサーバでは、CPUやメモリなどを複数のユーザと共有して利用する。そのため、他のユーザの影響を受けやすい。OSの管理者権限がないので、サーバの知識がなくても利用できるが、ユーザ権限のみで操作可能なことしかできない。また、それもWebに関わる部分が中心であり、用途がWebサービスに限られることも多い。
VPS サーバは共有だが、仮想化技術によってサーバ内に専用マシンが用意される。OSの管理者権限もある。CPU・メモリ・ストレージはあらかじめ指定した分が分割され、運用中のリソースの調整ができない。
クラウド VPSと同様に、仮想化技術による専用マシンが共有サーバ内に用意され、OSの管理者権限もある。CPU・メモリ・ストレージなどのリソースをその時々で調整して、必要なパフォーマンスを得ることが可能。

個人開発ならばクラウドがおすすめ

休日に個人で開発するのであれば、クラウドがおすすめです。各社からお手頃な価格帯のプランが提供されており、簡単に導入ができます。

現在主流になっているクラウドは、サービスを提供する方法によって、IaaSPaaSSaaSなどに分類できます。利用目的により、最適なサービスを選ぶことが大切です。

下の図では、それぞれの種類のクラウドサービスがカバーする範囲を青色で表示しています。用途に合わせたサービスを使うことで、利用者の負担を軽減できます。

クラウドサービスのカバー範囲

それぞれのサービスには、次のような特徴があります。

IaaS(Infrastructure as a Service)

アプリケーションの稼動に必要な仮想サーバやネットワークなどのインフラを、インターネット上のサービスとして提供するサービスのことです。サーバ、ストレージ、ネットワーク環境など、必要な規模に応じてサービス料を支払って利用します。

必要なハードウェアのスペックやOSを開発者自身が選定できるため、自由度が高いです。

例:Google Compute Engine、Amazon EC2(Elastic Compute Cloud)

PaaS(Platform as a Service)

アプリケーションソフトウェアを稼動するための土台となるハードウェアやOSなどのプラットフォーム一式を、インターネット上のサービスとして提供するサービスのことです。PaaSは、インフラ・DBMSなどのシステムを運用するための環境も備えており、開発者はプラットフォーム上にサービスを開発していきます。

IaaS環境に比べ、スケーラビリティや生産性の面で開発者の負担を減らすことができます。

例:Google App Engine、Heroku

SaaS(Software as a Service)

インターネット経由でソフトウェア・サービスを利用できるサービスのことです。利用者はプログラミングをしたりソフトウェアをインストールしたりする必要がなく、必要な機能を選んで利用できます。

使いたいタイミングに必要な分だけ利用すればよいため、サーバの導入や構築・管理にかかるコストを抑えられます。

例:Google Apps、Salesforce、GitHub

クラウドサービスの選び方

SaaSであれば、必要なものを選定して、組み合わせてサービスを利用できます。PaaSであれば、ちょっとしたスクリプトを動かしたい場合に、環境構築のコストを削減して実装ができます。IaaSは自由度が非常に高いですが、自分自身で環境構築を行う必要があります。

これらの特徴を考え、サービスを開発する際に必要な環境を選びましょう。

クラウドが登場する以前は、今でいうIaaSのように「開発時には環境構築をするのは当たり前」という環境でした。最近では、ハードウェアやOSの管理までをプラットフォームとして提供するPaaSの登場により、開発者はアプリケーション開発のみに専念できることも多くなりました。

環境の初期構築や、サービスを運用しながら日々脆弱性対応でOSやソフトウェアの更新をするのは手間がかかります。あらかじめプラットフォームが用意され、メンテナンスもやってくれたら、開発者はアプリケーションの開発に専念できるよね、という考えです。

IaaSのサービスを選んで、サーバを構築しよう

今回はあえてIaaSを選択し、OSがインストールされただけの状態からWebサーバを構築してみようと思います。

Webアプリケーションを開発するフロントエンドエンジニアであっても、サーバやインフラの知識は、あればあるだけ役に立ちます。何かトラブルが発生した場合に、サーバがどのように動いているのか、ネットワークはどのように設定されていて何を確認すればよいのか、などの知識が必要になることがあります。

自分が動かすアプリケーションがどのような場所で動いているのかを理解するためにも、サーバを構築する経験はよい勉強になります。私も学生時代に各種サーバやネットワークの構築・運用をしたことで、いろいろな幅広い知識を学べました。そして、その経験は就職後にも役立っています。

サービスを選ぶ際にチェックしたいポイント

サービスを探しているときに、月々100円程度の非常に安いプランを見かけることもあるでしょう。しかし、それらはSSHログインできないレンタルサーバという可能性もあるので注意してください。

少し奮発してでもSSHログインに対応しているIaaSプランを選ぶことをおすすめします。実際にログインして、サーバでいろいろと構築や設定をすることが、勉強になるからです。

料金体系には、月額課金のものと従量課金のものがあります。従量課金の場合、利用状況により請求額が変わってしまい、場合によっては高額になることもあります。まずは分かりやすい月額課金の定額サービスを使ってみるのがよいでしょう。月々500円程度で利用できるプランもあります。

IaaSを提供している主なサービスを、以下に挙げました。掲載したリンクから、特徴や料金をいろいろと見比べてみてください。キャンペーンバナーに目を向ければ、新規登録者のために無料のお試しキャンペーンやクーポンなどが用意されていることもあります。

IaaSを提供しているサービスの例

これらのサービスではクーポンなどが用意されていて、クラウドを無料で試してみることができます。ただし、無料であってもクレジットカードの登録が必要になることがあります。無料期間終了後の継続課金などについては、各サービスのドキュメントを参照してください(※情報は記事執筆時点のものです)

IDCFクラウド(IDCフロンティア)
Amazon EC2(Elastic Compute Cloud)
Google Compute Engine

アカウントの登録とOSのインストール

利用するサービスを決めたら、アカウントを登録します。

具体的なサインアップの手順については、サービスによって異なるので本稿では割愛します。メールアドレスとクレジットカードがあれば、各サービスに用意されたドキュメントをもとにサインアップできるでしょう。

登録後には、サーバのインスタンスの作成を行います。他にも、ネットワークやIPアドレス、ファイアウォールの設定などが必要になることがあります。こちらも、各サービスで用意されたドキュメントを確認してください。

どのサービスでもコントロールパネル(ダッシュボードやコンソールと呼ばれることもあります)から、簡単にサーバのインスタンスが作成できるかと思います。これもIaaSの恩恵です。クラウド以外でOSをインストールしようとすれば、ISOイメージをダウンロードするところから始めないといけません。IaaSであれば、使いたいOSの種類やバージョンを選択していくだけで、OSがインストールされたサーバを簡単に手に入れることができます。

なお、この記事では、OSとしてCentOS 7.2 64-bitを利用していることを前提に説明していきます(CentOSは、Linuxのディストリビューションの一つです)

ここからは、OSがインストールされ、SSH接続可能なサーバのインスタンスが立ち上がっている状態から、構築の手順を一つずつ説明していきます。

1. サーバを最新の状態にして、作業用アカウントを用意する

SSHログインできるプランを選択していれば、SSH接続に使用するアカウントや鍵、接続するホストなどは、サービスが提供しているコントロールパネルやドキュメントで説明されているはずなので、確認してください(作業用のアカウントが用意されていることもあれば、管理者権限のrootが用意されていることもあります)

SSHの鍵を自分で作成する必要があれば、以前にエンジニアHubで執筆した「今日からはじめるGitHub」の「ssh-keygenコマンドで鍵を生成する」の説明を参照してください。

以下では、rootでログインしていることを前提として手順を進めていきます(SSH接続のアカウントがroot以外の作業用アカウントであれば、「rootでログイン」と説明している箇所は、コマンドの前にsudoを追加し、管理者権限でコマンドを実行してください)

パッケージを最新の状態に更新

脆弱性対策のためにも、サーバにインストールされているパッケージを常に最新化する習慣をつけましょう。古いバージョンのソフトウェアに脆弱性が存在していれば、もちろん攻撃者もその情報を知っています。攻撃の仕方が知られているまま放置しておくことが高リスクなのは明らかでしょう。

yumコマンドで、インストール済みのパッケージを最新にしましょう(yumは、Red Hat系のLinuxディストリビューションで利用されるパッケージを管理する仕組みで、パッケージの追加・削除・更新などに利用します)

# yum -y update

アップデートした内容を反映するため、OSを再起動します。アップデートの対象によってOSの再起動が不要なこともありますが、区別できなければ再起動しておけば安心でしょう。

# reboot
プロンプトと管理者権限

プロンプトとは、コマンド入力位置を表示するもので、システムが命令入力を受け付けられる状態にあることを示すために表示される記号のことです。

Linuxでは通常、一般ユーザでは「$」、rootでは「#」が表示されます。rootは管理者権限を持っているので、「#」が見えているときには細心の注意を払い、気を引き締めてコマンドを打ちましょう。

$ 【コマンド】
# 【コマンド】

作業用のアカウントを追加

rootは管理者権限を持っており、Unix/Linux系のOSをインストールするとデフォルトで共通して存在するアカウントです。サーバを攻撃する側からすると、最初にログインを試す価値があるアカウントといえます。もし、rootでのログインに成功されてしまったら、管理者権限を持っているため、サーバで好き放題されてしまいます。

それを防止するため、rootでSSH接続できない状態にしておきましょう(SSHログインできる作業アカウントがrootとは別に用意され、すでにrootでSSHできないようになっていれば次の手順まで進んでください)

今後のSSHログインに使う作業用のアカウントを、次のように作成します。ここでは「user1」というアカウントを追加しています。

# useradd user1

作成したアカウントのパスワードを設定します。

# passwd user1
ユーザー user1 のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

追加したアカウントの公開鍵配置

作成した作業用アカウントでSSHログインするために、公開鍵を配置します。 鍵の生成は、前述のように以前の記事で解説しているので参照してください。

.sshディレクトリをパーミッション700で作成します。

# mkdir -m 700 /home/user1/.ssh

公開鍵を配置します。上記の記事などを参考に、作成した公開鍵を用意します。

# vim /home/user1/.ssh/authorized_keys

公開鍵のパーミッションを600に変更します。

# chmod 600 /home/user1/.ssh/authorized_keys 

.ssh配下の所有者を変更します。

# chown -R user1:user1 /home/user1/.ssh/

ここまでの設定でサーバ上のuser1のアカウントがSSH接続できる状態になりました。user1でSSHログインし、接続できることを確認しましょう。

なお、ログインしているアカウントは以下のコマンドで確認できます。

$ whoami
user1

sudoユーザを追加

root以外のアカウントでsudoを使えない状態であれば、使えるように設定を変更します。

wheelグループにsudo権限をつけます。

# visudo

以下の行にコメントアウトがついている場合、コメントアウトを外して有効化します。

# %wheel  ALL=(ALL)       ALL

になっていたら

%wheel  ALL=(ALL)       ALL

にしましょう。

user1をwheelグループに追加します。sudoを許可するアカウントのみwheelに所属させます。

# usermod -G wheel user1

ここまでの設定でuser1でsudoを実行できるようになりました。試しにuser1でログインし、sudoが使えるか確認します。

ログインしているアカウントを確認します。

$ whoami 
user1

sudoが使えるか確認しましょう。これでエラーにならなければ、無事にsudo権限が付与されています。

$ sudo pwd
[sudo] password for user1: 
/home/user1

以降の手順は、rootではなく、作業用アカウントで作業できます。

rootでのSSHログインを制限

セキュリティ対策の面から、rootではSSH接続できないように制限します。

SSHの設定を変更しましょう。

$ sudo vim /etc/ssh/sshd_config 

PermitRootLoginをnoに変更します。

#PermitRootLogin yes
PermitRootLogin no

sshdを再起動して設定を反映しましょう。

$ sudo service sshd restart
Redirecting to /bin/systemctl restart  sshd.service

この段階でrootでSSH接続しようとすると Permission denied (publickey,gssapi-keyex,gssapi-with-mic). で接続拒否されます。

2. Apacheをインストールし、開発のためにBasic認証を追加する

次に、ApacheをインストールしてWebサーバを稼働させます。ただし、まだ構築中で公開はしたくないので、Basic認証を設定します。

Apacheインストール

まずはパッケージをインストールします。

$ sudo yum -y install httpd

Apacheのバージョンを確認しましょう(apachectlまたはhttpdコマンドの -version オプションで確認できます)

$ apachectl -version
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 14 2016 18:04:44

Apacheを起動します。

$ service httpd start

 or

$ apachectl start

http://サーバのIPアドレスまたはドメイン/ にアクセスし(クラウドのIPアドレスやドメインはサービスのコントロールパネルなどで確認してください)、Apache HTTP Server Test Pageが表示されることを確認します。

Apache HTTP Server Test Page

WebページにBasic認証を追加

次に、開発中の画面を非公開にするためにBasic認証を追加します。

認証用のアカウント・パスワードを生成します。【password】の部分には適当なパスワードを指定してください。

$ sudo htpasswd -c -b /etc/httpd/conf/.htpasswd user1 【password】
[sudo] password for user1: 
Adding password for user user1

Basic認証の設定を追加します。

$ sudo vim /etc/httpd/conf/httpd.conf

以下の設定を追加しましょう。

<Directory "/var/www/html/">
    AuthUserFile /etc/httpd/conf/.htpasswd
    AuthGroupFile /dev/null
    AuthName "Basic Auth"
    AuthType Basic
    Require valid-user
</Directory>

Apacheを再起動して設定を反映させます。

$ service httpd restart

 or

$ apachectl restart

これで先ほどのページにアクセスすると、設定したユーザ名とパスワードがないと閲覧できない状態になっています。

Apacheの自動起動設定

自動起動をONに設定しておくと、OS再起動時などにApacheを自動で起動できます。

$ chkconfig httpd on

確認は以下のコマンドで可能です。

$ systemctl is-enabled httpd
enabled

3. ApacheでPHPを使えるようにする

ApacheでPHPを使えるようにします。基本的には、以下のようにパッケージをインストールするだけで、設定まで完了した状態になります。

$ sudo yum -y install php
$ service httpd restart

この段階で、試しにPHPファイルをドキュメントルート(/var/www/html/)に配置してみましょう。

$ sudo vim /var/www/html/test.php
<?php
echo "Hello World";

この状態で http://サーバのIPアドレスまたはドメイン/test.php にアクセスすると、「Hello World」と表示されます。

Hello World

これで、Apache上でPHPを動作させることができるようになりました。この環境を使ってPHPのプログラムを書いていけば、Webサービスを開発・公開できます。

PHP以外の言語を利用したいときには、それぞれの言語に必要なパッケージをインストールして、設定しましょう。他の言語を使いたいときにも、簡単に環境を用意できます。

おわりに

いかがでしたでしょうか。Webサーバであれば、このように簡単に構築できました。欲しい機能は今回作成したサーバをいじって、どんどん拡張していきましょう。これで開発環境が準備できたので、引き続きテストコードの書き方や自動デプロイの方法などを紹介していきたいと思います。

最初はなかなかコマンドの意味が分からなかったり、何が原因で思い通りの動きをしないのか調べたりするのに苦労するかもしれません。しかし、トライ&エラーで慣れるのが大切です。そのためにも、簡単なものから試してみて「サーバをいじるのって面白いかも」と感じていただければ幸いです。

執筆者

池田健人(いけだ・けんと) @ikenyal

id:ikenyal
サーバサイドエンジニア。学生時代に研究室や学部の各種サーバ・ネットワーク構築などを経験し、プログラミング以外の技術も学ぶ。2011年に某Web系IT企業に入社。エンジニア職でありつつも、校正スキルには自信あり。現在はリーダーとしてマネジメントスキルを習得中。