Webサーバー立ち上げから常時SSL化まで

TeamSpeak3のサーバーの状況や更新履歴など見えたほうがいいだろうと思ったのでサイトも立ち上げた．
####バージョン情報

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04 LTS (Bionic Beaver)"
#（省略）

$ apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2018-04-25T11:38:24
```


#ⅠApache2&PHP導入
Webサイトを用意したいのでWebサーバーソフトウェアApache2をインストールする。
phpも使う予定なので一緒にインストールした。

```shell:
#パッケージリストの更新
$sudo apt update
#Apache2,PHPインストール
$sudo apt install apache2
$sudo apt install php
#再起動
$sudo systemctl restart apache2 
```
これでひとまず同じネットワーク内からローカルのアドレスでサイトが見れるようになった．

#ⅡSSL証明書取得&Webサイトのhttps化
Googleは通信がSSLで暗号化されていないWEBサイトを2018/7/24公開のChromeから「保護されていません」と明示的にするそうなので，流行りにならって常時SSL化をする。
無料で証明書を発行してくれる認証局(正確にはプロジェクト名)でLet's Encryptというのが有名なので今回はそれを利用した．

はじめは独自ドメインを持っていなかったので[無料ダイナミックDNSサービス](https://ieserver.net/)でhoge.dip.jpというサブドメインで公開していたのでそのドメインを使って取得しようとしたが無理だった．このサブドメインでのリクエストが多すぎるみたいだった．

ので独自ドメイン取りました．

```shell:
#Let's EncryptからSSL/TLS サーバ証明書を取得するときに用いられるのソフトウェア"certbot"
$ sudo apt -y install certbot
# -yはyesのy

$ sudo certbot certonly --webroot -w /var/www/html -d hoge.dip.jp

#エラー出た
An unexpected error occurred:
There were too many requests of a given type :: Error creating new cert :: too many certificates already issued for: dip.jp: see https://letsencrypt.org/docs/rate-limits/
#独自ドメインが必要な模様

#独自ドメインを取得して再挑戦
$ sudo certbot certonly --webroot -w /var/www/html -d hoge.com
#うまく行った

#証明書ファイル等の場所
$ sudo ls -l /etc/letsencrypt/archive/hoge.com
$ sudo ls -l /etc/letsencrypt/live/hoge.com

#毎週月曜日の12時に証明書の残り期限が30日以下の場合，更新をするように設定
$ cat /etc/cron.d/certbot
#(省略)
0 12 * * 1 root  /usr/bin/certbot --quiet renew
#0 */12 * * 1 root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

#apacheのSSL設定
$ sudo vi /etc/apache2/sites-available/default-ssl.conf
    #変更&追加
    ServerAdmin webmaster@hoge.com
    ServerName hoge.com
    SSLCertificateFile /etc/letsencrypt/live/hoge.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/hoge.com/privkey.pem

#httpでのリクエストをhttpsへリダイレクト
$ sudo vi /etc/apache2/sites-available/000-default.conf
    #変更&追加
    Redirect "/" "https://hoge.com/"

#更新
$ sudo systemctl restart apache2
```

#Ⅲftp導入
いちいちSSHでサーバーに接続してphpファイルや画像ファイルを送るのは鬱陶しいのでFTPで送信できるようにする．
phpはローカルで動かすのは面倒そうだったので，WindowsPCからWinSCPというソフトを使ってミラーリングで一括更新できるようにして楽になった。

```shell:
$ sudo apt install vsftpd
$ sudo vi vsftpd.conf
    #各種変更&追加↓
  pasv_enable=YES
  pasv_min_port=60001
  pasv_max_port=60001
  seccomp_sandbox=NO
  allow_writeable_chroot=YES
  local_root=/var/www/html/
```
local_root = /var/www/html/ のようにスペースを入れるとftpの起動ができない（がっつりハマった）

ftpアップロード用ユーザーの新規アカウントを作って/var/www/htmlのオーナーをそのユーザーに変更

```shell:
$ sudo adduser ftpアップロード用ユーザー名

$ sudo chown ftpアップロード用ユーザー名 /var/www/html
$ sudo vi /etc/vsftpd.chroot_list
$ sudo service vsftpd restart

#ftpポートが動いてることの確認 引数1：アドレス 引数2：ポート
$ telnet localhost 21

#vsftpdはsshを通して通信する
$ sudo vi /etc/ssh/sshd_config
    #最下行に下のように入れる
    #このユーザーだけPW認証も許可 という意味
    Match User ftpアップロード用ユーザー名
      PasswordAuthentication yes
```

#ⅣIndex of の非表示
いろいろいじっていると公開しているディレクトリの内、index.htmlなどがないものはそのディレクトリ内のファイルの一覧が表示されてしまうようなので非表示にする方法を調べた。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/239365/53db22c4-39a2-bab4-d7b4-6fe750cbf5d4.png)
公開する根っこのディレクトリ(DocumentRoot)に.htaccessというファイルをつくり、内容を以下のようにすると非表示にできるようだが自分の環境ではうまく行かなかったので

```　.htaccess
Options -Indexes
#改行が必要らしい
```
上記のようにすると非表示にできるようだが自分の環境ではうまく行かなかった（おそらく.htaccessでのOptionsを有効化する設定がうまくされていなかった）ので
/etc/apache2/site-available/default-ssl.conf
に追加で書き込んだ。

```
$ sudo vi /etc/apache2/site-available/default-ssl.conf
#以下を追加
<Directory /var/www/html>
Options -Indexes +FollowSymLinks
</Directory>

#編集後にapacheの再起動
$ sudo systemctl restart apache2
```


\<Directory /var/www/html>
の部分は各自の環境によって設定する。
これでディレクトリ内のファイルの一覧が見れなくなった。
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/239365/47e1d967-3fd2-227d-25f4-365d89afdc97.png)