PhoenixServerインストール(CentOS編)

#概要
Ubuntu編のインストール手順をアップしたのですが、CentOSのインストール手順もアップしようと思います。

##手順サマリー
　1.AWSインスタンスの用意
　2.OSの基本設定/パッケージアップデートとサーバー再起動
　3.各種前提パッケージのインストール
　4.erlang/Elixirのインストール
　5.PostgreSQLの設定
　6.Elixirの初期設定/Phoenixサーバーの起動と設定

###1.AWSインスタンスの用意

使用したAMIは以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/c82e0d96-9ded-bdc1-e50c-7da782b73796.png)

画像だとOSのバージョンが分からないのですが、```CentOS Linux release 7.6.1810 (Core)```です。
インスタンスタイプはUbuntuのインストール時と異なり```t2.large```を指定しています。
理由ですが、途中でElixirをソースコンパイルしたのですが、
その際にメモリが不足している旨のエラーが出力されたためです(汗

###2.OSの基本設定/パッケージアップデートとサーバー再起動

ほぼほぼ、Ubuntuの時と変わらないです。

1.ホスト名の設定
2.selinuxの無効化
3.sudoユーザーの作成(パスワード設定含む/rootも一緒に設定)

```bash:ホスト名の設定
hostnamectl set-hostname <MyHostName>
```

```bash:selinuxの無効化
cp -p /etc/selinux/config /etc/selinux/config.org
vi /etc/selinux/config
```

```vim:config編集内容
1
2     # This file controls the state of SELinux on the system.
3     # SELINUX= can take one of these three values:
4     #     enforcing - SELinux security policy is enforced.
5     #     permissive - SELinux prints warnings instead of enforcing.
6     #     disabled - No SELinux policy is loaded.
7     # SELINUX=enforcing
追加   SELINUX=Disabled
8     # SELINUXTYPE= can take one of three values:
9     #     targeted - Targeted processes are protected,
10    #     minimum - Modification of targeted policy. Only selected processes are protected.
11    #     mls - Multi Level Security protection.
12     SELINUXTYPE=targeted
```

```bash:sudoユーザーの作成
useradd work01
passwd work01
```

```bash:ユーザーをwheelグループへ追加
usermod work01 -g wheel
```

Ubuntuの時と同様にここまで終了したら、パッケージを最新化して、再起動します。

```bash:パッケージの最新化と再起動
yum update -y
reboot
```
サーバーが起動してきたら、以下のコマンドを実行し、実行結果が```Disabled```と表示されることを確認します。

```bash:Selinuxの有効化確認
$ getenforce
Disabled
```

###3.各種前提パッケージのインストール

この後の導入手順でepelリポジトリが必要になるので追加します。

```bash:epelリポジトリの追加
sudo yum install epel-release -y
```

```bash:リポジトリの最新化
sudo yum -y update && sudo yum -y upgrade
```

```bash:PostgreSQLのインストール
sudo yum install postgresql-server postgresql postgresql-contrib -y
```

```bash:inotify-toolsのインストール
yum install inotify-tools -y
```

```bash:各種Erlang用の依存パッケージなど必要なパッケージインストール
sudo yum install gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git -y
```

```bash:wxbaseライブラリの追加
sudo yum install wxBase.x86_64 -y
```

```bash:wgetの追加
sudo yum install wget -y
```

###4.erlang/Elixirのインストール

erlangインストール用のリポジトリが用意されていますのでそちらを落とします。

```bash:Erlangリポジトリダウンロード
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
```

```bash:Erlangリポジトリの追加/必要パッケージのインストール
sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
```
ちなみに私はこのタイミングで1回```reboot```を実行しました。

```bash:Erlangのインストール
sudo yum install esl-erlang -y
```

ここまででErlangのインストールに成功したので、次はElixirのインストールを行います。

まずはElixirを配置するためのディレクトリを作成します。

```bash:Elixir用ディレクトリの作成
sudo mkdir /opt/elixir
```

GitからElixirの最新版リポジトリをクローンします。

```bash:Elixirリポジトリのクローン
sudo git clone https://github.com/elixir-lang/elixir.git /opt/elixir
```

クローンが完了したら、ディレクトリを移動して、Elixirをソースコンパイルします。

```bash:ディレクトリ移動/ソースコンパイル
cd /opt/elixir
sudo make clean test
```

上記のコマンドを実行するとコンパイル後にElixirの各種コマンドに対するテストが行われます。
それが完了したら、以下のコマンドでシンボリックリンクを作成して、パスが通るようにします。

```bash:Elixir用のシンボリックリンク作成
sudo ln -s /opt/elixir/bin/iex /usr/local/bin/iex
sudo ln -s /opt/elixir/bin/mix /usr/local/bin/mix
sudo ln -s /opt/elixir/bin/elixir /usr/local/bin/elixir
sudo ln -s /opt/elixir/bin/elixirc /usr/local/bin/elixirc
```

Elixirが導入されたことを確認するため、以下のコマンドを実行します。

```bash:Elixirのバージョン確認
elixir -v
```

バージョンが表示されればElixirのインストールに成功してます。OKです。

###5.PostgreSQLの設定

Ubuntuの時と同様にpostgresユーザーのパスワードを設定したいところなのですが、
CentOSの場合、起動するまでに少し手間が必要でしたので、記載しておきます。

```bash:PostgreSQLの初期化
postgresql-setup initdb
```

上記を実行しないとPostgreSQLのサービスを起動できませんでした。
あと、Ubuntuの時と違う手順になるのですが、PostgreSQLのローカル認証メソッドを
```Ident```から```md5```に変更しておきます。

```vim:/var/lib/pgsql/data/pg_hba.confファイルの変更
 81   # IPv4 local connections:
 82   #host    all             all             127.0.0.1/32            ident
 追加   host    all             all             127.0.0.1/32            md5
 83   # IPv6 local connections:
 84   #host    all             all             ::1/128                 ident
 追加   host    all             all             ::1/128                 md5
```

```bash:PostgreSQLのサービス起動
sudo systemctl start postgresql
sudo systemctl enable postgresql
```

以下のコマンドを実行して、PostgreSQLのサービスが起動していることを確認します。

```bash:postgresqlサービスの状態確認
sudo systemctl status postgresql
```

サービスが確認した後、改めて、postgresユーザーのパスワードを変更します。

```bash:Postgresユーザーのパスワード変更
sudo -u postgres psql -c "ALTER USER postgres PASSWORD '<YourPassword>';"
```

Ubuntuの時と同様に```ALTERROLE```が表示されれば、パスワードが変更されたことを意味します。

###6.Elixirの初期設定/Phoenixサーバーの起動と設定

こちらの手順はほぼUbuntuの時と同じになります。
ここまでの手順でElixirをコンパイルしたフォルダにいると思いますので、
別のフォルダに移動しておきます。(私の場合、work01ユーザーのホームに移動しています)

```bash:ディレクトリの移動
cd
```

```bash:Hexのインストール
mix local.hex
```

唯一、Ubuntuと違う点なのですが、Elixirをシンボリックリンク作成でパスを通したため、
sudoを使用するとコマンドが見つからなくなりますので、mixを実行する際はsudo不要です。

Hexのインストールが完了したら、次にPhoenixをダウンロードし、ビルドします。

```bash:Phoenixのインストール
mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez
```

Phoenixのプロジェクトを作成します。

```bash:Phoenixプロジェクト作成
mix phx.new <YourProjectName>
```

プロジェクトのディレクトリに移動して、DB作成のタスクを実行します。

```bash:ディレクトリ移動
cd <YourProjectName>/
```

```bash:DB作成
mix ecto.create
```

これはUbuntuの時も同じでしたが、やはり、```"plug_cowboy dependency missing"```の
問題が発生しますので、予め解消しておきます。

```bash:設定ファイルの編集
sudo cp -p <YourProjectName>/mix.exs <YourProjectName>/mix.exs.org
sudo vi <YourProjectName>/mix.exs
```

```vim:編集内容
 31   # Specifies your project dependencies.
 32   #
 33   # Type `mix help deps` for examples and options.
 34   defp deps do
 35     [
 36        {:phoenix, "~> 1.3.4"},
 37        {:phoenix_pubsub, "~> 1.0"},
 38        {:phoenix_ecto, "~> 3.2"},
 39        {:postgrex, ">= 0.0.0"},
 40        {:phoenix_html, "~> 2.10"},
 41        {:phoenix_live_reload, "~> 1.0", only: :dev},
 42        {:gettext, "~> 0.11"},
 43        {:cowboy, "~> 1.0"},
 追加       {:plug_cowboy, "~> 1.0"}
 45        ]
 46        end
```

設定の編集が終わったら、ライブラリの読み込みを実施します。

```bash:deps.getコマンド
mix deps.get
```

そして、ここでUbuntuの時と同様に、node.jsとnpmコマンドのインストール、
アセットのダウンロードまで実施しておきます。

```bash:node.jsインストール
sudo yum install nodejs -y
```

```bash:npmインストール
sudo yum install npm -y
```

```bash:アセットのダウンロード
cd assets && npm install
```

そして、ここまでが終わったら、以下のコマンドでPhoenixを起動します。
注意ですが、アセットをダウンロードするためにassetsフォルダに移動しているため、
以下のコマンドは```cd ..```で階層上がってから実行してくださいね。

```bash:Phoenixの起動
mix phx.server
```

セキュリティグループはもう大丈夫だと思いますので割愛します。
Webブラウザから4000番でアクセスするとPhoenixサーバーが起動していることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/0f4a2fc9-bb6f-e46f-3e42-7fb4b648bbfe.png)