OpenShiftでApplication is not availableと出てしまう
今まで使っていたOpenShift Online v2が9月30日に終了してしまう(以下v2)とのことなので、次世代のバージョンとなるOpenShift Online v3(以下v3)に移行したんですが、そこでつまずいてしまいました。
<追記 9/15 16:04>
記事名を修正しました。
待機するポート、IPの設定ミスが原因?
登録後、まずそのままデータを移してみたんですが、このエラーが発生したのかPodsの部分が黄色→赤色になって上手く行きませんでした。
当然ながら開くとエラーが出ます。
(画像はエラーがなかったときのものです)
どうやら、サーバーサイドのスクリプトのこの部分がいけなかったようです。
//(略) var port = process.env.OPENSHIFT_NODEJS_PORT || 3000; var ip = process.env.OPENSHIFT_NODEJS_IP || 'localhost'; //(略) app.listening(port,ip);
サンプルを参考にして、このように書き換え。
//(略) var port = process.env.PORT || process.env.OPENSHIFT_NODEJS_PORT || 8080; var ip = process.env.IP || process.env.OPENSHIFT_NODEJS_IP || '0.0.0.0'; //(略) app.listening(port,ip);
ルーティング設定がダメ?
Podsの色はちゃんと青くなりましたが、開くと相変わらずこの文字列が…
数日間悩みましたが、v2の時に書いたこの部分が怪しい…
//httpsへのリダイレクト app.use(function(req,res,next) { if (req.headers.host == 'localhost:8080') { next(); } else { var proto = req.headers['x-forwarded-proto']; if (proto !== undefined) { proto = proto.toLowerCase(); } if (proto === 'https') { next(); } else { res.redirect('https://' + req.headers.host + req.url); } } });
コメントの通り、この部分は普通のhttpリクエストが来た際、安全なhttps接続にリダイレクトする処理です。
因みにローカルでの検証時は適用しないようにしてあります。(上の部分)
この記述を消すと…httpsでは例のエラーが出てしまうものの、httpではちゃんと自分が作ったWebアプリが動くではありませんか!
しかし、このhttpsに移行しようという流れに逆らえないぞ…
と思った数秒後、以前から怪しいなと思っていたルートの設定に行きました。(左のメニューでApplications→Routes)
Nameの部分をクリックした後、右上のActionsから、Editをクリックします。
下の画像のように、Securityの部分の"Secure route"にチェックを入れます。
TLS Terminationの部分はどれでも良いと思います。
Insecure Trafficの部分は、
None: httpリクエストが来た場合でも何もしない、(上のようなhttpsには繋がらないということはありません) Allow: httpリクエストが来た場合、強制的にhttpsに切り替える。 Redirect: httpリクエストが来た場合、httpsにリダイレクトさせる。
AllowとRedirectは内容は同じですが、https通信に切り替えるタイミングが違います。
見栄え的には画面が真っ白にならない"Allow"が一番おすすめです。(Noneはセキュリティ的におすすめできません)
<追記(9/12 18:05)>
"Allow"だと、https通信にならないことがあるので、"Redirect"が一番おすすめです。
Saveをクリックして、設定を反映させます。
設定後、ルート設定のトップページに行くと、"http"の部分が"https"になっているのが分かると思います。
この後アクセスすると、エラーが出なくなり、https通信も行えるようになりました。