大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

Mastodon with IIS (IIS編)

さて、ひとつ前の記事の続きです。今回は Mastodon の上位にくる IIS 側の設定をしていきます。 既に IIS を使用して Web サイトを複数公開していましたが、2年前くらいに立てたとき色々知識が無い状態で弄ったために肥大化しており、ちょうどいいタイミングだったので一から再構築しました。

注意事項など

大体は前回の記事と同じなので、この記事で追加で注意することなど。

  • Mastodon は Streaming API に WebSocket を使用します。IIS は 8.0 以降(Windows Server 2012 以降)から対応しており、それ以前の IIS では(たぶん)利用できないため、構築できても Streaming 等の機能はエラーで使用できません。
  • 今回使用する OS は、Windows Server 2012 R2 です。恐らく Windows 8.1 / 10 等のクライアント版 Windows でも適宜読み替えて設定すれば機能するとは思います。
  • "Mastodon with IIS" なんて言っているものの、正確にはMastodonへリバースプロキシを行っているnginxのさらに上位にIISを突っ込み、nginxへリバースプロキシさせているだけ。
  • Windows Server 2012 R2以下に搭載されるIISでは、HTTP/2には対応できません。WS2016以降のIISでは可能な模様。

IIS のインストール

今回は OS をインストールした直後のまっさらな状態からスタートなので、まず IIS のインストールから。

IIS 本体

  • サーバー マネージャーを開く
    設定を変えたりしていなければ、OS 起動後ログインすると自動で起動してくる。
  • "役割と機能の追加" を開く
  • サーバーの選択(IIS をインストールするサーバーを選択)
  • サーバーの役割で "Web サーバー (IIS)" にチェックを入れる
  • "機能" は変更無し
  • IIS の詳細な機能の選択
    "Web サーバーの役割 (IIS)" の "役割サービス" で IIS 内の必要機能を追加で選択する。最低限必要なもののほかに、個人的に必要かなーと思ったモノも含めた。
    • Web サーバー / HTTP 共通機能


      HTTP エラー, ディレクトリの参照, 既定のドキュメント, 静的なコンテンツ, HTTP リダイレクト
    • Web サーバー / セキュリティ


      要求フィルター, IP およびドメインの制限, URL 承認
    • Web サーバー / パフォーマンス


      静的なコンテンツの圧縮
    • Web サーバー / 状態と診断


      HTTP ログ, カスタム ログ, トレース, 要求の監視
    • Web サーバー / アプリケーション開発


      WebSocket プロトコル重要
    • 管理ツール / IIS 管理コンソール

  • インストール開始
  • ウィザードの終了

Application Request Routing と URL Rewrite のインストール

クライアントから受けたリクエストを Mastodon に転送するために必要となる、Application Request Routing (ARR) と URL Rewrite をインストールする。 サーバーマネージャーから一旦 "IE セキュリティ強化の構成" を Administrator グループで無効にして、Microsoft の公式サイトから WebPI (Web Platform Installer) をダウンロードして起動する。

Application Request Routing 3.0 (ARR)

WebPI 右上の検索欄に "arr" と入力して Enter 、いくつか候補が出てくるので、バージョンが最新の "Application Request Routing 3.0" を "追加" する。

URL Rewrite 2.0

同様に検索欄に "url rewrite" と入力して Enter 、一つだけ "URL Rewrite 2.0" が候補として現れるので、"追加" する。

上記2つを追加したら、"インストール" を実行する。 以上で IIS とその関連のインストールは完了。

IIS の設定

Application Request Routing の有効化

インストールしただけでは無効のままなので、有効化する。

  • Internet Information Service (IIS) Manager(または インターネット インフォメーション サービス (IIS) マネージャー)を起動する
  • サーバー ホーム画面の "Applicatoin Request Routing Cache" に入る
  • 右側のペインから "Serverr Proxy Settings" に入る
  • "Enable proxy" にチェックを入れる
  • その他の設定は変更せず右側のペインから "適用" する

Mastodon 用 Web サイトの作成

