🤖

VirtualBoxでApache/Nginxを使ったWebサーバーの構築方法

2024/12/23に公開

はじめに

本記事では、VirtualBox上に構築した仮想環境を使用し、ApacheまたはNginxを利用したWebサーバーの構築方法を解説します。Webサーバーは、インターネット上でクライアントからのリクエストを受け取り、静的コンテンツ(HTML/CSS/画像など)や動的コンテンツ(APIの結果やデータベースからの情報)を提供する役割を果たします。
代表的なWebサーバーにはApacheとNginxがあり、特徴や用途の違いに触れながら、構築を進めていきます。Webサーバーの基本的な設定を学ぶことで、Webコンテンツの配信や動作確認ができるようになります。

こちらの記事は「Webサーバーの役割とHTTP通信について」の続きとなっています。
https://zenn.dev/arisa1115/articles/b5081548b8c246


目次

  1. Webサーバーの種類と特徴
  2. 構築準備
  3. Apacheのインストールと設定
  4. Nginxのインストールと設定
  5. セキュリティの基本設定
  6. 動作確認とトラブルシューティング
  7. まとめ

1. Webサーバーの種類と特徴

1.1 Apache

正式名称はApache HTTP Serverといい、オープンソースのWebサーバーソフトウェアです。1995年に初めてリリースされ、長年にわたり多くのWebサイトや企業のサーバーで利用されてきました。

特徴
  1. 様々なOSに対応している
  • Linux、UNIX、macOS、Windows、Windows Serverなど数多くのOSに対応しているため、環境に依存せず、様なインフラや運用要件に柔軟に適応できる。既存のシステムをそのまま活用したり、異なるOS間での統一が可能になる。
  1. プロセス駆動型アーキテクチャ
  • サーバーがクライアントからのリクエストを受け取るたびに新しいプロセスまたはスレッドを生成し、そのプロセスでリクエストを処理する。
  • 各リクエストが独立したプロセスで処理されるため、PythonやPHPなどの複数のスクリプト言語を並行して事項しても安定して動作する。
  1. 動的コンテンツの処理速度が迅速
  • モジュール化設計を採用しており、動的コンテンツ処理に必要な機能を追加できるモジュールが豊富。
  • スクリプト言語を処理するアプリケーションサーバーとの統合が容易。mod_pythonやmod_wsgi、mod_phpなどのモジュールをApacheに組み込むことで、外部プロセスを呼び出さずにサーバー内部でスクリプトを直接実行できるため、処理を迅速に行うことができる。(プロセス生成や通信のオーバーヘッドがない)
主な用途
  1. 動的Webサイトの構築
  • CMS(コンテンツ管理システム)を利用するサイトに最適。(WordPress)
  1. カスタマイズ性が求められるアプリケーション
  • モジュールを活用して、詳細な設定や複雑なルールが必要な環境で利用する。

1.2 Nginx

2004年に公開されたWebサーバーソフトウェアです。軽量かつ高性能であることを目的に設計されており、現在ではWebサーバーの世界シェアでApacheを超え、第1位となっています。

特徴
  1. セキュリティ機能の充実
  • SSL/TLS(HTTPS)の設定が簡単かつ強力。
  • 特定のIPアドレスやリクエスト数を制御し、悪意のあるクローラーやボットをブロックすることで、SQLインジェクションやクロスサイトスクリプティング(XXS)などの悪意のあるリクエストやDDoS攻撃を軽減できる。
  1. 非同期I/Oを採用したイベント駆動型アーキテクチャ
  • 非同期I/Oでファイルの読み込みやデータベースのアクセスなどの長時間かかる操作を効率化。
  • システム内で発生する「イベント」をトリガーに必要な処理を実行する。
  1. 静的コンテンツの高速配信
  • 非同期I/Oとキャッシュ機能を活用して、HTMLや画像などの静的ファイルを効率よく配信する。
  • HTTP/2やsendfile()の採用により、少ないリソースで高速な配信を実現する。
主な用途
  1. 動的Webサイトの構築
  • CMS(コンテンツ管理システム)を利用するサイトに最適。(WordPress)
  1. リバースプロキシ
  • クライアントからのリクエストを DjangoやFastAPIなどのバックエンドサーバーに転送し、応答をクライアントへ返す「仲介サーバー」の役割を担う。
  1. ロードバランサー
  • 複数のバックエンドサーバーにリクエストを分散するロードバランサーとして、サーバーの過負荷を防ぎ、システムの安定性を向上させる。
  1. SSL/TLS(HTTPS)通信の管理
  • Nginxは、SSL/TLSハンドシェイク(鍵交換)や暗号化/復号化の処理を最適化しており、サーバーリソースを節約しながら高速に通信を暗号化する。
  • SSL証明書の設定が簡単で、HTTPからHTTPSへのリダイレクトが容易に行うことができる。

2. 構築準備

2.1 環境

  1. VirtualBoxがインストール済みである
  2. AlmaLinuxやubuntuなどの仮想マシンが起動可能である

