Node.js
Apache
AWS

PrivateSubnetからApacheを用いてnodeを動かす

やりたいこと

超ざっくりした画像ですが、やりたいこととしては、
・ Apacheをリバースプロキシとして80番で待ち受けて3000番のNodeを動かしたい

AWSのEC2インスタンスを作成してプライベートサブネット間で疎通確認ができている状態からスタートします。

メモとして残しますが、何かあればコメントお願いします。

スクリーンショット 2018-07-12 17.08.52.png

Apacheのインストール

sudo yum -y install httpd
sudo service httpd start

基本的なコマンドたち

// Apacheを起動する
$ service httpd start
// Apacheを停止する
$ service httpd stop
// Apacheを再起動する
$ service httpd restart

バージョンの確認

$ httpd -v
Server version: Apache/2.4.33 ()

メモ

sudo つけないと怒られる
The name org.freedesktop.PolicyKit1 was not provided by any .service files

nodebrewのインストール

nodebrewをインストールすると、nodeのバージョンを簡単に切り替えられる

curl -L git.io/nodebrew | perl - setup
export PATH=$HOME/.nodebrew/current/bin:$PATH
source ~/.bashrc

nodeのインストール

nodebrew install stable
nodebrew use stable
node -v

npmのインストール

Node Package Managerのこと
予め用意された便利な機能をまとめたもの。

sudo yum install npm
npm -v

expressのインストール

Express は、Web アプリケーションとモバイル・アプリケーション向けの一連の堅固な機能を提供する最小限で柔軟な Node.js Web アプリケーション・フレームワークです。
無数の HTTP ユーティリティー・メソッドとミドルウェアを自由に使用できるため、堅固な API を迅速かつ容易に作成できます。
Express は、ユーザーが使い慣れている Node.js の機能をわかりやすくし、基礎的な Web アプリケーション機能をシンプルな階層で提供します。

http://expressjs.com/ja/ より

$ npm install express --save

ハマった

インストールできなかった😓

npm WARN saveError ENOENT: no such file or directory, open '/home/ec2-user/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/home/ec2-user/package.json'
npm WARN ec2-user No description
npm WARN ec2-user No repository field.
npm WARN ec2-user No README data
npm WARN ec2-user No license field.

npm initしないといけないみたい

npm initはprojectの初期設定を行うためのcommand
実行すると対話形式で項目を入力して、package.jsonを作成する。

npm init

参考:https://qiita.com/sinmetal/items/395edf1d195382cfd8bc

これで再度 expressのインストールを行う
WARN出たらこちらを参考にする:https://helen.hatenablog.com/entry/2016/05/22/003057

成功

npm install express --save
+ express@4.16.3
updated 1 package and audited 119 packages in 3.162s
found 0 vulnerabilities

apacheからnodeへproxyする

$ sudo vi /etc/httpd/conf/httpd.conf
httpd.conf
<IfModule mod_proxy.c>
    ProxyPass / http:// {IP} :3000
    ProxyPassReverse / http:// {IP} :3000
</IfModule>

設定を反映

$ service httpd restart

nodeを起動

$ node /var/www/node/app.js
Example app listening on port 3000!

3000番ではなく80番で問い合わせてみる

$ curl http://XXX.XXX.X.XX:80
// ちゃんと帰って来ることを確認
Hello World!

3000番では帰ってこないことを確認

$ curl http://XXX.XXX.X.XX:3000

END🚀