Mastodon へリクエストを転送するための Web サイトを作成する。 先に、 [sourcecode] C:\inetpub\wwwroot\ [/sourcecode] 以下に "mastodon(名前は任意)" という名前のフォルダーを作成しておく。

IIS マネージャーの画面左側のペインで、"Web サイト" を右クリックし "Web サイトの追加" から作成画面を開く。 "サイト名" には "mastodon" など任意のわかりやすい名前を入力し、"物理パス" には先程作成済みの "mastodon" フォルダーを指定する。 "バインド" には、以下の通り設定した。

  • 種類: http
  • IP アドレス: 未使用の IP アドレスすべて
  • ポート: 80
  • ホスト名: mstdn.taiha.net

ホスト名には、自身がMastodonで使用するドメイン名を入力する。

Mastodon 用 Web サイトの設定

Web サイトを作成したので、Let's Encrypt での暗号化とHTTPSへのリダイレクト、 Mastodon への転送のための設定を行う。

Let's Encrypt の対応

先程作成した Web サイトのホーム画面から "MIME の設定" を開き、右側ペインの "追加..." から以下の通りの設定で MIME を追加する。

  • ファイル名の拡張子: .(半角ドット)
  • MIME の種類: text/plain

Let's Encrypt で証明書を取得する際、アクセスされるファイルを読み取れるようにする。

HTTPSへのリダイレクト

Mastodon はユーザーのメールアドレスとパスワードを扱うため、HTTPS化は必須。 Web サイトのホーム画面から "URL 書き換え" を開き、右側ペイン "規則の追加" → "受信規則" 内の "空の規則" を選択し OK。 下記の通り設定した。

  • 名前: redirect_https(任意)
  • 要求された URL: パターンに一致する
  • 使用: 正規表現
  • パターン: ^(.*)$
  • (条件)論理グループ化: すべて一致
    • 入力: {HTTPS}
    • 種類: パターンに一致する
    • パターン: off

    • 入力: {URL}
    • 種類: パターンに一致しない
    • パターン: [sourcecode] \.well-known/acme-challenge/(.*)$ [/sourcecode]
  • アクションの種類: リダイレクト
  • リダイレクト URL: https://{SERVER_NAME}/{R:1}
  • クエリ文字列の追加: チェック
  • リダイレクトの種類: 永続的 (301)(任意)

設定後、右側ペインで "適用" して "URL 書き換え" ページに戻る。

Mastodon への転送設定

"URL 書き換え" ページで、右側ペイン "規則の追加" → "受信規則" 内の "空の規則" を選択し OK。 下記の通り入力した。

  • (条件)論理グループ化: すべて一致
    • 入力: {URL}
    • 種類: パターンに一致しない
    • パターン: [sourcecode]\.well-known/acme-challenge/(.*)$[/sourcecode]
  • アクションの種類: 書き換え
  • URL の書き換え: http://mstdn.taiha.net/{R:0}
  • クエリ文字列の追加: チェック
  • 書き換えられたURLを記録する: 未チェック
  • 後続の規則の処理を停止する: チェック

上記の通り、Let's Encrypt でのドメイン認証時はこのサーバー内のフォルダにアクセスさせるため、 [sourcecode] .well-known/acme-challenge/ [/sourcecode] 以下のURL を Mastodon サーバへ転送しないよう設定した。 また、以前別の記事で Jenkins へ IIS 経由で同様に転送したときは問題なかったものの、今回 Mastodon への転送では、転送先 URL で下記のようにローカル IP アドレスを指定すると問題の出るページがあった。

そのため、今回は Mastodon に利用するドメイン名を指定した。この場合、そのままでは IPv4 ではドメインに登録されているグローバルアドレスに、IPv6 ではこの Web サーバ自体にアクセスが戻ってきてしまうため、 [sourcecode] C:\Windows\System32\drivers\etc\hosts [/sourcecode] にドメインに対して Mastodon サーバーの IP アドレスを指定する必要がある。以下の通りに指定した。 IPv6 対応環境の場合、同様に Mastodon サーバーのグローバル IPv6 アドレスとドメイン名の組を登録したほうが良いかもしれない。 [sourcecode]

