サーバーをNode.jsにしたい気持ちが高まる

現在、サーバー側はPHPで動いているのですが、いずれNode.jsにして、すべてをJavascriptで動く環境にしたいと思っています。結構な時間をかけてPHPの処理を書いていると、そのうちJavascriptに書き換えることになるのに、どうしてこんなに力を入れてPHPを書いてるんだろうという気持ちになってしまいます。

その思いが重なり重なり、いよいよNode.jsの本でサーバー側の処理を勉強し始めました。ちょっと読んだ感じでは、それほど難しい印象は持たなかったので、比較的簡単にNode.jsで動くページを作成できるかもしれません。しかし現在動いているログインやプッシュ通知など、手間のかかるシステムをNode.jsに置き換えるのは楽じゃないと思うので、サーバー側を短時間に一新することは現実的にできそうにありません。

そこで一部のページから徐々に置き換えていくことを考えたのですが、そうした場合にApacheとNode.jsを同居させなければなりません。この構成で運営されている方はすでにいるようなので、やり方については調べがついたのですが、問題はドメインやサブドメイン単位ではなく、ページ単位でサーバーを振り分けることができるのかということと、SSLが問題なく動くのかわからないという点です。

Node.jsにnode-http-proxyというパッケージがあって、それを利用すればサーバーを振り分けられることまではわかったのですが、ページ単位での振り分けについてはネットに書かれていませんでした。さらにこの前、設定したLet’s EncryptのSSLですが、これがNode.jsのサーバー上でも普通に動いてくれるのかわからないのです。

本当にもうわからないことだらけなんですが、そもそもの話、Web系って覚えること多すぎないですか?範囲が広いのに、一人であらゆることに対応しなければならないので、そろそろ頭がパンクしそうです。

まさか、無料でSSLが利用できるなんて!

ある日突然、Chrome の console に以下のような表示が出ていました。

The certificate used to load https://gameusers.org/app/pay uses an SSL certificate that will be distrusted in Chrome 66. Once distrusted, users will be prevented from loading this resource. See https://g.co/chrome/symantecpkicerts for more information.

Google 翻訳
https://gameusers.org/app/payをロードするために使用された証明書は、Chrome 66で信頼されないSSL証明書を使用します。一度信頼されないと、ユーザーはこのリソースを読み込むことができなくなります。詳細については、https://g.co/chrome/symantecpkicertsを参照してください。

 

調べてみたところ、過去に発行されたシマンテックの証明書に問題があるらしいです。Game Users で使っている Rapid SSL もダメとのこと。

シマンテックの証明書に対してGoogleからの制裁が確定した話

2018年3月15日までに証明書を新しいものに書き換えないといけないみたいです。Rapid SSL は他の高価な証明書に比べると格安で良かったのですが、どうせ更新するならと、他にも新しい発行業者が出ていないか調べてみました。すると「Let’s Encrypt 」という無料で利用できるとうたっているサービスを発見。さすがに無料は怪しいだろと思ったのですが、サイトを見てみるとこのように書かれています。

非営利団体の ISRG (Internet Security Research Group) が運営しており、シスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体が、ISRG のスポンサーとして Let’s Encrypt を支援しています。

どこかで聞いたことのある名前ばかり。疑念が払拭されたので、これを利用してみよう、仮にまともに使えなかったとしても無料だし、試してみる分には問題ないだろうということで、VPS (Cent OS6) で利用してみました。

 

使い方はここにすべて書いてあります。

 

  • EPEL リポジトリを有効にする
yum install epel-release
  • certbot-auto を拾ってきて実行
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto

以下、certbot 実行時の黒い画面の文字、Google の翻訳も英文の下に載せておきます。

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): メールアドレスを入力
/opt/eff.org/certbot/venv/lib/python2.6/site-packages/acme/jose/jwa.py:110: DeprecationWarning: signer and verifier have been deprecated. Please use sign and verify instead.
  signer = key.signer(self.padding, self.hash)

電子メールアドレスを入力してください(緊急更新およびセキュリティ通知に使用されます)( 'c'を
キャンセル):メールアドレスを入力
/opt/eff.org/certbot/venv/lib/python2.6/site-packages/acme/jose/jwa.py:110:DeprecationWarning:署名者と検証者は廃止されました。代わりに標識を使用して確認してください。
  署名者= key.signer(self.padding、self.hash)


-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory

利用規約をご覧ください
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf。同意する必要があります
ACMEサーバーに登録するには
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A(Agree / 同意します)

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.

あなたは電子フロンティアとあなたの電子メールアドレスを共有したいですか?
財団は、Let's Encryptプロジェクトの創設パートナーであり、非営利団体でもあります。
Certbotを開発する組織ですか? EFFについてのメールをお送りしたいと思います
ウェブを暗号化し、ユーザーを保護し、デジタル権利を守るための私たちの仕事。
-------------------------------------------------------------------------------
(Y)es/(N)o: Y(Yes / はいを選択)


Which names would you like to activate HTTPS for?
HTTPSをどの名前で有効にしますか?
-------------------------------------------------------------------------------
1: gameusers.org
2: www.gameusers.org
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
1(gameusers.org は www を利用していないので1を選択)

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for gameusers.org
Waiting for verification...
Cleaning up challenges
Deploying Certificate for gameusers.org to VirtualHost /etc/httpd/conf.d/ssl.conf


Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
HTTPトラフィックをHTTPSにリダイレクトするかどうかを選択し、HTTPアクセスを削除してください。
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.

