PROGRAMMING

【シンプル解説】初心者でもわかるVPSの使い方【新規開設~web公開まで】+docker導入

こんにちは。もんしょー(@sima199407)です。

webにサクッと公開するのにレンタルサーバーを使ったりしますよね。

けど、

ある人
あのソフト入れたいのにroot権限がない。。。

なんてことをあるかもしれません。

そんなときに使えるのが、VPSになります。

今回は、新規開設からweb上に公開するまでを順を追って解説していきます。

YouTubeでも公開してます

目標

第1目標 : nginxを使ってweb上に公開する

第2目標 : Dockerを導入してweb上に公開

※どっちでもwebに公開することにはできます。

開発環境

VPS : さくらのVPS

OS : ubuntu18.04

webサーバー : nginx

ツール : Docker

そもそもなんでVPS?

1.安い(レンタルサーバーよりも安くなるかも)

→月額700円くらいから使える

2.root権限が使える

→自分の入れたいソフトを導入できる

3.実務に近い

→2.に関連。制限なく使えるところがいい

VPSの契約(さくらのVPS)

さくらのVPSのサイトで、契約します。

今回は、石狩のサーバーを使いますがどこでもOK。

ポイント
サーバーの設定でサーバー名を入れないと電話番号になります。

さくらのVPSマイページ

契約すると、起動していないサーバーが出てくるかと思います。(なければ更新を一回かけてみる)

なので、起動する。

やることは特にありませんが、IPアドレスだけを確認しておきましょう。

ローカルで公開鍵と秘密鍵を作成(sshの接続)

ローカル環境で、

$ cd .ssh

で、隠しファイルの.sshに移動します。

$ ssh-keygen -b 4096 -C "test@example.com"

オプションについて

いろんなオプションつけて、おりますが、-bってのが、bit数ですね。

デフォルトだと2048bitなんですが、githubなんかを見ると、4096にしておく方法が載っていたのでこっちにします。

これのほうが文字列が長いのでセキュリティが高いみたいです。

-Cってのが、コメントですね。

デフォルトが「ユーザー名@ホスト名」なんですが、これもgithubを見るとメールアドレスを入れておくようなので、入れておきます。

オプションなしでも作成可能

ちなみに、オプションなしの

$ ssh-keygen

でも作れます。

参考サイト

[blog-card url="https://qiita.com/soma_sekimoto/items/35845495bc565c38ae9d"][/blog-card]

こちらを見ていただければと思います。

パスワードでssh接続

まずはパスワードでサーバーに入りましょう。

その際に、

#具体例
ssh ik1-111-22222.vs.sakura.ne.jp -p

# 基本の形
ssh [オプション] ユーザー名@ホスト名 

こんな感じで接続するコマンドを打つんですが、いちいち入力するのが面倒です。

なので、携帯に電話番号を登録するようにサーバーの情報を登録します。

configの設定

コンフィグの設定は

.sshディレクトリの中に入っているはず。なければファイルを作ってください。

MacBook-Pro:.ssh shohei$ ls
config #これ				id_rsa.pub ~

このファイルを編集します

$ vi config

今回、これをテンプレとして使います。

Host [ホスト名]
  HostName     [IPアドレス]
  Port         [ポート番号]
  User         [ユーザー名]
  IdentityFile ~/.ssh/id_rsa

サーバーのデータを書いていきます。
例えば、ホスト名なら以下の部分。

んで、まとめるとこんな感じです。

[ホスト名] → なんでもいい (今回は sakura_vps にしておく)
[IPアドレス]  → ik1~ から始まるところ
[ポート番号] → 22
[ユーザー名] →  ubuntu

これを反映させるとこうなります。

Host sakura_vps
  HostName     ik1~ から始まるところ
  Port         22
  User         ubuntu
  IdentityFile ~/.ssh/id_rsa

それで、ssh接続のコマンド入力をします。

$ ssh sakura_vps

これでパスワードが求められるので、契約のときに設定したパスワードを入力します。

すると以下のようになるかと思います。

ubuntu@ik1-******:~$

パスワードでの接続が終了です。

公開鍵でssh接続

次はパスワードの入力も省略する、公開鍵での接続方法。

こっちのほうがセキュリティ的にもいい感じです。

流れはこんな感じ。

1. 公開鍵をVPSサーバーへ転送
2. (VPSサーバー).sshを作成する
3. (VPSサーバー)公開鍵をauthorized_keysという名前コピーして.sshディレクトリに入れる
4. (VPSサーバー)1.で転送した公開鍵を消す
5. (ローカル)cofigのオプションにパスワード認証をnoにする。
6. (ローカル)接続確認

[blog-card url="https://manual.sakura.ad.jp/vps/support/technical/ssh-ch.html"][/blog-card]

1. (ローカル)公開鍵をVPSサーバーへ転送