2.2 ネットワーク設定

仮想マシン内でWebサーバーを構築するため、インターネット接続とホストPCとの通信が重要です。そこで、「NAT」と「ブリッジアダプター」の両方を設定します。

  • アダプター1:NAT
    仮想マシン内でWebサーバーソフトウェアをインストールするために、インターネット接続を確保します。NATでは仮想マシンに直接アクセスできないため、ポートフォワーディングの設定が必要です。ポートフォワーディングを利用することで、ホストマシンからゲストマシンに特定のポートでアクセスできます。
NATアダプターにおけるポートフォワーディングの設定例
ホストポート ゲストポート
8080 80
  • アダプター2:ブリッジアダプター
    ホストPCから仮想マシンにアクセスし、Webサーバーの動作確認を行うために設定します。

3.Apacheのインストールと設定

3.1 インストール

以下の手順でApacheをインストールします:

  1. パッケージを更新
sudo dnf update -y  # AlmaLinux
sudo apt update     # Ubuntu
  1. インストール
sudo dnf install httpd -y  # AlmaLinux
sudo apt install apache2 -y  # Ubuntu

3.2 サービスの起動と自動起動設定

  1. サービスの起動
sudo systemctl start httpd  # AlmaLinux
sudo systemctl start apache2  # Ubuntu
  1. 自動起動の設定
sudo systemctl enable httpd  # AlmaLinux
sudo systemctl enable apache2  # Ubuntu
  1. ステータスの確認
    Apacheが正常に動作していることを確認します:
sudo systemctl status httpd  # AlmaLinux
sudo systemctl status apache2  # Ubuntu

[確認項目]

  1. サービスの状態
  • Active: active (running) と表示されている場合、Apacheサービスは正常に起動しています。
  1. 設定情報
  • Loaded: loaded より、Nginxサービスがシステムに正しく登録されていることを示します。
  • enabled と表示されている場合、システム起動時にApacheサービスが自動で起動する設定が有効になっています。

4.Nginxのインストールと設定

4.1 インストール

以下の手順でApacheをインストールします:

  1. パッケージを更新
sudo dnf update -y  # AlmaLinux
sudo apt update     # Ubuntu
  1. インストール
sudo dnf install nginx -y  # AlmaLinux
sudo apt install nginx -y  # Ubuntu

4.2 サービスの起動と自動起動設定

  1. サービスの起動
sudo systemctl start nginx
  1. 自動起動の設定
sudo systemctl enable nginx
  1. ステータスの確認
    Nginxが正常に動作していることを確認します:
sudo systemctl status nginx

[確認項目]

  1. サービスの状態
  • Active: active (running) と表示されている場合、Nginxサービスは正常に起動しています。
  1. 設定情報
  • Loaded: loaded より、Nginxサービスがシステムに正しく登録されていることを示します。
  • enabled と表示されている場合、システム起動時にNginxサービスが自動で起動する設定が有効になっています。

5. 動作確認とトラブルシューティング

Webサーバーのインストールや設定が完了した後は、実際にサービスが正常に動作しているかを確認します。動作確認を行うことで、設定のミスやサーバー間の競合がないことを確認できます。

5.1 動作確認

ApacheおよびNginxのサービスが正常に起動しているか確認します。

Apacheの場合:

sudo systemctl status httpd  # AlmaLinux
sudo systemctl status apache2  # Ubuntu

Nginxの場合:

sudo systemctl status nginx

5.2 ポートの確認と変更

  1. 現在使用中のポートを確認します。
sudo netstat -tuln | grep LISTEN または sudo ss -tuln

ポートLITEN状況

  1. ポートが競合している場合は、必要に応じてポートを変更します。

Apacheの場合:

sudo vi /etc/httpd/conf/httpd.conf  # AlmaLinux
sudo vi /etc/apache2/ports.conf  # Ubuntu

Nginxの場合:

sudo vi /etc/nginx/nginx.conf

NATアダプターにおけるポートフォワーディングの設定例
ホストポート ゲストポート
8080 8080
  1. ポートを変更した場合は、サービスを再起動します。
sudo systemctl restart httpd
sudo systemctl restart nginx

5.3 ブラウザで動作確認

  1. デフォルトのHTMLファイルの配置
echo '<h1>Nginx is working!</h1>' | sudo tee /usr/share/nginx/html/index.html

テストページ作成

  1. 仮想マシンのIPアドレスをブラウザで入力し、それぞれのデフォルトページが表示されることを確認します。
ip addr または ip a

  - 仮想マシンに割り当てられたローカルネットワーク上のIPアドレスを確認します。

curl http://<仮想マシンに割り当てられたIPアドレス>:8080
  - 仮想マシン内でApache/Nginxが正しくリクエストを処理できるかを確認します。

curlコマンドで仮想マシン内での通信ができていることを確認

  1. ホストOSのブラウザからhttp://localhost:8080にアクセスします。
    Apache/Nginx is working!

