さくらVPSでWebサーバを稼働させる

#はじめに
Webサーバを構築してみたので備忘録。

VPSを用いてサイトを公開するまでに行った作業は以下の通り。

1. HTMLやCSS, JavaScript, PHPなどでコンテンツを作成する。
2. VPSの契約、ドメインの取得を行う。
3. VPS上でWebサーバを構築し、設定を行い、コンテンツを公開する。

ここでは、"3"の作業について、行ったことをざっくり説明する。
VPS提供サービスには[さくらインターネット](https://vps.sakura.ad.jp/)、ドメイン取得サービスには[お名前.com](https://www.onamae.com/)を利用した。

#ネームサーバの設定
お名前.comで取得したドメインをさくらインターネットのVPSで使用するために、ネームサーバ（=DNSサーバ）の設定を行う必要がある。さくらインターネットでは、VPSの契約を行うと無料でネームサーバにドメインを登録できる（契約の種類によって無料で登録できる個数の上限はある）。今回はさくらインターネットのネームサーバを使用する。

###1. さくらインターネットのネームサーバを調べる
さくらインターネットにログイン。契約情報 -> 契約ドメインの確認 -> ドメインメニュー -> ネームサーバ新規登録
ここでお名前.comで取得したドメインを追加する。その後、ドメイン一覧からゾーン情報を確認すると、各レコードの内容が確認できる。NSレコードにプライマリDNSサーバとセカンダリDNSサーバのドメインが載っている。

###2. ネームサーバを指定する
お名前.comのドメインNaviにログイン。ドメイン設定 -> ネームサーバーの変更 -> 他のネームサーバーを利用
ここに、先ほど確認したさくらインターネットのプライマリ及びセカンダリDNSサーバのドメインを入力する。

これで、VPSのIPアドレスと取得したドメイン名がネームサーバによって関連付けられた。

#VPSの事前準備
さくらVPSはデフォルトでCentOS 6がインストールされている。
しかし、今後のことを考えて、様々な機能が追加されているCentOS 7をインストールしておく。
VPSの管理画面において、各種設定 -> OSインストール。CentOS 7のカスタムOSインストールを選択することで、インストーラが開き、パーティションの設定やrootユーザ、一般ユーザの設定が行える。

インストールが終わったら、VNCコンソールを開き、rootでログインしてvisudoコマンドを実行。(viで設定ファイルが開く)
一番下の行に以下の設定を追加する。

```
一般ユーザ名　ALL=(ALL) ALL
```

これで、一般ユーザに全コマンドの管理者実行（sudoを付けて）が許可された。

#SSHの設定

さくらVPSの管理画面からVPSを操作することもできるが、セキュリティの観点から、SSHによる遠隔ログインでVPSを操作したい。

SSHの設定を行うために、エディタで設定ファイルを開く。
（エディタは使いやすいものを適宜インストールしておく）

```sh:
$ emacs /etc/ssh/sshd_config
```

SSHはデフォルトでは22番ポートに設定されているが、このままだとログイン試行の攻撃を受けやすいので変更する。また、SSH経由のrootログインが出来ないようにも設定する。

```
#Port 22
.
.
.
#PermitRootLogin yes
```

このようになっているので、

```
Port 任意のポート番号
.
.
.
PermitRootLogin no
```

このように変更する。ポート番号は、ウェルノウンポート番号（0-1023番）以外で、他のアプリケーションが使用していない番号を指定する。ポート番号は16ビットで表されるので、1024-65535番の中から指定すればよい。ただ、1024-49151番はIANAによって特定のアプリケーションに登録されている可能性があるため、49152番以降を指定するとよい。

次にセキュリティに関する設定を行う。
Linuxディストリビューションには、不正ログインを受けた際の被害を抑えるための機構として、SELinuxが用意されている。この設定を変更するためコマンドとしてpolicycoreutils-pythonをインストールし、指定したSSHのポート番号を許可させる。

```sh:
$ yum -y install policycoreutils-python
$ semanage port -a -t ssh_port_t -p tcp 指定したSSHのポート番号
```

次にfirewallの設定を行う。firewallを正しく設定することで、特定のポートによる通信のみを通過させることが出来る（もちろんIPアドレスによる制御なども出来るがここではしない）。SSHのポート番号を指定するために、SSH設定用のテンプレートをコピーして、それを編集する。

```sh:
$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
$ emacs /etc/firewalld/services/ssh.xml
```

ssh.xmlの下の方に、

```
<port protocol="tcp" port="22">
```

と、ポートを指定している行があるので、これを変更する。
firewallの設定を反映させて、SSHサーバを再起動する。

```sh:
$ firewall-cmd --reload
$ systemctl restart sshd.service
```

以上で設定は完了したので、今後の作業はSSH経由で行う。
（Windowsであれば[TeraTerm](https://ja.osdn.net/projects/ttssh2/)などを用いる）

#Webサーバの導入

SSHで一般ユーザとしてログインしたら、WebサーバとしてApacheをインストールし、起動する。
Apacheはhttpdというパッケージとして提供されている。

```sh:
$ sudo yum install httpd
$ sudo systemctl start httpd.service
```

HTTP通信は80番ポートが使用される。外部からWebサーバにアクセス出来るようにfirewallを設定する。

```sh:
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd reload
```

これで80番ポートへの外部からのアクセスが許可された。
デフォルトのDocumentRoot（Webページとして公開されるファイルを置くディレクトリ。/etc/httpd/conf/httpd.confから変更可）は/var/www/html/となっており、作成したWebページのファイル群をここに置くことで、外部からWebページを閲覧できる。

ここで、手元のPC（win）からVPSへWebページのファイルをまとめたフォルダを転送したい。
これにはSCP（SSHによるファイル転送プロトコル）を用いた。Windowsであれば、SCPクライアントとして[WinSCP](https://ja.osdn.net/projects/winscp/)が使いやすい。これでフォルダを転送した後、下位のファイルをDocumentRootに置く。

ここで、フォルダを転送したディレクトリにおいて、

```sh:
$ sudo mv SCPで転送したフォルダ名/* /var/www/html/
```

としてから、Webページを閲覧すると、httpのエラーである"403 Forbidden"が表示された。
これはどうやらSELinuxの問題らしい。
-> [ApacheでSELinuxが原因で403 Forbiddenエラー](http://totech.hateblo.jp/entry/2015/04/05/223714)

mvコマンドでファイルを移動させた場合は、

```sh:
$ sudo restorecon -R /var/www/html/*
```

としてラベルを更新する。
もしくはmvコマンドを使わずに、

```sh:
$ sudo cp -R SCPで転送したフォルダ名/* /var/www/html/
```

とすれば問題ない。

以上で、Webサーバを稼働させてサイトを公開することが出来た。


#参考
[【さくらのVPS】サーバの初期設定ガイド](https://help.sakura.ad.jp/hc/ja/articles/206208181)
[【さくらのVPS】カスタムOSインストールガイド - CentOS7 / ScientificLinux7 / Fedora 24](https://help.sakura.ad.jp/hc/ja/articles/206055602-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0OS%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89-CentOS7-ScientificLinux7-Fedora-24)
[ゼロからはじめるLinuxサーバー構築・運用ガイド　中島 能和 (著)](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BLinux%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89%E3%83%BB%E9%81%8B%E7%94%A8%E3%82%AC%E3%82%A4%E3%83%89-%E5%8B%95%E3%81%8B%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6Web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798146374)
[ApacheでSELinuxが原因で403 Forbiddenエラー](http://totech.hateblo.jp/entry/2015/04/05/223714)