MastodonサーバーIP ドメイン

192.168.11.250  mstdn.taiha.net [/sourcecode] 以上で、Mastodon サーバーへリクエストを転送する設定が完了。 当方の環境では、最終的なWeb サイトの設定ファイル (web.config) は以下の通り。 [sourcecode language="xml"] <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <clear /> <rule name="redirect_https" enabled="true" stopProcessing="true"> <match url="^(.)$" ignoreCase="false" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTPS}" pattern="off" ignoreCase="false" /> <add input="{URL}" pattern=".well-known/acme-challenge/(.)$" negate="true" /> </conditions> <action type="Redirect" url="https://{SERVER_NAME}/{R:1}" /> </rule> <rule name="mastodon_ubuntu-server" stopProcessing="true"> <match url="^(.)$" ignoreCase="false" negate="false" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{URL}" pattern=".well-known/acme-challenge/(.)$" ignoreCase="false" negate="true" /> </conditions> <action type="Rewrite" url="http://mstdn.taiha.net/{R:0}" /> </rule> </rules> </rewrite> <staticContent> <mimeMap fileExtension="." mimeType="text/plain" /> </staticContent> </system.webServer> </configuration> [/sourcecode]

ついでに、IIS に最初からある "Default Web Site" は使用しないので、右クリックのメニューなどから停止させておく。

Let's Encrypt 証明書取得

Mastodon のサイトの通信を暗号化するため、Let's Encrypt の証明書を取得する。

Windows 用Let's Encrypt ツールの導入

github.com/Lone-Coder/letsencrypt-win-simple から、最新のツールをダウンロードして C:\ 以下に展開する。

ツール内の Web_Config.xml 書き換え

この Web_Config.xml で設定される部分は既に IIS で設定済みなのと、そのまま利用した場合エラーが出たので、このファイルが何もしないように書き換えてしまう。 以下の通りに書き換えた。 [sourcecode language="xml"] <?xml version="1.0" encoding="UTF-8"?>

<configuration> <system.webServer> </system.webServer> <system.web> </system.web> </configuration> [/sourcecode]

Let's Encrypt で証明書を取得

今回、既に別のサイトも存在するので、それらもまとめてカバーするために単一のサイト用の証明書ではなく、"SAN 証明書" を取得した。 上記で Windows 用 Let's Encrypt ツールを展開したフォルダに移動し、コマンドプロンプトを管理者権限で起動して下記の通り実行していく。ハイライト箇所が入力した場所。 なんだかものっそい長くなっているのはドメインが多すぎるためで、証明書を取得するドメインが1個だけなら多少短くなる。 [sourcecode highlight="1,29,32,142"] C:\letsencrypt-win-simple>letsencrypt.exe --san The global logger has been configured Let's Encrypt (Simple Windows ACME Client) Renewal Period: 60 Certificate Store: WebHosting ACME Server: https://acme-v01.api.letsencrypt.org/ Config Folder: C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\htt psacme-v01.api.letsencrypt.org Certificate Folder: C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simpl e\httpsacme-v01.api.letsencrypt.org Loading Signer from C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simpl e\httpsacme-v01.api.letsencrypt.org\Signer Getting AcmeServerDirectory Loading Registration from C:\Users\Administrator\AppData\Roaming\letsencrypt-win -simple\httpsacme-v01.api.letsencrypt.org\Registration Scanning IIS Sites 6: SAN - IIS eject.taiha.net (D:\wwwroot\eject.taiha.net) 3: SAN - IIS mstdn.taiha.net (D:\wwwroot\mstdn.taiha.net) 5: SAN - IIS sokuten.taiha.net (C:\inetpub\wwwroot) 2: SAN - IIS taiha.net (D:\wwwroot\taiha.net) 4: SAN - IIS teo.taiha.net (D:\wwwroot\teo.taiha.net)