5.4 ログの確認方法

  • Apacheのログファイル:
sudo tail -f /var/log/httpd/access_log  # AlmaLinux
sudo tail -f /var/log/apache2/access.log  # Ubuntu
  • Nginxのログファイル:
sudo tail -f /var/log/nginx/access.log

6. セキュリティの基本設定

Webサーバーを安全に運用するためには、ファイアウォールの設定を行い、不要なポートやサービスへのアクセスを制限することが重要です。AlmaLinuxとUbuntuそれぞれの環境で必要なセキュリティ設定について説明します。

6.1 AlmaLinuxのセキュリティ設定

  1. ファイアウォールの設定
    AlmaLinuxでは、firewalldを使用してファイアウォールを管理します。
    Webサーバーにアクセスするために、HTTP(80)とHTTPS(443)を許可します。

ファイアウォールの設定状況します。

sudo firewall-cmd --list-all

ファイアウォール設定(設定前)

services にhttp や httpsが含まれていないため、http と https を許可する設定を追加する必要があります。

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload  # 設定を反映

HTTP/HTTPSを許可する

設定が反映されているか確認します。
ファイアウォール設定(設定後)

  1. SELinux(Security-Enhanced Linux)の確認
    AlmaLinuxでは、SELinuxがデフォルトで有効化されています。SELinuxは、Linuxカーネルに組み込まれたセキュリティモジュールで、アクセス制御リスト(ACL)を使用して、サービスやプロセスがアクセス可能なリソースを厳密に制御します。

学習環境では、SELinuxの制限によってサービスが期待どおりに動作しない場合があるため、一時的に無効化して設定を進めます。以下の手順で現在のSELinuxステータスを確認し、必要に応じて一時的または永続的に無効化します。

  • ステータスの確認
    現在の動作モードを確認します:
sudo sestatus

  • 一時的に無効化の設定
    Enforcingモード(有効)からPermissiveモード(許可)へ切り替えます:
sudo setenforce 0

このコマンドにより、アクセス制限は解除されます。
ポリシー違反が発生した場合でも動作は許可されますが、ログ(/var/log/audit/audit.log)には記録されます。
改めて、ステータスを確認し、Permissiveモードへ切り替わっていれば問題ないです。

Current mode: permissive

[補足]永続的に無効化する場合
/etc/selinux/configを編集し、SELINUX=disabled に変更します。

sudo vi /etc/selinux/config

ファイルを保存して終了した後、システムを再起動します。

sudo reboot

6.2 Ubuntuのセキュリティ設定

  1. ファイアウォールの設定
    Ubuntuでは、ufw(Uncomplicated Firewall)を使用してファイアウォールを管理します。

ファイアウォールの設定状況します。

sudo ufw status

Status:inactiveの場合はファイアウォールの設定は無効です。

有効化するために、以下のコマンドでApacheに必要なポートを許可します。

sudo ufw allow 'Apache Full'  # HTTPとHTTPSを同時に許可する
sudo ufw enable               # ファイアウォールを有効化(初回のみ)

設定が反映されているか確認します。

sudo ufw status

ファイアウォール設定(設定後)

  1. Fail2Banの導入
    不正アクセスやブルートフォース攻撃を防ぐため、fail2banをインストールします。
sudo apt install fail2ban
  1. SSHのセキュリティ強化
    SSH接続を使用して検証を行う場合、以下の設定を検討します。
  • パスワード認証を無効化し、SSHキーを使用する:
    /etc/ssh/sshd_configを編集し、PasswordAuthentication noへ変更します。
sudo vi /etc/ssh/sshd_config

設定を反映させるため、再起動します。

sudo systemctl restart ssh

[補足]不正アクセスやブルートフォース攻撃の防止
ブルートフォース攻撃(総当たり攻撃)とは、特定の利用者IDを標的に、英数字や記号を組み合わせた異なるパスワードを何度も試してログインを試みる攻撃手法です。
Fail2Banを使用してSSHの最大試行回数を設定することで、攻撃者が複数回ログインを試みた後、自動的にそのIPアドレスをブロックする仕組みが有効になります。
検証を行う際の注意点として、自分のアクセスが誤ってブロックされる可能性があります。そのため、事前にFail2Banのホワイトリスト設定を行い、自分のIPアドレスを除外しておくことが推奨されます。これにより、予期せぬアクセス制限を回避できます。


7. まとめ

この記事では、仮想マシン上でApacheやNginxを使ったWebサーバー構築の基本的な手順を解説しました。それぞれの特徴や用途を理解しながら設定を行うことで、基礎的なサーバー運用スキルを習得できます。また、AlmaLinuxのNginxをリバースプロキシとして設定し、UbuntuのApacheにリクエストを転送する構成や、静的コンテンツと動的コンテンツの使い分けを試すことで、より実践的なWebサーバーの運用スキルを身につけることが期待できます。

参考:
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/index
https://httpd.apache.org/docs/
https://nginx.org/en/docs/
https://www.server-world.info/

Discussion