【ITニュース解説】How to host a website locally and let other users use it — super-elaborate
2025年09月18日に「Dev.to」が公開したITニュース「How to host a website locally and let other users use it — super-elaborate」について初心者にもわかりやすく解説しています。
ITニュース概要
ローカルPCでウェブサイトを公開し、LAN内やインターネットからアクセスさせる方法を解説。ファイアウォール設定、IP固定、ポートフォワーディングやトンネル利用、SSL/TLS導入、セキュリティ対策まで、初心者向けにデモから本番運用まで網羅的に紹介する。
ITニュース解説
ウェブサイトを自分のコンピューターで動かし、その内容を他の人たちに見てもらう方法について解説する。開発中のアプリケーションを社内の同僚に見せたい場合や、友人に一時的にウェブサイトのデモを見せたい場合など、様々な状況で役立つ知識である。
まず、ウェブアプリケーションを自分のPC上で動かす際、そのアプリケーションがどのネットワークアドレスで通信を待ち受けるかを設定する必要がある。通常、多くのウェブアプリケーションは「localhost」または「127.0.0.1」というアドレスで起動するが、これは自分のPC内部だけで通信ができるアドレスである。他のPCからアクセスできるようにするには、「0.0.0.0」というアドレスで待ち受けるように設定する。0.0.0.0は、そのPCが持つ全てのネットワークインターフェースからの接続を受け入れるという意味を持つため、同じネットワーク内の他のデバイスからアクセスが可能になる。Node.jsのExpress、PythonのFlaskやDjangoといった一般的なウェブフレームワークでは、アプリケーションを起動する際にホストとして0.0.0.0を指定するオプションが用意されている。
アプリケーションが0.0.0.0で待ち受けを開始したら、次に自分のPCのローカルIPアドレスを確認する。LinuxやmacOSではip addr showやifconfig、Windowsではipconfigコマンドを使って確認できる。これは通常、192.168.x.xのような形式のアドレスである。このローカルIPアドレスと、アプリケーションが待ち受けているポート番号(例えば3000番)を使って、同じネットワーク内の別のPCやスマートフォンからウェブブラウザでアクセスしてみる。http://[自分のローカルIP]:[ポート番号]という形式でURLを入力する。
もしアクセスがうまくいかない場合、自分のPCのファイアウォールが原因であることが多い。ファイアウォールは、セキュリティのために不要な通信をブロックする役割を持つ。そのため、アプリケーションが待ち受けているポート番号(例: 3000番)について、外部からの接続を許可するようにファイアウォールの設定を変更する必要がある。LinuxのUFWやWindowsのPowerShellコマンドを使って、特定のポートへのTCP通信を許可する設定を追加する。設定後、アプリケーションが実際にそのポートで待ち受けているか、ss -tulpn | grep :[ポート番号]などのコマンドで確認すると良い。
また、多くのホームルーターは、PCに割り当てるローカルIPアドレスを自動で変更することがある。これでは、せっかく他のPCからのアクセス設定をしても、IPアドレスが変わるたびに再設定が必要になり不便だ。この問題を解決するためには、ルーターの「DHCP予約」機能を利用するのが最も確実である。これは、自分のPCのMACアドレスという固有の識別子に対して、常に同じローカルIPアドレスを割り当てるようにルーターに設定するものだ。あるいは、PC自体に静的IPアドレスを設定することも可能だが、その場合はルーターのDHCP割り当て範囲外のIPアドレスを選択し、IPアドレスの衝突を避ける必要がある。
ここまでの設定で、同じローカルネットワーク(LAN)内のユーザーはウェブサイトにアクセスできるようになる。しかし、インターネット上のどこからでもアクセスできるようにするには、さらに設定が必要となる。これには主にいくつかの選択肢がある。
一つ目の方法は、自宅のルーターで「ポートフォワーディング」を設定し、インターネットから特定のポートへの通信を、自分のPCのローカルIPアドレスとポート番号に転送するように指示することである。一般的なウェブサイトはHTTP通信に80番ポート、HTTPS通信に443番ポートを使用するため、これらのポートを自分のPCに転送する設定が必要となる。この際、インターネットからアクセスするための「グローバルIPアドレス」が自分のPCに紐付いている必要があるが、多くの家庭用インターネット回線ではこのグローバルIPアドレスが変動することが多い。もしIPアドレスが頻繁に変わる場合、ドメイン名を常に正しいグローバルIPアドレスに更新する「ダイナミックDNS(DDNS)」サービスを利用すると便利だ。さらに、ウェブサイトの信頼性とセキュリティのために「TLS(SSL)」証明書を導入し、HTTPS通信を有効にすることが不可欠である。Let's Encryptのようなサービスを使えば、無料で証明書を取得できる。この方法の利点は、完全に自分でコントロールできる点だが、ルーター設定の複雑さや、インターネットサービスプロバイダー(ISP)が80番や443番ポートの通信をブロックしている可能性があるという課題もある。
二つ目の手軽な方法は、「トンネルサービス」を利用することである。ngrokやlocaltunnel、Cloudflare Tunnelといったサービスは、自分のPCと外部のサーバー間に安全な通信経路(トンネル)を確立し、外部から自分のPC上のウェブサイトにアクセスできるようにしてくれる。これらのサービスはルーターの設定変更が不要で、多くの場合、HTTPS通信も自動的に提供してくれるため、一時的なデモやテスト環境の公開には非常に便利だ。無料で利用できるプランもあるが、機能や利用期間に制限があることが多い。
より堅牢な方法として、「VPS(仮想プライベートサーバー)」を利用したリバースプロキシとSSHリバーストンネルを組み合わせる方法がある。これは、安価なVPSを借りて、そこにNginxのようなリバースプロキシサーバーを設置し、自宅のPCからVPSへSSHで「逆方向のトンネル」を確立する。インターネットからのアクセスはまずVPSに届き、VPSがそのトンネルを通じて自宅のPCのウェブサイトにリクエストを転送する仕組みである。この方法の利点は、自宅のネットワークを直接インターネットに公開しないためセキュリティ面で優れていることと、VPS上でドメイン名やTLS証明書を一元管理できることだ。
もし、公開するウェブサイトが本格的な運用を目的とするのであれば、自宅のPCにホストするのではなく、最初からクラウドプロバイダ(AWS, GCP, Azure, DigitalOceanなど)のサーバーやサービスを利用することが強く推奨される。これは安定性、可用性、セキュリティ、拡張性の面で、自宅でのホスティングよりも格段に優れているためである。
TLS(SSL)証明書は、ウェブサイトとユーザー間の通信を暗号化し、データの盗聴や改ざんを防ぐために不可欠である。Let's Encryptは無料でTLS証明書を発行してくれる機関であり、Certbotというツールを使えば、証明書の取得からNginxのようなウェブサーバーへの設定、さらには自動更新まで簡単に行える。Nginxは、リバースプロキシとして機能し、外部からのリクエストを受け取り、それをローカルで動作するアプリケーションに転送する役割を果たす。これにより、TLS終端(HTTPS通信の復号化)や、静的ファイルの高速配信、セキュリティヘッダの追加といった多くの機能を実現できる。
ウェブアプリケーションを安定して動かすためには、PCが再起動しても自動的にアプリが起動し、常に稼働し続けるように設定することが重要である。Linuxでは「systemd」という仕組みを使って、アプリケーションをサービスとして登録できる。これにより、PC起動時に自動でアプリが立ち上がり、もしアプリがクラッシュしても自動的に再起動させることが可能になる。また、「Docker」というコンテナ技術を使うと、アプリケーションとその実行環境をひとまとめにして管理でき、異なる環境間での移植性を高めることができる。Nginxを組み合わせることで、アプリケーションの負荷分散や高度なルーティング設定も実現可能だ。
インターネットにウェブサイトを公開する上で、セキュリティは最も重要な考慮事項の一つである。HTTPSを強制し、データベースや管理画面など、外部に公開すべきではないポートは絶対に公開しない。ファイアウォールは必要最小限のポートのみを開放し、SSHアクセスなどは特定のIPアドレスからのみ許可するように設定する。「Fail2ban」のようなツールを導入することで、不正なログイン試行を繰り返すIPアドレスを自動的にブロックできる。OSや使用しているソフトウェアは常に最新の状態に保ち、既知の脆弱性への対策を怠らない。ウェブアプリケーションの認証情報(パスワードやAPIキーなど)は、コード内に直接書き込まず、環境変数や専用のシークレット管理ツールを使って安全に管理するべきである。
ウェブサイトが正常に稼働しているかを監視し、問題が発生した際に迅速に対応できるよう、ログの確認やヘルスチェックエンドポイントの準備、稼働監視ツールの導入も重要である。トラブルが発生した場合、アプリケーションが正しく動いているか、正しいポートで待ち受けているか、ファイアウォール設定は適切か、ルーターのポートフォワーディングは機能しているか、DNS設定は正しいか、といった点を順に確認していく必要がある。
最終的に、一時的なデモ目的で手軽にウェブサイトを公開したい場合は、アプリケーションを0.0.0.0で起動し、ファイアウォールを開放した上で、ngrokのようなトンネルサービスを利用するのが最も迅速で安全な方法だ。もし短期間でも安定した公開が必要であれば、安価なVPSを借りてNginxリバースプロキシとLet's EncryptでHTTPSを設定し、アプリケーションをsystemdやDockerでサービス化する方法が良い。そして、本格的な運用や多数のユーザーを想定する場合は、迷わずクラウドホスティングサービスを利用することが推奨される。どのような場合でも、ファイアウォール設定やソフトウェアの更新といった基本的なセキュリティ対策は常に徹底すべきである。