先ほど作成した公開鍵をVPSサーバーへ送ります。

$ rsync -arv .ssh/id_rsa.pub sakura_vps:~/

[box03 title="オプションについて"]-a →アーカイブモード(コピー元のファイルと同一条件でコピーする)
r →ディレクトリを再帰的に処理(指定ディレクトリ配下をすべて対象)
-v →動作内容を表示[/box03]

2. (VPSサーバー).sshを作成する

VPSサーパーにパスワードで接続してこちらを叩きます。

$ mkdir .ssh

mkdir→make directory フォルダを作成

3. (VPSサーバー)公開鍵をauthorized_keysという名前コピーして.sshディレクトリに入れる

まず、権限を変えておく。

$ chmod 700 .ssh

1.で転送した公開鍵を名前を変えて.sshディレクトリにコピー

$ cat id_rsa.pub > .ssh/authorized_keys

こちらも権限を変えておく。

$ chmod 600 .ssh/authorized_keys

4. (VPSサーバー)1.で転送した公開鍵を消す

$ rm -f id_rsa.pub

[box03 title="オプションについて"]-f →force 強制モード[/box03]

5. (ローカル)cofigのオプションにパスワード認証をnoにする。

以下を追加する。

Host sakura_vps
  HostName     ik1~ から始まるところ
  Port         22
  User         ubuntu
  IdentityFile ~/.ssh/id_rsa
  PasswordAuthentication no #ここ追加

6. (ローカル)接続確認

で、接続テストします。

$ ssh sakura_vps

これでパスワード認証と同じようになればOKです。

Dockerを使った公開方法

Dockerを使う公開の方から説明していきます。

以前、AWSでの導入方法について解説してみました。

大まかな流れはこちら

1.スクリプト解説
2.コマンド入力
3.インストールできたかの確認

スクリプト解説

今回は、さくらのVPSで用意されていた、スクリプトを解説していきます。

#!/usr/bin/bash
# Ubuntu 18.04, Ubuntu 20.04用 docker インストールスクリプト

set -x
# x・・・ デバック用の実行したコマンドとその引数を出力

apt -y update || exit 1
apt -y upgrade || exit 1

# y・・・処理中に出る選択をすべて「yes」で答える

# APT が HTTPS で利用できるようにするための準備
apt -y install apt-transport-https \
          ca-certificates \
          curl \
          software-properties-common

# GPGキーをシステムに追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

# Docker用のリポジトリを追加
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

# Docker のパッケージ用に再度アップデート
apt -y update || exit 1
# Docker のインストール
apt -y install docker-ce

# docker-compose の最新バージョンの取得
DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)

# docker-compose のファイル設置
sh -c "curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose"
#c・・・コマンドオプション。string型で読み込みされます。

# docker-compose の実行権限付与
chmod +x /usr/local/bin/docker-compose

# 自動起動の有効化
	systemctl enable docker

# ubuntu user も docker を使えるようにしておく
usermod -aG docker ubuntu

#-aG・・・副グループ名を追加
#→ dockerグループに ubuntuユーザーを登録する

#をつけて解説を入れてます。

[box05 title="GPGキーとは?"]暗号化するソフトウェアで、インターネットから入手できるパッケージが正しい配布先のものかどうかのチェックします。[/box05]

コマンド入力

上記のコマンドを一つ一ついれていきます。

root権限になったほうがスムーズにコマンドを叩きやすいかもです。

$ su -
$ set -x
# x・・・ デバック用の実行したコマンドとその引数を出力
$ apt -y update || exit 1
$ apt -y upgrade || exit 1
# y・・・処理中に出る選択をすべて「yes」で答える
# APT が HTTPS で利用できるようにするための準備
$ apt -y install apt-transport-https \
          ca-certificates \
          curl \
          software-properties-common
# GPGキーをシステムに追加
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# Docker用のリポジトリを追加
$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
# Docker のパッケージ用に再度アップデート
$ apt -y update || exit 1
# Docker のインストール
$ apt -y install docker-ce
# docker-compose の最新バージョンの取得
$ DOCKER_COMPOSE_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep 'tag_name' | cut -d\" -f4)
# docker-compose のファイル設置
$ sh -c "curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose"
#c・・・コマンドオプション。string型で読み込みされます。
# docker-compose の実行権限付与
$ chmod +x /usr/local/bin/docker-compose
# 自動起動の有効化
$ systemctl enable docker
# ubuntu user も docker を使えるようにしておく
$ usermod -aG docker ubuntu
#-aG・・・副グループ名を追加
#→ dockerグループに ubuntuユーザーを登録する

インストールできたかの確認

dockerと叩く。

$ docker 
~
 version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

To get more help with docker, check out our guides at https://docs.docker.com/go/guides/

こんな感じならOK。