1:リダイレクトしない - ウェブサーバーの設定をこれ以上変更しないでください。
2:リダイレクト -  HTTPSアクセスを保護するためにすべての要求をリダイレクトします。これを選択してください
新しいサイト、またはあなたのサイトがHTTPSで動作することを確信している場合。これを元に戻すことができます
Webサーバーの構成を編集して変更します。
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
2(リダイレクトする設定を選択したら失敗しましたと出ました。
すでに .htaccess で http へのアクセスを
すべて https に飛ばしているので
この設定は必要なかったのかもしれません)

Failed redirect for gameusers.org
Unable to set enhancement redirect for gameusers.org
Unable to find corresponding HTTP vhost; Unable to create one as intended addresses conflict; Current configuration does not support automated redirection

gameusers.orgのリダイレクトに失敗しました
gameusers.orgのエンハンスメントリダイレクトを設定できません
対応するHTTP仮想ホストを見つけることができません。意図したアドレスが競合しているため作成できません。現在の設定では、自動リダイレクトはサポートされていません


IMPORTANT NOTES:
 - We were unable to set up enhancement redirect for your server,
   however, we successfully installed your certificate.
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/gameusers.org/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/gameusers.org/privkey.pem
   Your cert will expire on 2018-02-07. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again with the "certonly" option. To non-interactively renew *all*
   of your certificates, run "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

- サーバーの拡張リダイレクトを設定できませんでした。
   ただし、証明書を正常にインストールしました。
  - おめでとう!証明書とチェーンは以下の場所に保存されています:
   /etc/letsencrypt/live/gameusers.org/fullchain.pem
   あなたのキーファイルは以下の場所に保存されています:
   /etc/letsencrypt/live/gameusers.org/privkey.pem
   あなたの証明書は2018-02-07に期限切れとなります。新しい、または微調整された
   将来この証明書のバージョンを取得するには、certbot-autoを実行するだけです
   もう一度、 "certonly"オプションを使用してください。 *対話的に更新する* all *
   証明書の "certbot-auto renew"を実行してください
  - アカウント情報がCertbotに保存されている
   / etc / letsencryptの設定ディレクトリ。あなたは
   このフォルダの安全なバックアップを作成します。この設定ディレクトリは、
   Certbotで取得した証明書と秘密鍵も含まれています。
   このフォルダを定期的にバックアップするのが理想的です。

この間、わずか10分ほどです。なんとこれだけで SSL の設定が完了しました。英語ですが数問の対話に答えるだけでウェブサイトへの SSL 導入が完了します。あとは httpd を再起動するだけで反映されます。

service httpd start

 

数年前、初めて SSL を導入したときは中間証明書だなんだと難しい処理をした覚えがありますが、今回はたったこれだけで終了。しかも無料! 証明書の期限が三ヶ月しかないという問題はありますが、これは cron で更新すればいいだけなので、実質なにもしなくても無料で SSL がずっと利用できることになります。

証明書

ちなみに証明書を更新する方法は以下のような感じです。毎日、朝の6時45分に証明書の更新を実行する。更新できた場合は httpd も再起動する。毎日、実行していても、期限の30日前にならないと証明書の更新処理は実行されないので、向こうのサーバーに負荷をかけることもないとのことです。

45 6 * * * /root/certbot-auto renew --post-hook "service httpd restart"

正直、cron を触ることはあまりないので、こっちの設定の方が時間かかりました。この書き方が正しいのか更新されるまでわからないので、cron の部分についてはあまり参考にしないでください。

それにしても Let’s Encrypt すごすぎる!

 

参考サイト

XAMPPの設定方法-1 Apache

XAMPPのインストール自体は簡単なのですが、問題は設定が難しいことです。基本的な設定と日本語化について解説していますので、このページに書かれているとおりに設定してみてください。

最初はなんの設定なのかわからないし、間違えたらどうしようと不安になると思いますが、もし間違えて正常に起動しなくなったとしても、アンインストールして再度インストールしなおせばいいだけなので、気軽に設定してみましょう。

※ Cドライブに普通にインストールしたケースで解説しています。もし別の場所にインストールした場合は、その場所に置き換えて読んでください。例)Cドライブ → Dドライブ

Apache(Webサーバーソフト)の設定


エクスプローラーでCドライブを開き、その中のxamppフォルダを開いてみてください。

Windows10のエクスプローラーでxamppフォルダを開いたところ

いろいろなフォルダの一覧が表示されていると思いますが、以下のフォルダを順番に開いていって、httpd.confというファイルを見つけてください。

apache(フォルダ) > conf(フォルダ) > httpd.conf(ファイル)

 

confフォルダの中身、httpd.confというファイルが見えます

httpd.confをエディターで開きましょう。メモ帳でもOKです。

 

httpd.confをエディターで開いたところ

画像はAtomというエディターで開いたところです。メモ帳の場合は白い背景になっていると思います。英語が並んでいて不安になるかもしれませんが、気にしなくて大丈夫です。XAMPPの設定は必要な部分を検索して書き換えるだけなので、中身について理解する必要はありません。

メモ帳やエディターの画面でキーボードの Ctrl(コントロールキー)+ F(エフ)を押して検索ウィンドウを開いてください。メモ帳の場合は、上部メニューの編集をクリックすると、検索と書かれている部分が出てきますので、そこをクリックしても検索ウィンドウが開きます。

 

検索ウィンドウ

検索ワード:Listen

これを入力して検索すると書き換える必要のある場所が出てきます。Listen 12.34.56.78:80 もしくは Listen 80と書かれている部分を、Listen 127.0.0.1:80 に書き換えてください。

書き換えたら保存しましょう。これはセキュリティを強化する設定で、外部から開発環境のサーバーにアクセスできないようにするための設定です。

Apacheの設定はこれだけです。次はPHPの設定を行います。

XAMPPの設定方法-2 PHP

XAMPP インストール・設定 関連記事