概要
Vagrantを利用してAmazon Linux上に Node.js の実行環境を構築します。
ローカル環境での利用が前提ですが、運用時に必要なOSの基本設定等も行っています。
環境
- Mac OS X Sierra 10.12.6
- Vagrant 2.0.0
- VirtualBox 5.1.30r118389
MacOS上にVagrantを使ってVirtualboxを立てその中に環境構築しています。
OSイメージはAmazon Linuxのこちらを利用。
OSの基本設定
以下の基本設定を行います。
- OSの各パッケージの最新化(yumアップデート)
- タイムゾーンの設定
- ロケールの設定
- swap領域の確保
- ユーザの追加
- pv6の無効化
OSの各パッケージの最新化(yumアップデート)
$ sudo yum -y update
少し時間がかかります。
タイムゾーンの設定
タイムゾーンがUTCになっているので、JST(日本時間)に変更します。
変更前を確認。
$ date
Sun Oct 29 08:06:29 UTC 2017
1.インスタンスで使用する時間帯を検索
Japanがあることを確認します。
$ ls /usr/share/zoneinfo/
Africa Brazil Egypt GB-Eire HST Japan Navajo posixrules Turkey zone1970.tab
America Canada Eire GMT Iceland Kwajalein NZ PRC UCT zone.tab
Antarctica CET EST GMT0 Indian Libya NZ-CHAT PST8PDT Universal Zulu
Arctic Chile EST5EDT GMT-0 Iran MET Pacific right US
Asia CST6CDT Etc GMT+0 iso3166.tab Mexico Poland ROC UTC
Atlantic Cuba Europe Greenwich Israel MST Portugal ROK WET
Australia EET GB Hongkong Jamaica MST7MDT posix Singapore W-SU
2.clockファイルの変更
$ sudo vi /etc/sysconfig/clock
以下でファイルを編集します。
ZONE="Japan"
UTC=true
3.インスタンスが参照するタイムゾーンファイルの参照先を指定
インスタンスが現地時間情報を参照する際に、時間帯ファイルを読み込むためシンボリックリンクをはります。
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
4.再起動
$ sudo reboot
5.日本時間になっているか確認
$ date
Sun Oct 29 17:38:05 JST 2017
ロケールの設定
初期設定では以下の通りになっています。
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
1.ja_JP.UTF-8に変更
$ sudo vi /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
2.rebootして再度確認
$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
swap領域の確保
Amazon Linuxはデフォルトでは、swap領域が確保されていません。
Linuxは、メモリ不足でシステムが停止する恐れがある際、メモリを多く消費しているプロセスを強制的に停止するという特徴があります。(これをOOMkillerと言います。)
これが発生すると非常に面倒なので、保険として swap領域を確保しておくと良いでしょう。
どのくらい確保するかは こちら を参考にします。
※ 下記に分かりやすくまとめたてくれている記事があるのでこちらも載せておきます。
http://server.etutsplus.com/allocate-swap-space/
今回、物理メモリは1GBで作成しているので、それの2倍の2GB(2048MB)のswap領域を作成します。
swap領域はあくまでOOM Killerを動作させない為の保険です。
常にswap領域を使用しているような状態はそもそも良くないので、サーバのメモリ容量を増やすか、メモリの使用量を下げる対応を行う事が基本です。
1.swap領域の確認
$ free -m
total used free shared buffers cached
Mem: 995 243 751 0 13 169
-/+ buffers/cache: 60 934
Swap: 0 0 0
2.swap領域の確保
$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=2048k
2097152+0 records in
2097152+0 records out
2147483648 bytes (2.1 GB) copied, 2.68645 s, 799 MB/s
3.ファイルのアクセス権を変更する
パーミッションを変更しないと後述の swapon
コマンドを実行した際にwarningが発生しますので、
作成したファイルに対して、600
(作成者であるrootユーザのみ読み書きができる)を指定します。
$ sudo chmod 600 /swapfile
4.swap領域を作成
$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=528f77eb-a23c-48e6-803d-f22c491c6438
5.swap領域の有効化
mkswapで作成しただけでは利用できないため、有効化します。
$ sudo swapon /swapfile
swap領域が作成されていれば、完了です。
$ free -m
total used free shared buffers cached
Mem: 995 927 67 0 15 820
-/+ buffers/cache: 91 904
Swap: 2047 0 2047
ユーザの追加
Amazon Linuxはデフォルトでec2-userが存在し、22番ポートでSSH接続が可能になっています。
これはAWSを利用している人であれば誰もが知っている事なので不正アクセスの対象になりやすい為、
セキュリティ対策として新しくユーザを作ってそのユーザでSSH接続を出来るように設定を行います。
※ この記事では vagrant を利用しているので、ec2-user は存在しませんが、
実運用の際は必ず行っておいたほうが良い手順です。
なお、新しいユーザでSSHログインを確認した後は ec2-user も削除しておいたほうがセキュリティ的には安全です。
1.新しいユーザーを追加
[ec2-user@localhost ~]$ sudo useradd newuser
2.新しいアカウントに切り替え
[ec2-user@localhost ~]$ sudo su - newuser
[newuser@localhost ~]$
3..ssh ディレクトリを作成
newuser ホームディレクトリに .ssh ディレクトリを作成し、
そのファイルのアクセス許可を 700 (所有者のみ、読み取り、書き込み、削除が可能) に変更します。
[newuser@localhost ~]$ mkdir ~/.ssh
[newuser@localhost ~]$ chmod 700 ~/.ssh
4.authorized_keysを作成
authorized_keys という名前のファイルを .ssh ディレクトリに作成し、
そのファイルのアクセス許可を 600 (所有者のみ、読み取りおよび書き込みが可能) に変更します。
[newuser@localhost ~]$ touch ~/.ssh/authorized_keys
[newuser@localhost ~]$ chmod 600 ~/.ssh/authorized_keys
5.公開鍵と秘密鍵の作成
鍵を作成する際に、パスフレーズの入力を求められます。
ここで入力したパスフレーズはSSH接続の際に必要となり、セキュリティが高まることになります。
ただし、パスフレーズを忘れてしまった場合など、二度と接続できないことになるため、
実運用では設定しないことがほとんどです。ファイヤーウォールとかの別の手段でセキュリティ強化する事が多いです。
[newuser@localhost ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/newuser/.ssh/id_rsa):/home/newuser/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/newuser/.ssh/id_rsa.
Your public key has been saved in /home/newuser/.ssh/id_rsa.pub.
The key fingerprint is:
e1:3a:7f:e0:8b:6f:08:b1:b8:0f:00:71:7b:e1:3a:7a newuser@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|. . . |
| o o . |
|. . o . |
|. o. . . |
|. o. o S |
| o..o .. |
|. E. .oo . |
| ... .+o . |
| .. .o+o |
+-----------------+
6.生成した公開鍵を authorized_keys ファイルに設定
[newuser@localhost ~]$ cd .ssh
[newuser@localhost ~ .ssh]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
7.秘密鍵をローカルPCにダウンロードしてSSH接続
先程作成した ~/.ssh/id_rsa
の中身を何らかの手段でローカルPCにコピーします。
下記のようなのファイルが生成されているので、ローカルPCの ~/.ssh
ディレクトリにコピーします。
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,0EE321561C1FA9449566B82ED286E69E
FRgRD5MK7ZjseCqph+LmBUB07qGUAKBkwnwrlVVmijvJ12F3DS8HhQ9Lp9u+8YMR
6FQPUuy70dZvXD5lDPD92D+Fw4wu2cOjPVVsDeo3aTJYaqYg1HD2C+ZHQZf5ieMW
AOK9LbvnUv6ZfQDztushRYXYdlidtq21w33WKYFk7kUUlo7Zs9Pe4N5uTTtf8F6Z
27Q+DgxcdIgEsoLchyLwSDfcCdNNZLJflGGYVdFL29c3eNIOVCPxZ9vevu3uD7XY
LwKs4uheDMV9+t3aUoCCu0WGKJZJLO2WnI88NTnfvdcRHrzYfh5v68TGYuyAhREB
ERJ/xea12jyWt7OmDS2Nj/cmXI5Avv+B4sKRGyG7he+YiobHRY/GrG0p7vNwBOte
YtBD9ruq2Aqs9KG7moQj1IPHRLvPpfQb0q1xC2HYFo6CjrQAue9qRI3yhLBDh81r
mQi7zJISvxgM+J5rdY+C4QF8SrFVSzB6HcJ/RoEeNK72ZcEtQgMU0fqZlEVT7UO2
a2Q9Ndz4/GjWzPmWw8l9Mt7NDGlzNtqgzMtEPDhdzEco82GBFdVhoS5kHsDUBSJl
7suldDqCiwhmr+DlLts34yTmoqGpkaPyiOBHqr+LHDDfvlkCPgTda8iu8rGTM+r3
mTb9smr4ElS7eyxfke+WtR6mZeya7xk528Ht7+zZtxBZUkMCFHwPvC0Y0ICjgMfx
Yetcl0yLb7IMiiu63L884m5dML9+hGWDWaKYBspN5sUFG77DZphewafx2oPny0io
FT4BAmETwcL8utl0qovcB5HyjVjRW5Z+LUcmJGqjzuYGB8BGFMbcGxkS7ptELHHf
Gr8hMhnpIu4MLrr9OSZdQCg1eujUKvlap7y2+cqhT7pZa541bEAWZVPX2AUXfL0u
/RuR5mdTzCZXjG2WoqgoG71PgLy0gNZt2wRLSITGdFMr5XBITfyvD3GU6cbJM2RU
rvbZQhPVXdoVsp6pIJYbT0ZK9e/MO/XmgJSe3iV1HP0ALv3wXkHdJcdleQ+WEGbi
2HtLfaxYht1OYDo2W3q5ZzWxJFlNTq/thNYqDMFjUeWJdw4fK6dKghxkZIUO2TE6
TXjNiDr15iiC+RZ8xJL+19YDonz4l1sfJ0Tzt0dpP+7HxSvVbhw0fXiJAzKay8RO
lR9Y7eh8rltnYZAywSRp4mzYc+e8IbptK5cN3f6k9j2IahnP7YpHtbnQ1O9RlKGR
Swr0pK7tAqXXyznv0nUmQEobS0rrodi8XM9bZLVNhbodhNyVmQjWCxuy0RI7fZYM
Vet9yxzo2gWaGe+UpVicMPaTm54fwImFWi0/J9bWNp54euiLm3mm43GHqAPx6hUC
kvDAKrwb4Yx+S3aqIw6eay2mPjUeMrH/1l23WBIfzdbSWVLZnY8mWyufnN+I0c8w
fOnoRczRg9bJzXCxCcq3Znu7fMNK6jspJgfUCOJ2YR0bXDQBqOl5By+ikKM757f6
5JiRGjVHIuJP9NjOtDZriVwweKtX5SrlBYhCIafkIcQ10Gj/mHI5p060BBDga2Dt
BcwkA3BUPK2yBiTMuuuTC9W2kzicVz672UTSYwOMyrzui0H/ZFQE5lwGXTdmlmT9
-----END RSA PRIVATE KEY-----
例えば、vagrant_ec2.pem
という名前で秘密鍵をコピーして MacOSの ~/.ssh
に保存します。
※ chmod 600 ~/.ssh/vagrant_ec2.pem
を実行して権限を変更するのを忘れないようにしましょう。
以下のコマンドでSSH接続が出来るか確認を行います。
ssh -i /Users/sato/.ssh/vagrant_ec2.pem -p 2222 newuser@127.0.0.1
※ 127.0.0.1の部分は作成しているサーバのIPに合わせて下さい。
IPv6の無効化
IPv6を利用しないの前提であれば IPv6関連の機能を停止させておいたほうが良いと思います。
$ /sbin/chkconfig --list
ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
1.ネットワークの設定ファイルを変更
$ sudo vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
NOZEROCONF=yes
NETWORKING_IPV6=no
2.IPv6をベースとしているサービスの自動起動を無効化
$ sudo chkconfig ip6tables off
Node.jsのインストール
Node.js はバージョンアップの頻度が非常に早いので、バージョンの切り替えが簡単に出来るように nodebrew というツールを利用します。
nodebrewのインストール
https://github.com/hokaccha/nodebrew
1.ヘルプに従ってインストール
$ curl -L git.io/nodebrew | perl - setup
=======================================
Export a path to nodebrew:
export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
2.nodebrewパスの追加
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
エラーとならなかったら、完了です。
nodebrew help
Node.jsのインストール
1.最新版をインストール
$ nodebrew install-binary latest
3.インスロール済みのバージョンを確認
$ nodebrew list
v9.0.0
current: none
4.有効化
$ nodebrew use v9.0.0
use v9.0.0
バージョンを確認します。エラーにならなければ、完了です。
node -v
v9.0.0
参考記事
https://qiita.com/drapon/items/2fc5b21a9cdc31ddb152
https://www.closetoyou.jp/aws/how-to-add-swap/
http://blog.genies.jp/2011/08/amazon-ec2-amazon-linux.html