はじめに
Webアプリを開発する上でWindowsでもいいが、クラウドがLinuxである事が多い気もする中で、Windowsだけど開発はLinuxでという事もある気がしている。
個人開発をする上でもLinux環境が欲しくなりちゃんと環境構築をやってみたので、その環境構築の手順を、個人の備忘録の意味も含めて、残しておく。
なぜvirtualboxか?
- 複数サーバを立てて疎通検証をしたい場合に問題がでるので、マイクロサービス開発とかだと厳しい(らしい)
- 環境の移転が困難(スナップショットの保存ができない)
といった理由からWSL2だとうまくいかない事がある(みたい)。
virtualboxにCentOSでLinux環境を構築する
今回はCentOSにするが理由は、Amazon LinuxがCentOS系?という事らしいので(少なくともyumでDebian系ではないため)。
virtualboxのインストール
CentOSのマシンイメージ取得
CentOS Linuxにアクセスして、7(2009)
のタブを開き、x86_64にアクセスする。
適当なリージョンを選択して、CentOS-7-x86_64-Minimal-2009.iso
をダウンロードする。
仮想マシンを作成
virtualboxを開いて新規から作成していく。
基本的にはデフォルトでいいが、メモリは1024MB(1GB)だとだいぶ動作がもっさりするので快適に動かすには4096MB(4GB)とかあるとよさげ(らしい)。
CentOSのマシンイメージ取得で取得したイメージは、設定>ストレージ>コントローラー:IDE 空>ディスクアイコン>仮想光学ディスクの選択・作成...から仮想マシンのイメージに設定する。
メモリ | 4096MB |
ハードディスク | 仮想ディスクを作成で20GB。ディスクタイプはVDI。 |
物理ハードディスクにあるストレージ | 可変 |
ネットワーク | アダプター1:NAT アダプター2:ホストオンリーアダプター ※後でCentOS上で追加設定を行う |
物理ハードディスクにあるストレージ | 可変 |
※詳細の手順はVirtualBoxにCentOSをインストールが分かりやすい(今回はMinimalなのでCLIであり、記事のようなGUIの設定はしないので注意)。
仮想マシン(CentOS)の設定をする
ネットワーク設定
今回はNAT×ホストオンリーアダプターの構成でネットワークの設定を作っていく。参考に挙げたサイトの方で以下のように言われているのがその理由。
よくあるVirtualBoxネットワーク設定の例として、ブリッジアダプターを使ったものがありますが、外部ネットワーク、仮想マシン、ホストOSの全ての通信が可能になってしまいセキュリティ的によろしくありません。
この設定を行う前提として、仮想マシンを作成に添付している画像のようにネットワークが設定されている必要がある。
NAT、ホストオンリーアダプターの2つの設定をするのには、nmtui
コマンドを実行して開くTUIで設定を行っていく。まずはその画面を開く。
※以下のTUIの青い画面は、矢印キーとEnterで操作する。
手順No | 手順 | 参考画像 |
---|---|---|
1 |
nmtui コマンドを実行する |
|
2 |
Edit a connection を選択してEnter |
NATの設定
以下では上記の手順の続きで、NATの設定をしていく。
ホストオンリーアダプターの設定
以下では上記の手順の続きで、ホストオンリーアダプターの設定をしていく。
※上記の「手順」で出てきたアダプターのIPとは以下の画像の部分の事(DHCPサーバのタブの方に、下限・上限が書かれている)。
設定の反映
上記の設定を反映させるために、以下のコマンドを実行する。
# systemctl restart NetworkManager
# systemctl restart network
設定できているか?検証する
ping
とssh
で接続できているか?を確かめる。
-
ping
仮想マシン(ゲストOSと言ったりする)から外部ネットワークへの接続ができているか?を確かめる -
ssh
Windows(ホストOsと言ったりする)からゲストOSへの接続ができるか?を確かめる
CentOSのsshd_config(sshの設定)がデフォルトであればPasswordAuthentication yes
となっているのでssh接続をパスワード認証で行えるはず(sshd_configの中身は、cat /etc/ssh/sshd_config
で見れる)
ping | ssh |
---|---|
ここまででネットワークの設定は完了になる。
余談
emp0s3
とemp0s8
のどちらが、NATでどちらがホストオンリーアダプターか?は、以下のようにip addr
と実行した時のMACアドレスで分かる。
emp0s3 | emp0s8 |
---|---|
firewalldの設定
Webアプリを作る際にもちろんローカルサーバを立ち上げるが、だいたいlocalhost:8080
のパターンが多いと思う。ただ、デフォルトのCentOSではfirewalldというサービスが動いており、8080ポートが閉じているのでこれを開けてあげる必要がある。
※このポートを開ける作業をしないで、firewalldのサービス自体を止めてしまう事もできるが、それに慣れてしまうと本番環境のサーバでも同じような事をしてしまい事故る事になるので基本的にはちゃんとポート開放をする手順がいいと思われる
firewalldの起動有無を確認
まずfirewalldが動いているか?どうかは以下のコマンドで確かめられる。
[root@localhost ~]# firewall-cmd --state
running
動いていない場合、systemctl start firewalld.service
で起動できる。
firewalldの設定を確認する
今現在のfirewalldの設定を確認するには以下のコマンド。
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
8080ポートを開放する
恒久対応としたいので、以下のように設定をする(ちなみに、firewalldのhttpは80ポートの事なので、firewall-cmd --zone=public --add-service=http --permanent
などとしてもうまくいかないので注意)
8080ポートを開けるには直接8080ポートを開けるように設定する必要がある
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports: 8080/tcp ← 追加されている事が確認できる
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
※ちなみに、サービスとportの組み合わせ一覧はcat /etc/services
で確認できる(現実的にはcat /etc/services | grep http
等で使う)
SSH接続を公開鍵・暗号鍵方式に変更する
デフォルトの設定では以下のように、sshd_configの設定がssh接続時の認証をパスワードで行う設定になっている(PasswordAuthentication yes
)のでこれを変えると便利(以降の項でVS Codeからsshで接続して実際にちょっとしたWebアプリを作るがその時にパスワード認証をしていると手間になる)。
[root@localhost ~]# cat /etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
...
#PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
#PermitEmptyPasswords no
...
ホストOS側で公開鍵・秘密鍵を作成する
PS C:\WINDOWS\system32> cd ~/.ssh
PS C:\Users\user\.ssh> ssh-keygen -t ed25519 -C "{メアド}"
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\user/.ssh/id_ed25519): CentOS7.9-2009
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in CentOS7.9-2009.
Your public key has been saved in CentOS7.9-2009.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx {メアド}
The key's randomart image is:
+--[ED25519 256]--+
...
+----[SHA256]-----+
PS C:\Users\user\.ssh> cat C:\Users\user\.ssh\CentOS7.9-2009.pub
{ssh公開鍵}
PS C:\Users\user\.ssh> vim .\config
上記のような手順で公開鍵・秘密鍵のペアを作成し、公開鍵の方はメモしておく。
※vim .\config
では以下のような設定をしておくと便利。
Host CentOS7.9-2009
Hostname 192.168.56.2
User root
IdentityFile ~/.ssh/CentOS7.9-2009
※powershellでvimを使えるようにする方法はPowershellでvimを使うを参照。
ゲストOSでsshd_configの設定を変更し反映する
[root@localhost ~]# sudo vi /etc/ssh/sshd_config
[root@localhost ~]# systemctl restart sshd ## 再起動して設定を反映する
※sudo vi /etc/ssh/sshd_config
書き換える部分は、以下の2つ。
- #PubkeyAuthentication yes:コメントアウトを外して有効化する
- PasswordAuthentication yes:noに変更
ゲストOSで公開鍵を登録する
[root@localhost ~]# mkdir ~/.ssh
[root@localhost ~]# chmod 700 ~/.ssh
[root@localhost ~]# cd ~/.ssh
[root@localhost .ssh]# sudo vi authorized_keys
[root@localhost .ssh]# chmod 600 authorized_keys
※sudo vi authorized_keys
では、ホストOS側で公開鍵・秘密鍵を作成するでメモしていた公開鍵を書き込む(手動ではなく、ssh-copy-id -i ~/.ssh/id_rsa.pub <user name>@<ip address>
のようにコマンドでやる方が手っ取り早いかも)。
ホストOSからゲストOSへssh接続(公開鍵・暗号鍵方式)できるか?検証する
PS C:\Users\user\.ssh> ssh CentOS7.9-2009
Last login: Sun Nov 7 17:43:03 2021 from 192.168.56.1
[root@localhost ~]#
上記の通り接続できればOK。
OSの時刻設定
何も設定しないと「電源をオフ」をした時等にゲストOS側の時刻とズレてしまう事がある。そのため、Chronyを使って時刻を同期(日本時刻であればmfeedやNICTのサーバ時間に合わせる)の設定をする。
Chronyの設定は/etc/chrony.conf
に書かれているので、それに以下のように追加をする(iburst
オプションで短い間隔で4回ntpサーバに問合せを行い、時刻同期までの間隔を短くする事ができるが、『日本最古の公開NTPサービスが廃止へ、世界中からアクセスが殺到した深いワケ』のように負荷がかかるとサービスがなくなったりもするのでiburst
は設定しない方が良かったり・・・)。
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
server ntp.nict.jp <- ここを追記
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
あとはChronyが動いているか?を確認すればOK(起動してなければsystemctl start chronyd
で起動できる)。
[root@localhost ~]# systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2021-11-21 15:46:51 JST; 9min ago
VS CodeでWindowsからCentOS(ゲストOS)に接続する
今回はNode(Javascript)で開発する事を想定して、VS Codeをエディタとして使う事にする。
上記のssh接続を公開鍵・暗号鍵方式に変更するを行っているので以下のようなExtentionsを入れる事で簡単にCentOSに接続できる。
上記のExtentionsを入れると、以下のようにRemote Explorer
というメニューが表示されて、Targets
でSSH
が選択できるようになる。
このSSH Targets
に表示されるものは、windowsであればPS C:\Users\user\.ssh>
のconfig
に設定されている接続先が表示される。今回はCentOS7.9-2009
が先ほど作成したものなので、こちらに接続をすればいい。
※接続後はTerminal
はCentOSのbashになるので、開発に必要な各種ツールはVS Codeのbashから行うとコピペができたりして楽かもしれない。
CentOSに開発に必要そうなものを一式インストールする
Webアプリの開発という事を考えると、色々な意見はあるが以下は入れておいていい気がするので、以降はそれをインストールする手順についてみていく。
- git
- Node/npm/yarn
git
CentOS7系だと普通にsudo yum install git
としてしまうと、version1.xになってしまい少し古いものになる。
なので少し工夫が必要でIUS
というyumリポジトリを追加してあげてgitをインストールする。
[root@localhost ~]# yum install \
> https://repo.ius.io/ius-release-el7.rpm \
> https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@localhost ~]# yum install git224
[root@localhost ~]# git --version
git version 2.24.4
これでversion2.xがインストールできた。
※以下コピペ用
yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
Node/npm/yarn
Webアプリという事で、フロントエンドは少なくともReact(Next)・Vue(Nuxt)・Angularなどを使うと思われるので、Node.jsもインストールしておく事にする。
Nodeはversion管理が面倒だが、nodebrew
を使うと簡単なので今回はそれでNodeのインストールを行っていく。
[root@localhost ~]# curl -L git.io/nodebrew | perl - setup
[root@localhost ~]# vi ~/.bashrc
[root@localhost ~]# source ~/.bashrc
[root@localhost ~]# nodebrew ls-remote ## これでNodeのversionが表示されるのでインストールするもの(今回は v14.18.1)を決める
[root@localhost ~]# nodebrew install-binary v14.18.1
[root@localhost ~]# nodebrew use v14.18.1
[root@localhost ~]# node --version
v14.18.1
[root@localhost ~]# npm --version
6.14.15
[root@localhost ~]# npm i -g yarn
※上記ではyarn
も入れているが、npm
だけもよい(パッケージマネージャーに何を使うか?という決めの話)
※vi ~/.bashrc
では、以下のようにbashrcを書き換える
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export PATH=$HOME/.nodebrew/current/bin:$PATH
- 参考:nodebrew
docker/docker-compose
データベースがないWebアプリはない(と思う)ので、ローカルで開発する時にはコンテナイメージでデータベースを立ち上げたりできるようにdocker/docker-composeをインストールしておく。
dockerのインストール
公式の手順(Install Docker Engine on CentOS)に則りインストールしていく。
まずはOSを最新化する。
[root@localhost ~]# yum update
[root@localhost ~]# yum upgrade
次にdockerをインストールするための要件(OS requirements)をチェックする(基本デフォルトで登録済みで有効化されている)。
The centos-extras repository must be enabled.
[root@localhost ~]# cat /etc/yum.repos.d/CentOS-Base.repo
・・・
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
・・・
あとは公式の手順に沿ってインストールしていけばいい。
※1点、バージョンの指定の部分は20.10.9
みたいな感じになるが、これは以下のコマンドを実行した時の3:20.10.9-3.el7
から抜き出す。
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
利用可能なパッケージ
読み込んだプラグイン:fastestmirror
インストール済みパッケージ
docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stable
・・・
dicker-compose
公式の手順(Install Docker Compose)に則りインストールすればいい。
sudo(rootユーザ)以外でもdockerコマンドを実行できるようにする
Manage Docker as a non-root userに書かれている。