事情は次のようになっています。皆さんもご存知の通り、私のメインブログは、毎回ビルドする際にいくつかの動的なコンテンツと最適化が関わるため、ZEIT のサーバーにホストされています。具体的には、ビルド時にはスクリプトを使用してローカルのNodeJS
サーバーを起動し、Jekyll
が RPC を介して指示や結果を呼び出します。私はランダムにNodeJS
サーバーにポート番号5001
を設定しましたが、この設定は 1 年以上安定して動作しています。
そして、約 1 年前から、ZEIT はブログのビルドプロセスでランダムにエラーを報告し始めました。内容は HTTP リクエストが HTTPS サーバーに送信できないというものでした。私は困惑しました。まず、私の NodeJS サーバーは HTTP サーバーであること、そしてそれはビルドプロセス中のローカルの一時的なサーバーであり、オンラインになるとこのサーバーは閉じられるため、HTTP を使用する必要がないということです。しかし、これらは重要ではありません。重要なのは、ブログが正しくビルドされてオンラインにならなかったことです。そのため、原因を調査し始めました。最初に考えたのは、何らかの理由でExpress
が強制的に HTTPS をデフォルトに設定しているのではないかということでした。理論的にはそれはあまり可能性がないですが、現在のソフトウェアはセキュリティのために何でもできるようになっています。しかし、調査した結果、そのようなことは起こっていないことがわかりました。それから、ZEIT がセキュリティのためにすべての HTTP 接続を HTTPS にプロキシしているのではないかと考えました。
そのため、ZEIT のエンジニアにメールを送る前に、私のメールの主張を裏付けるために最小限の再現可能なプロジェクトを作成することにしました。しかし、最も奇妙なことが起こりました。同じ設定、同じバージョンで、私のブログのビルドプロセスではエラーが発生しますが、新しいプロジェクトでは何の問題もありません。さらに、私のブログのビルドエラーは安定してトリガーされるわけではなく、最初は 10% の確率でトリガーされ、後には 90% の確率でトリガーされますが、いずれも 100% ではありません。この時点で、私は少し崩れそうになっていました。
その後、何度も試行錯誤しました(何が間違っているのかさえわからないので)。突然、頭が働かなくなり、ポート番号を5001
から4001
に変更しました。すると、ビルドが成功しました...
つまり、実際には私のサーバーは常に正常に起動しておらず、ZEIT には常に5001
のサービスが実行されていました... しかし、なぜ5001
ポートが占有されていることがドキュメントに書かれていないのでしょうか?私は全世界を検索しても、ZEIT が5001
ポートを占有する情報は見つかりませんでしたし、しかもランダムに占有するのですか?時々占有され、時々占有されないのですか?
したがって、私が約 1 年間悩まされていたこの問題は、ポートを変更することで解決しました...