HugoをWebサーバとして使う
Hugoは静的サイトジェネレータでありつつも、Webサーバ機能を併せ持っています。この点について、公式では以下のように説明されています。
Hugo provides its own webserver which builds and serves the site. While hugo server is high performance, it is a webserver with limited options. Many run it in production, but the standard behavior is for people to use it in development and use a more full featured server such as Nginx or Caddy.
Hugo - hugo server
ざっくり訳すと、
Hugoはサイトをビルドして提供する独自のWebサーバを持っている。Hugoサーバは高性能であるが、限定的なオプションのWebサーバである。本番環境(production)でも多く利用されているが、多くの人は開発環境として利用し、NginxやCaddyのような、より機能性の高いサーバーを利用するのが普通である。
といった感じの説明がされています。
また、ディスカッションボードでも、hugo開発者のspf13氏は以下の発言をしています。
A lot of people are using hugo as a production server. Performance is about the same as Apache.
Hugo Server for Production - tips & tricks - Hugo Discussion
ということで、Apacheと同等のパフォーマンスで利用可能だと主張されています。
Webサーバとしてのhugoが本番環境での使用に耐えうるパフォーマンスなのか興味深いですが、その点については本投稿では掘り下げません。
本投稿では、単にWindows上で稼働するhugoを、LAN内からアクセス可能なWebサーバとして稼働させるための方法を紹介します。
ファイヤーウォール開放して、IISやTomcatなどと同様にサーバプロセス(orサービス)を起動したら終わりだろという話なのですが、情報の少ないhugoでは多少ハマったので、その辺も併せて紹介します。
前提環境
※ここではポート8080で稼働させるとする(Hugoのデフォルトは1313)。
Windowsファイヤーウォールの設定
1. スタートメニューから[Windowsファイアウォールによるアプリケーションの許可]を選択
2. [設定の変更]を押下後、[別のアプリの許可]を押下しHugo(hugo_0.15_windows_amd64.exe)を例外に追加する。
※以下(3~5)は所謂ハードニングのための設定であり、必須ではない(しなくても繋がる)。
3. スタートメニューから[セキュリティが強化されたWindowsファイアウォール]を選択
4. 受信の規則にhugoが2つ(TCPとUDP)追加されているので、UDPの規則を削除。
5. 残ったhugoのTCPの規則を選択し、[プロトコルおよびポート]タブでローカルポートを[すべてのポート]から[特定のポート]に変更し8080を設定
Hugoの起動
Hugoを以下のオプションで起動する。
hugo server --baseURL="HOGE" --bind="HOGE" --port=8080
動作確認
LAN内の端末から、
http://HOGE:8080/
でアクセス可能なことを確認できたら完了。
補足
ハマったポイント1
通常hugoは、
hugo server
として起動するだけで、そのマシン自体からはhttp://localhost:1313でアクセス可能となる。
だが、この起動オプションではWindowsファイヤーウォールをどう設定しても、外部端末からはhttp://HOGE:1313としてアクセスできない。
ハマったポイント2
ホスト名にバインドしてやれば、外部端末からアクセス可能になることに気付いたのだが、
hugo server --bind="HOGE"
として起動すると、外部端末からhttp://HOGE:1313でアクセス可能になったものの、コンテンツのリンクがところどころ壊れている。具体的には一部のリンクがlocalhost以下に対するものになっており、アクセスできない。
これを解消するためには、baseURLオプションを指定する必要がある。
ポート番号覚えにくい
これは別にハマった訳ではないが、単に覚えにくい。
portオプションで好きなように設定できるので、8080とした(公開サーバーでもないので、ハードニングの観点からはhttpらしからぬポート番号にするのが望ましいだろう)。