docker-composeも確認する。

$ docker-compose
~
  unpause            Unpause services
  up                 Create and start containers
  version            Show version information and quit

こんな感じになるかなと。

gitのインストール or バージョンの確認

基本的にgitは入っているかと思いますが、一応確認します。

# バージョンの確認
$ git --version

これでnot foundならインストールします。

# 新規追加
$ sudo apt install git

githubからテンプレをクローンする

今回は以下の記事で使った、Laravelとnginx,MySQLのテンプレを参考にしていきます。

こちらを叩きます。

$ git clone https://github.com/sho55/laravel-nginx-mysql8.0.git

dockerのコンテナを起動

githubからクローンができたら、docker-compose.ymlというファイルがある場所で以下を叩く

$ sudo docker-compose up -d --build

そして、立ち上がっているか確認する

$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED       STATUS       PORTS                               NAMES
dbe47c980414   nginx                       "/bin/sh -c 'nginx -…"   6 weeks ago   Up 6 weeks   0.0.0.0:81->80/tcp                  app_nginx
f5c83c64e5cd   phpmyadmin/phpmyadmin       "/docker-entrypoint.…"   7 weeks ago   Up 6 weeks   0.0.0.0:8080->80/tcp                app_pma
9cd727de59d0   laravel-nginx-mysql80_web   "docker-php-entrypoi…"   7 weeks ago   Up 6 weeks   9000/tcp                            app_php
63009ca7778d   mysql:8.0                   "docker-entrypoint.s…"   7 weeks ago   Up 6 weeks   0.0.0.0:3306->3306/tcp, 33060/tcp   app_db

もし立ち上がってないコンテナがあるときは?

YouTubeで33:13あたりからエラーの解消をやっております。

さくらのVPSでポート80が開かない対処法

コントロールパネルの「サーバー」の「グローバルネットワーク」タブを開く

デフォルトだと、パケットフィルタが22のみ開いている状態なので、「パケットフィルタを設定」をクリックして、「利用しない」を選択する。

これで、http://[IPアドレス]/へアクセスしてみる。(さくらのVPSのコントロールパネルから確認してみてください)

Laravelのエラーの対処法

まず、コンテナに移動する必要があります。

$ docker exec -it [DockerのコンテナのNAMES](今回はapp_php) bash

大体のエラーの原因

・envファイルがない
・composerが導入されてない
・logファイルの権限がない

動画でも解説してます

36:20あたりからになります。

envファイルがない

ということが出てきたら、環境変数のエラーの場合があります。

GitからCloneした時は.envがないので、以下を叩いてみてください。

$ cp .env.example .env

app keyがない

No application encryption key has been specified.

ということが出てきたら、環境変数でのapp keyの設定が必要です。

php artisan key:generate

composerが導入されてない

このようなエラーが出た時

Warning: require(/var/www/laravel/public/../vendor/autoload.php) ~ 

$ composer install

logファイルの権限がない

$ chmod -R 777 storage/

webサーバーを使った公開方法

webサーバーで使用するポートとdockerがかち合うので、dockerを止めてから始めましょう。

docker-compose down

大まかな流れはこちら

1.nginxを導入する
2.自動起動の設定をする
3.テストファイルを作成
4.ドキュメントルートを変更する
5.ページを確認する

1.nginxを導入する

1行目はインストールする前にちゃんとファイルが合っているか確認している作業です。

$ curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -

$ sudo apt update

$ sudo apt -y install nginx

$ nginx -v

2.自動起動の設定をする

インストールができていたら自動起動をしておきましょう。

サーバーが停止したあとに勝手に動いたほうがラクですからね。

$ sudo systemctl enable nginx

3.テストファイルを作成

今のドキュメントルートは

$ pwd
/home/ubuntu

こんな感じで見れるんですが、この /home/ubuntu に以下のように叩きます。

$ vi(または nano) index.html

そして、適当なテストファイルを作ります。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>sample docs</h1>

    <p>
        hello さくらVPS!!   
    </p>
</body>
</html>

4.ドキュメントルートを変更する

んで、作ったテストのindex.htmlを読み込むためにドキュメントルートを確認します。

$ grep "root" -r /etc/nginx/ | grep "html"
/etc/nginx/sites-available/default:	root /var/www/html;

こんな感じになっているかなと。
つまり、 /var/www/htmlがデフォルトになっているんですね。

これを変えちゃいます。

$ nano /etc/nginx/sites-available/default
#真ん中あたりに
~
#[変更前]
root /var/www/html;
↓
#[変更後]
root /home/ubuntu;
~

という感じにします。

変更を反映させるためにリロードします。

$ nginx -s reload

5.ページを確認する

これで、ipアドレスにアクセスすると、こんなページが出れば成功です。

これでwebサーバーの導入は終了です。

-PROGRAMMING