サーバー開発のための学習ノート

# はじめに
ネットワーク通信の知識をつけたいのでサーバー開発について勉強を始めました。
サーバー構築は(ほぼ)全くの未経験のため、学習を進めながら備忘録として記事を残していきたいです。

## 目標
1. **レンタルサーバーを用いてホームページを公開する**<br>
        → サーバーの基礎的な仕組みの理解のため
2. **Windowsのアプリとサーバー間の通信**<br>
        → C#(C++)でサーバーとやり取りする方法を会得したい
3. **SQL(?)というものを使用してデータベースを扱うサイトを作る**<br>
        → twitterのようなサイトを作る際に必須？

## 現在の知識
・C#およびC++でのアプリケーション開発経験
・レンタルサーバーでのホームページ運営で挫折経験あり
(簡単なHTMLファイルを公開することはできた)

# サーバーを借りる
サーバーは[さくらインターネット](https://www.sakura.ad.jp/)のものを借りました。

サーバーの選択肢としては「レンタルサーバー」と「VPS」の2種類があるようです。
VPSはマシン上のCPUやメモリも仮想環境として割り当てられるために、他のサーバーにアクセスが集中しても自分のサーバーが影響を受けなくて済むとのこと。どうやらレンタルサーバーの上位互換のようです。

ざっと調べてみたところ、VPSの方が初学者向けの情報が多そうなのでそちらを借りました。
最も安いプランを選んだので、初期費用は1000円ほど、月額は625円でした。

# サーバーの設定
**※これは「[さくらVPS設定マニュアル](http://www.xn--vps-073b3a72a.com/1.html)」を読み進めながら書いた学習ノートです。※**
今回は第4章「基本設定」～第8章「WEBページの設定」までを行いました。

サーバー上のLinuxOSにコマンドを送る (という認識で正しい？) にはTeraTermというソフトを使用します。

## 1. 基本設定

[**rootユーザーをそのまま使うのはセキュリティ上よろしくない**](https://eng-entrance.com/linux-root)とのことなので、パスワードを変更したり作業用のユーザーを作成したりします。
(その後作業用ユーザーにもrootと全く同じ権限を与えるのだが、それだと意味がないのでは？)
また、[**実行できるコマンドを指定することもできるらしい。**](https://eng-entrance.com/linux-root)

| コマンド | 解説(解釈) | 参考サイト |
|---|---|---|
| passwd | 現在のユーザーのパスワードを変更する | - |
| yum update | yum (さくらVPSに元から入っているアプリの管理するためのコマンド) をアップデートする | - |
| vim /etc/sysconfig/i18n | vimの表示を日本語化させる | - |
| useradd sakuravps| "sakuravps"という名前のユーザーを追加 | - |

## 2. 公開鍵、秘密鍵の設定
おそらく**[ブラウザのSSL通信](https://ssl.sakura.ad.jp/column/ssl/)**における鍵と同じ概念だと思います。
(しかし、ここで設定しているのが「サーバーとサーバー管理者の間の通信」のための鍵なのか「サーバーとクライアントの間の通信」のための鍵なのかがわからない。[**前者をSSH、後者をSSLと呼ぶらしい**](https://wa3.i-3-i.info/diff384security.html)ので、コマンドから推察するに前者？)

手順としては、PuTTY で公開鍵と秘密鍵を生成し、公開鍵をサーバーに登録します。
(秘密鍵は生成しただけだが、サーバーもしくは管理者のPCに秘密鍵を登録しないと意味がないのでは？)

| コマンド | 解説(解釈) | 参考サイト |
|---|---|---|
| cd $HOME | ホームディレクトリを操作するディレクトリとする | - |
| mkdir .ssh | ".ssh" という名のフォルダを作成 | - |
| chmod 700 .ssh | ".ssh" のパーミションの設定。700は「オーナーは読み書き実行が可能、他のメンバは何もできない」であり、600は「オーナーは読み書きのみ可能、他メンバは何もできない」らしい。 | [■](http://www.tohoho-web.com/wwwxx012.htm)|

## 3. SSHとファイアウォールの設定(ポート番号の変更)
| コマンド | 解説(解釈) | 参考サイト |
|---|---|---|
| sudo vi /etc/ssh/sshd_config | ポート番号の変更を行う  | [■](http://karoten512.hatenablog.com/entry/2018/02/11/235424)|

接続時には正しいポート番号を指定しないと認証されないので、選べる数値の分だけ不正アクセスを受ける可能性が低くなる、ということらしい。

## 4. Webサーバーの設定
まず、サーバーに**Apache**をインストールする。
ApacheとはWebサーバーソフトウェアと呼ばれるもので、[**ブラウザからのリクエストに応じてHTML文書や画像ファイルなどを送信する機能を持つ。**](https://www.kagoya.jp/howto/rentalserver/apache/)

| コマンド | 解説(解釈) | 参考サイト |
|---|---|---|
| yum -y install httpd | Apacheをインストールする。インストーラ自体は元から入っているのか？ |-|
| chkconfig httpd on | Apacheが自動で起動されるようにする | [■](https://qiita.com/yukikimoto/items/6bd18c8c74e580af177b)|
| vim /etc/httpd/conf/httpd.conf | Apacheの設定ファイルの変更 (下２つ) |-|
| 「ServerTokens Prod」<br>「ServerSignature Off」 | Apacheのバージョン情報をユーザーに隠す | [■](https://qiita.com/FSMS/items/9522908a8c336160491f)|
| 「Options -Indexes FollowSymLinks」 | "-"をつけないと、デフォルトのファイルがないディレクトリをURLに指定したときに中のファイルが全て表示されてしまう。 | [■](https://www.atmarkit.co.jp/flinux/rensai/linuxtips/705noindexes.html)|

# HTMLファイルの公開
ファイルの転送にはFileZillaを使用します。
[**さくらVPSマニュアル**](http://www.xn--vps-073b3a72a.com/8.html)さんの手順通りにサーバーに接続し、htmlファイルを var/www/html に転送……しようとしたところ、
<font color="red">**open for write: permission denied**</font>
というエラーが発生。

エラーの文言から察するにパーミションの設定がまずい？
試しに root ユーザーで接続してファイルを送信したところ、問題なくファイルを置くことができました。
やはり作業ユーザーとして使っている sakuravps にディレクトリへの書き込みが許可されていないことが原因みたいです。

その後見つけた[**こちらのサイト**](https://off.tokyo/blog/open-for-write-permission-denied%E3%81%8C%E5%87%BA%E3%81%A6%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%BB%A2%E9%80%81%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84/)様のおかげで解決策がわかりました。

```
$ chown -R root:wheel var/www/html
$ chmod -R 775 var/www/html
```

1行目の **chown** で html ディレクトリの所有グループを root から wheel に変更しています。
wheel は前回 sakuravps を所属させたグループです。
( : の前の root は、所有ユーザーを root のままにするという意味)

2行目の **chmod** は先ほども扱ったパーミション変更のコマンドで、775 の真ん中の 7 が「グループのユーザーは読み書き実行が可能」という意味になります。

これにより、sakuravps のアカウントで var/www/html にファイルをアップロードすることができるようになりました。
あらかじめ用意したindex.html (名前はこれでないと駄目らしい) を置き、サーバーのアドレスを開いたところ
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245952/34b42253-6c1e-2e0b-e5ba-9d7755870e58.png)
無事に表示されているようです。やったね。

# 今日はここまで
これでHTMLファイルをサーバーにアップロードし、Web上に公開することができるようになりました。
次回からはサイトの中身を作るため、SQLについて勉強していこうと思います。