W: Generate a certificate via WebDav and install it manually. S: Generate a single San certificate for multiple sites. F: Generate a certificate via FTP/ FTPS and install it manually. M: Generate a certificate manually. A: Get certificates for all hosts Q: Quit Choose from one of the menu options above: S Running IISSiteServer Plugin Enter all Site IDs seperated by a comma S: for all sites on the server 2,3,4,5,6 Authorizing Identifier taiha.net Using Challenge Type http-01 Writing challenge answer to D:\wwwroot\taiha.net.well-known/acme-challenge/(ドメイン確認用ファイル) Writing web.config to add extensionless mime type to D:\wwwroot\taiha.net.well- known\acme-challenge\web.config Answer should now be browsable at http://taiha.net/.well-known/acme-challenge/ドメイン確認用ファイル) Submitting answer Authorization Result: valid Deleting answer Additional files exist in D:\wwwroot\taiha.net.well-known/acme-challenge/ not d eleting. Authorizing Identifier mstdn.taiha.net Using Challenge Type http-01 Writing challenge answer to D:\wwwroot\mstdn.taiha.net.well-known/acme-challeng e/(ドメイン確認用ファイル) Writing web.config to add extensionless mime type to D:\wwwroot\mstdn.taiha.net\ .well-known\acme-challenge\web.config Answer should now be browsable at http://mstdn.taiha.net/.well-known/acme-challe nge/(ドメイン確認用ファイル) Submitting answer Authorization Result: valid Deleting answer Additional files exist in D:\wwwroot\mstdn.taiha.net.well-known/acme-challenge/ not deleting. Authorizing Identifier teo.taiha.net Using Challenge Type http-01 Writing challenge answer to D:\wwwroot\teo.taiha.net.well-known/acme-challenge/ (ドメイン確認用ファイル) Writing web.config to add extensionless mime type to D:\wwwroot\teo.taiha.net.w ell-known\acme-challenge\web.config Answer should now be browsable at http://teo.taiha.net/.well-known/acme-challeng e/(ドメイン確認用ファイル) Submitting answer Authorization Result: valid Deleting answer Additional files exist in D:\wwwroot\teo.taiha.net.well-known/acme-challenge/ n ot deleting. Authorizing Identifier sokuten.taiha.net Using Challenge Type http-01 Writing challenge answer to C:\inetpub\wwwroot.well-known/acme-challenge/(ドメイン確認用ファイル) Writing web.config to add extensionless mime type to C:\inetpub\wwwroot.well-kn own\acme-challenge\web.config Answer should now be browsable at http://sokuten.taiha.net/.well-known/acme-chal lenge/(ドメイン確認用ファイル) Submitting answer Authorization Result: valid Deleting answer Deleting web.config Deleting C:\inetpub\wwwroot.well-known/acme-challenge/ Deleting C:\inetpub\wwwroot.well-known Authorizing Identifier eject.taiha.net Using Challenge Type http-01 Writing challenge answer to D:\wwwroot\eject.taiha.net.well-known/acme-challeng e/(ドメイン確認用ファイル) Writing web.config to add extensionless mime type to D:\wwwroot\eject.taiha.net\ .well-known\acme-challenge\web.config Answer should now be browsable at http://eject.taiha.net/.well-known/acme-challe nge/(ドメイン確認用ファイル) Submitting answer Authorization Result: valid Deleting answer Additional files exist in D:\wwwroot\eject.taiha.net.well-known/acme-challenge/ not deleting. Requesting Certificate Request Status: Created Saving Certificate to C:\Users\Administrator\AppData\Roaming\letsencrypt-win-sim ple\httpsacme-v01.api.letsencrypt.org\2,3,4,5,6-crt.der Saving Issuer Certificate to C:\Users\Administrator\AppData\Roaming\letsencrypt- win-simple\httpsacme-v01.api.letsencrypt.org\ca-0A0141420000015385736A0B85ECA708 -crt.pem Saving Certificate to C:\Users\Administrator\AppData\Roaming\letsencrypt-win-sim ple\httpsacme-v01.api.letsencrypt.org\2,3,4,5,6-all.pfx Installing Non-Central SSL Certificate in the certificate store Opened Certificate Store WebHosting Set private key exportable Set private key exportable Adding Certificate to Store Closing Certificate Store Installing Non-Central SSL Certificate in server software Updating Existing https Binding IIS will serve the new certificate after the Application Pool Idle Timeout time has been reached. Committing binding changes to IIS Opened Certificate Store WebHosting Removing Certificate from Store X509Certificate2 {(置き換えられた古い証明書の情報)} Closing Certificate Store Updating Existing https Binding IIS will serve the new certificate after the Application Pool Idle Timeout time has been reached. Committing binding changes to IIS Opened Certificate Store WebHosting Closing Certificate Store Updating Existing https Binding IIS will serve the new certificate after the Application Pool Idle Timeout time has been reached. Committing binding changes to IIS Opened Certificate Store WebHosting Closing Certificate Store Updating Existing https Binding IIS will serve the new certificate after the Application Pool Idle Timeout time has been reached. Committing binding changes to IIS Opened Certificate Store WebHosting Closing Certificate Store Updating Existing https Binding IIS will serve the new certificate after the Application Pool Idle Timeout time has been reached. Committing binding changes to IIS Opened Certificate Store WebHosting Closing Certificate Store Adding renewal for IISSiteServer 2,3,4,5,6 () Creating Task letsencrypt-win-simple httpsacme-v01.api.letsencrypt.org with Wind ows Task scheduler at 9am every day.

