y's note

ソフトやゲームの作成の開発に関することを書いていきます。

OpenShiftでApplication is not availableと出てしまう

今まで使っていたOpenShift Online v2が9月30日に終了してしまう(以下v2)とのことなので、次世代のバージョンとなるOpenShift Online v3(以下v3)に移行したんですが、そこでつまずいてしまいました。

<追記 9/15 16:04>
記事名を修正しました。

待機するポート、IPの設定ミスが原因?

登録後、まずそのままデータを移してみたんですが、このエラーが発生したのかPodsの部分が黄色→赤色になって上手く行きませんでした。
当然ながら開くとエラーが出ます。
(画像はエラーがなかったときのものです)
f:id:pwjtn527:20170912155845p:plain

f:id:pwjtn527:20170912144513p:plain
今回悩まされた"Application is not available"

どうやら、サーバーサイドのスクリプトのこの部分がいけなかったようです。

//(略)
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の色はちゃんと青くなりましたが、開くと相変わらずこの文字列が…
f:id:pwjtn527:20170912144513p:plain
数日間悩みましたが、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)
f:id:pwjtn527:20170912150023p:plain
Nameの部分をクリックした後、右上のActionsから、Editをクリックします。
下の画像のように、Securityの部分の"Secure route"にチェックを入れます。
f:id:pwjtn527:20170912151502p:plain
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"になっているのが分かると思います。
f:id:pwjtn527:20170912153216p:plain

この後アクセスすると、エラーが出なくなり、https通信も行えるようになりました。