Do you want to specify the user the task will run as? (y/n) Renewal Scheduled IISSiteServer 2,3,4,5,6 () Renew After 2017/06/24 Press enter to continue.

C:\letsencrypt-win-simple> [/sourcecode] このツールは自動的に IIS に設定されている Web サイトを検出し、リストアップしてくれる。ただし、IDN(日本語ドメインなど)には非対応で、その URL は検出できない。Let's Encrypt 自体は IDN に対応している。 今回は IIS に設定されている Web サイトの証明書を取得するため 29行目で "S" を、リストアップされている Web サイトすべてが対象なので 32行目でリストの先頭についている番号 "2,3,4,5,6" を指定した。"1" は IIS に最初から存在していた "Default Web Site" に割り当てられている。 番号を指定して Enter を押すと、自動で確認用ファイルの作成と Let's Encrypt サーバーからのアクセス確認(ドメインが存在するかどうか)が行われ、さらに IIS の各サイトへ HTTPS の設定と証明書の割り当てまで行ってくれる。

最後142行目で尋ねられているのは、取得した証明書の更新スケジュールをシステムのスケジュールに登録するが、これを別のユーザーとして実行するかどうかの指定。特に変える必要も無いため、"n" を入力して進んだ。するとスケジュールに登録した趣旨の表示の後 "Press enter to continue" と表示され、Enter キーを押すとツールが終了する。 できれば、タスクスケジューラを開き、"タスク スケジューラ ライブラリ" -> "letsencrypt-win-simple ..." というタスクが存在するか確認する。これが実行されないと、証明書が更新されず期限が 90日で切れ、Web サイトがエラーでアクセスできなくなる。

以上で IIS の設定と証明書の取得は全て終了。

アクセス確認

正常に IIS へのアクセスが Mastodon へ転送されるか確認する。IPv6 が利用可能な環境ではドメインIPv6 アドレスを設定していれば直接アクセスできるが、v4 のみの場合はクライアント PC の hosts 内に、ドメインに対して Web サーバ側の IP アドレスを指定する。

また、可能であれば携帯電話やスマートフォン等から docomoausoftbank 等のモバイル回線を使用して、外部からも正常にアクセスできるかを確認する。 ↓ LAN 内の PC から

docomo spmode 回線を利用して L-05E から


以上で全て完了です。 今回のやり方で立てたインスタンス "どんぶり大破" と、その後最新の開発バージョンを追う予定で立てたインスタンス "ておくれ" は、今のところ継続的に運用する予定です。

それでは。