1からのWEBサーバ作り ローカルにApacheのインストールと実践
はじめに
この記事では前回学んだHTTP通信の仕組みをもとにApacheサーバを立て、実用的なWebサーバ環境を構築します。
Webサーバのソフトウェアには複数ありますが、今回は世界中で使われており、歴史のあるApache HTTP Serverを使用します。基本的なインストールから、Virtual Host、Basic認証、HTTPS化まで、段階的に学んでいきます。
前回の記事はこちらです。
この記事はシリーズの第4回です。シリーズ全体の目次は以下からご覧ください。
シリーズ目次: 1からのWEBサーバ作り - 完全ガイドシリーズ
1. 目的と完成条件の定義
1.1 目的
Apache HTTP Serverを用いたWebサーバ環境を構築し、複数サイトのホスティング、認証機能、セキュアな通信を実現できるようになることを目指します。具体的には以下の技術要素を習得します。
- Apacheのインストールと基本設定
- Virtual Hostによる複数サイトの同時運用
- Basic認証によるアクセス制御
- 自己署名証明書を用いたHTTPS通信の実装
1.2 完成条件
以下の条件をすべて満たすこと:
| No | 検証項目 | 合格条件 |
|---|---|---|
| 1 | インストールと起動 | Apacheをインストールし、Apache2 Default Pageを開く |
| 2 | Virtual Hostの設定 | 2つのサイトを同時に立て、それぞれ閲覧する |
| 3 | Basic認証 | 特定のサイトにパスワードを設定し、認証成功、失敗時の反応を確認する |
| 4 | HTTPS化 | 自己署名証明書を作成、使用し、サイトの通信を暗号化し、HTTPS通信でサイトを閲覧する |
2. 前提条件
2.1 環境情報
- 対象OS: Ubuntu 24.04.3 LTS
- CPU: AMD RYZEN 7 7840HS
- 実行環境: ローカルマシン(物理サーバ)
- ネットワーク: ローカルネットワーク(192.168.x.x)
- 利用ツール: apt(パッケージ管理)、openssl(証明書生成)
2.2 必要なマシン構成
- サーバマシン: Ubuntu 24.04.3 LTS がインストール済み
- メモリ: 最低2GB以上推奨
- ディスク: 10GB以上の空き容量
2.3 前提知識
- 基本的なLinuxコマンド操作
- HTTP/HTTPSプロトコルの基礎知識
- テキストエディタ(vi、nano等)の基本操作
3. WEBサーバとは
3.1 WEBサーバの定義
Wikipediaによると、Webサーバは「HTTPに則り、クライアントソフトウェア(ブラウザ)に対してHTMLや画像などを提供するサービスプログラムおよびそのコンピュータ」を指します。
MDN Web Docsでは「Webサーバはハードウェアまたはソフトウェア、あるいはその両方を指し、Webサイトのファイルを格納し、HTTPサーバとしてユーザーのアクセスを制御する仕組み」と説明されています。
3.2 基本的な仕組み
基本的な仕組みについては前回の記事を閲覧ください。
3.3 役割と重要性
- 公開の基盤: WebサイトやWebサービスをインターネット上に公開するために不可欠
- セキュリティと可用性: ロードバランサやWAFと連携し、大規模サービスでも安定した配信を実現
- 柔軟な構成: Virtual Hostにより1台のサーバで複数のWebサイトをホスティング可能
4. 全体構成図とポート設計
今回構築するシステムの全体像は以下の通りです。
4.1 使用ポート
| ポート番号 | プロトコル | 用途 |
|---|---|---|
| 80 | HTTP | 通常のWeb通信(site1.local) |
| 443 | HTTPS | 暗号化されたWeb通信(site2.local) |
4.2 ディレクトリ構成
/var/www/
├── html/ # デフォルトサイト
├── site1/ # Virtual Host 1(HTTP)
│ └── index.html
└── site2/ # Virtual Host 2(HTTPS + Basic認証)
└── index.html
/etc/apache2/
├── sites-available/ # サイト設定ファイル
│ ├── site1.conf
│ └── site2.conf
├── sites-enabled/ # 有効化されたサイト(シンボリックリンク)
├── ssl/ # SSL証明書
│ ├── server.crt
│ └── server.key
└── .htpasswd # Basic認証用パスワードファイル
5. Apacheのインストール
ここからはPCにApacheをインストールしていきます。
5.1 パッケージの更新とインストール
まず、パッケージリストを最新化し、Apacheをインストールします。
# パッケージリストの更新
sudo apt update
# Apacheのインストール
sudo apt install apache2 -y
-yオプションを付けることで、インストール確認を自動的に「はい」で進めます。
5.2 Apacheの起動確認
Apacheが正常に起動できているか確認します。
sudo systemctl status apache2
起動できていると以下のように表示されます。
tamago@tamago-LOQ-16APH8:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: >
Active: active (running) since Sat 2025-12-06 21:05:28 JST; 2min 48s ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 11733 (apache2)
Tasks: 55 (limit: 18005)
Memory: 6.0M (peak: 7.8M)
CPU: 62ms
CGroup: /system.slice/apache2.service
├─11733 /usr/sbin/apache2 -k start
├─11735 /usr/sbin/apache2 -k start
└─11736 /usr/sbin/apache2 -k start
Active: active (running) と表示されていれば正常に起動しています。
もし起動できていない場合は以下のコマンドで起動してください。
sudo systemctl start apache2
5.3 自動起動の設定
サーバ再起動時にApacheが自動的に起動するように設定します。
sudo systemctl enable apache2
以下のように表示されれば設定完了です。
Synchronizing state of apache2.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable apache2
5.4 ファイアウォールの設定(必要に応じて)
ファイアウォールが有効な場合、HTTPとHTTPSのポートを開放します。
# UFWの状態確認
sudo ufw status
# HTTPとHTTPSを許可
sudo ufw allow 'Apache Full'
# または個別に設定
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
6. Apacheにアクセス
6.1 ローカルマシンからのアクセス
ブラウザから実際にアクセスしてみましょう。
ApacheをインストールしたPCからアクセスする場合はブラウザに以下のいずれかを入力します。
http://localhosthttp://127.0.0.1
6.2 別のデバイスからのアクセス
別のデバイスからアクセスする場合は、サーバのIPアドレスを確認します。
# IPアドレスの確認
ip addr show
または
hostname -I
ブラウザに http://[サーバのIPアドレス] を入力してアクセスします。
6.3 デフォルトページの確認
正常にアクセスできると以下のような画面が表示されます。
この画面が表示されれば、Apacheのインストールと起動は完了です。
このページは /var/www/html/index.html にあるデフォルトのページです。
7. Virtual Hostの設定
Virtual Hostを使うことで、1台のサーバで複数のWebサイトを運用できます。ここでは2つのサイトを構築します。
- site1.local: HTTP通信で動作する通常のサイト
- site2.local: HTTPS通信とBasic認証を設定したセキュアなサイト
7.1 ドキュメントルートの作成
まず、各サイトのコンテンツを格納するディレクトリを作成します。
# site1用のディレクトリ作成
sudo mkdir -p /var/www/site1
# site2用のディレクトリ作成
sudo mkdir -p /var/www/site2
-pオプションは親ディレクトリも含めて作成するオプションです。
7.2 テストページの作成
各サイトに識別可能なHTMLファイルを作成します。
site1のindex.html
sudo nano /var/www/site1/index.html
以下の内容を記述します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Site 1 - HTTP</title>
<style>
body {
font-family: sans-serif;
max-width: 600px;
margin: 50px auto;
padding: 20px;
background-color: #ffffff;
color: #333333;
}
.container {
border: 1px solid #cccccc;
padding: 20px;
border-radius: 4px;
}
h1 {
font-size: 24px;
border-bottom: 1px solid #eeeeee;
padding-bottom: 10px;
margin-top: 0;
}
.status {
color: green;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<h1>Site 1</h1>
<p><strong>Status:</strong> <span class="status">Running (HTTP)</span></p>
<p><strong>Virtual Host:</strong> site1.local</p>
<hr>
<p>アクセス時刻: <span id="time"></span></p>
</div>
<script>
document.getElementById('time').textContent = new Date().toLocaleString('ja-JP');
</script>
</body>
</html>
site2のindex.html
sudo nano /var/www/site2/index.html
以下の内容を記述します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Site 2 - HTTPS + Auth</title>
<style>
body {
font-family: sans-serif;
max-width: 600px;
margin: 50px auto;
padding: 20px;
background-color: #ffffff;
color: #333333;
}
.container {
border: 1px solid #cccccc;
padding: 20px;
border-radius: 4px;
}
h1 {
font-size: 24px;
border-bottom: 1px solid #eeeeee;
padding-bottom: 10px;
margin-top: 0;
}
.status-ok {
color: green;
font-weight: bold;
}
.info-row {
margin-bottom: 10px;
}
.badge {
display: inline-block;
background: #f0f0f0;
color: #333;
padding: 2px 8px;
border-radius: 4px;
font-size: 0.85em;
margin-right: 5px;
border: 1px solid #ddd;
}
</style>
</head>
<body>
<div class="container">
<h1>Site 2 (Secure)</h1>
<div class="info-row">
<strong>Status:</strong> <span class="status-ok">Running</span>
</div>
<div class="info-row">
<strong>Protocol:</strong> HTTPS
<span class="badge">Encrypted</span>
</div>
<div class="info-row">
<strong>Virtual Host:</strong> site2.local
</div>
<div class="info-row">
<strong>Auth:</strong> Basic認証
<span class="badge">Authenticated</span>
</div>
<hr>
<p>アクセス時刻: <span id="time"></span></p>
</div>
<script>
document.getElementById('time').textContent = new Date().toLocaleString('ja-JP');
</script>
</body>
</html>
7.3 ディレクトリの所有権設定
Apacheがファイルにアクセスできるよう、所有権を設定します。
# 所有者をwww-dataに変更
sudo chown -R www-data:www-data /var/www/site1
sudo chown -R www-data:www-data /var/www/site2
# パーミッションの設定
sudo chmod -R 755 /var/www/site1
sudo chmod -R 755 /var/www/site2
-
www-dataはApacheの実行ユーザーです -
755は所有者が読み書き実行可能、その他は読み取りと実行のみ可能という設定です
7.4 Virtual Hostの設定ファイル作成
site1の設定ファイル
sudo nano /etc/apache2/sites-available/site1.conf
以下の内容を記述します。
<VirtualHost *:80>
# サーバの基本設定
ServerName site1.local
ServerAdmin webmaster@site1.local
# ドキュメントルート
DocumentRoot /var/www/site1
# ディレクトリ設定
<Directory /var/www/site1>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# ログファイルの設定
ErrorLog ${APACHE_LOG_DIR}/site1_error.log
CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>
設定項目の説明
-
ServerName: このVirtual Hostに割り当てるドメイン名 -
ServerAdmin: 管理者のメールアドレス(エラーページに表示されることがある) -
DocumentRoot: Webコンテンツが格納されているディレクトリ -
Options Indexes: ディレクトリ内のファイル一覧表示を許可 -
FollowSymLinks: シンボリックリンクを辿ることを許可 -
AllowOverride All: .htaccessファイルによる設定上書きを許可 -
Require all granted: すべてのアクセスを許可
site2の設定ファイル
sudo nano /etc/apache2/sites-available/site2.conf
以下の内容を記述します。
<VirtualHost *:443>
# サーバの基本設定
ServerName site2.local
ServerAdmin webmaster@site2.local
# ドキュメントルート
DocumentRoot /var/www/site2
# SSL/TLS設定
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
# ディレクトリ設定とBasic認証
<Directory /var/www/site2>
Options Indexes FollowSymLinks
AllowOverride All
# Basic認証の設定
AuthType Basic
AuthName "Restricted Area - Please Enter Your Credentials"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
# ログファイルの設定
ErrorLog ${APACHE_LOG_DIR}/site2_error.log
CustomLog ${APACHE_LOG_DIR}/site2_access.log combined
</VirtualHost>
HTTPS関連の設定項目
-
SSLEngine on: SSL/TLSを有効化 -
SSLCertificateFile: サーバ証明書のパス -
SSLCertificateKeyFile: 秘密鍵のパス -
AuthType Basic: Basic認証を使用 -
AuthUserFile: 認証情報を格納したファイルのパス
7.5 hostsファイルの編集
ローカル環境でドメイン名を使用するため、hostsファイルを編集します。
sudo nano /etc/hosts
以下の2行を追加します。
127.0.0.1 site1.local
127.0.0.1 site2.local
Windowsからアクセスする場合
Windowsマシンから上記のサイトにアクセスする場合は、WindowsのC:\Windows\System32\drivers\etc\hostsファイルに以下を追加してください(管理者権限が必要)。
[サーバのIPアドレス] site1.local
[サーバのIPアドレス] site2.local
例:
192.168.1.100 site1.local
192.168.1.100 site2.local
7.6 サイトの有効化
作成した設定ファイルを有効化します。
# site1を有効化
sudo a2ensite site1.conf
# site2を有効化(後でHTTPS設定後に有効化)
# sudo a2ensite site2.conf
7.7 Apacheの設定テストと再起動
設定にエラーがないか確認してから、Apacheを再起動します。
# 設定ファイルの構文チェック
sudo apache2ctl configtest
Syntax OKと表示されればOKです。
# Apacheの再起動
sudo systemctl restart apache2
7.8 site1への動作確認
ブラウザで http://site1.local にアクセスして、作成したページが表示されることを確認します。
トラブルシューティング: ページが表示されない場合
- Apacheが起動しているか確認:
sudo systemctl status apache2 - hostsファイルが正しく編集されているか確認:
cat /etc/hosts - 設定ファイルにエラーがないか確認:
sudo apache2ctl configtest - エラーログを確認:
sudo tail -f /var/log/apache2/site1_error.log
8. Basic認証の設定
Basic認証は、ユーザー名とパスワードによる簡易的なアクセス制限機能です。site2.localに対して認証を設定します。
8.1 パスワードファイルの作成
htpasswdコマンドを使用して、認証用のパスワードファイルを作成します。
# 最初のユーザーを作成(ファイルも同時に作成される)
sudo htpasswd -c /etc/apache2/.htpasswd user1
パスワードの入力を求められるので、任意のパスワードを2回入力します。
New password:
Re-type new password:
Adding password for user user1
-cオプションは新規ファイル作成時のみ使用します。2人目以降のユーザーを追加する場合は-cオプションを外してください(既存ファイルが上書きされてしまいます)。
8.2 追加ユーザーの登録
2人目以降のユーザーを追加する場合は以下のようにします。
# 2人目のユーザーを追加(-cオプションなし)
sudo htpasswd /etc/apache2/.htpasswd user2
8.3 パスワードファイルの確認
作成されたファイルの内容を確認します。
sudo cat /etc/apache2/.htpasswd
以下のように暗号化されたパスワードが表示されます。
user1:$apr1$xyz123$abcdefghijklmnopqrstuvwxyz
user2:$apr1$abc789$zyxwvutsrqponmlkjihgfedcba
パスワードはBCrypt方式で暗号化されているため、元のパスワードを逆算することはできません。
8.4 パスワードファイルのパーミッション設定
セキュリティのため、パスワードファイルの権限を制限します。
sudo chmod 640 /etc/apache2/.htpasswd
sudo chown root:www-data /etc/apache2/.htpasswd
これにより、rootとwww-data(Apacheの実行ユーザー)のみが読み取り可能になります。
9. HTTPS化(SSL/TLS設定)
HTTPS通信を実現するため、自己署名証明書を作成し、site2.localに適用します。
自己署名証明書について
自己署名証明書は学習や開発環境では有用ですが、本番環境では使用しないでください。本番環境では Let's Encrypt などの信頼された認証局が発行する証明書を使用します。
自己署名証明書を使用すると、ブラウザに「この接続は安全ではありません」という警告が表示されますが、これは正常な動作です。
9.1 必要なモジュールの有効化
ApacheでSSL/TLSを使用するため、必要なモジュールを有効化します。
# SSLモジュールの有効化
sudo a2enmod ssl
# ヘッダー制御モジュールの有効化(セキュリティヘッダーに使用)
sudo a2enmod headers
# rewriteモジュールの有効化(HTTPからHTTPSへのリダイレクトに使用)
sudo a2enmod rewrite
各コマンドで以下のようなメッセージが表示されます。
Enabling module ssl.
To activate the new configuration, you need to run:
systemctl restart apache2
9.2 SSL証明書保存用ディレクトリの作成
証明書を格納するディレクトリを作成します。
sudo mkdir -p /etc/apache2/ssl
9.3 自己署名証明書の作成
opensslを使用して、秘密鍵とサーバ証明書を作成します。ここでは2つのやり方を紹介します。
共通:opensslのインストール
まず、opensslをインストールします。以下のコマンドを実行してください。
sudo apt update
sudo apt install openssl
方法1: 秘密鍵と証明書を一度に生成(簡易版)
秘密鍵とサーバ証明書を1つのコマンドで生成します。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/apache2/ssl/server.key \
-out /etc/apache2/ssl/server.crt
オプションの説明
-
req: 証明書要求と証明書の生成を行う -
-x509: 証明書要求ではなく、自己署名証明書を直接生成 -
-nodes: 秘密鍵を暗号化しない(no DES: パスフレーズなし) -
-days 365: 証明書の有効期限を365日に設定 -
-newkey rsa:2048: 2048ビットのRSA秘密鍵を新規作成 -
-keyout: 秘密鍵の出力先パス -
-out: 証明書の出力先パス
コマンドを実行すると、証明書の情報入力を求められます。
Generating a RSA private key
.......+++++
................+++++
writing new private key to '/etc/apache2/ssl/server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:site2.local
Email Address []:admin@site2.local
入力項目の説明
-
Country Name: 国コード(日本の場合はJP) -
State or Province Name: 都道府県名 -
Locality Name: 市区町村名 -
Organization Name: 組織名 -
Organizational Unit Name: 部署名 -
Common Name: 重要: Virtual Hostで設定したドメイン名(site2.local)を必ず入力 -
Email Address: 管理者のメールアドレス
これらを埋めるのは必須ではなく、Common Name以外は設定しなくとも正常に動作します。
方法2: 段階的に生成
より詳細な制御が必要な場合は、以下の手順で段階的に生成します。
ステップ1: 秘密鍵の生成
まず、2048ビットのRSA秘密鍵を生成します。
sudo openssl genrsa -out /etc/apache2/ssl/server.key 2048
実行結果:
Generating RSA private key, 2048 bit long modulus (2 primes)
.......................+++++
..+++++
e is 65537 (0x010001)
セキュリティを強化したい場合は、4096ビットの鍵を生成することもできます:
sudo openssl genrsa -out /etc/apache2/ssl/server.key 4096
ただし、鍵長が長くなるほど処理時間が増加します。
ステップ2: CSR(証明書署名要求)の生成
次に、秘密鍵を使用してCSRを生成します。
sudo openssl req -new -key /etc/apache2/ssl/server.key \
-out /etc/apache2/ssl/server.csr
証明書情報の入力を求められます(方法1と同様):
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Osaka
Locality Name (eg, city) []:Osaka
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:IT Department
Common Name (e.g. server FQDN or YOUR name) []:site2.local
Email Address []:admin@site2.local
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
A challenge passwordとAn optional company nameは空欄のままEnterを押してください。
ステップ3: 自己署名証明書の生成
CSRを使用して、自己署名証明書を生成します。
sudo openssl x509 -req -days 365 \
-in /etc/apache2/ssl/server.csr \
-signkey /etc/apache2/ssl/server.key \
-out /etc/apache2/ssl/server.crt
実行結果:
Signature ok
subject=C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
Getting Private key
オプションの説明
-
x509: X.509証明書データを管理 -
-req: CSRを入力として使用 -
-days 365: 証明書の有効期限 -
-in: 入力するCSRファイル -
-signkey: 署名に使用する秘密鍵 -
-out: 出力する証明書ファイル
ステップ4: CSRファイルの削除(オプション)
証明書が生成されたら、CSRファイルは不要になるため削除できます。
sudo rm /etc/apache2/ssl/server.csr
方法3: 設定ファイルを使った生成
証明書情報を事前に設定ファイルに記述することで、対話的な入力を省略できます。
ステップ1: OpenSSL設定ファイルの作成
sudo nano /etc/apache2/ssl/openssl.cnf
以下の内容を記述:
[ req ]
default_bits = 2048
default_md = sha256
default_keyfile = server.key
prompt = no
encrypt_key = no
distinguished_name = req_distinguished_name
x509_extensions = v3_req
[ req_distinguished_name ]
C = JP
ST = Osaka
L = Osaka
O = My Company
OU = IT Department
CN = site2.local
emailAddress = admin@site2.local
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = site2.local
DNS.2 = www.site2.local
DNS.3 = localhost
IP.1 = 127.0.0.1
IP.2 = 192.168.1.100
設定項目の説明
-
[ alt_names ]セクション: SANs(Subject Alternative Names)を設定 -
DNS.1,DNS.2: 証明書が有効なドメイン名 -
IP.1,IP.2: 証明書が有効なIPアドレス -
IP.2は実際のサーバIPアドレスに変更してください
ステップ2: 設定ファイルを使用して証明書を生成
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-config /etc/apache2/ssl/openssl.cnf \
-keyout /etc/apache2/ssl/server.key \
-out /etc/apache2/ssl/server.crt
この方法では対話的な入力なしで証明書が生成されます。
Generating a RSA private key
.......+++++
................+++++
writing new private key to '/etc/apache2/ssl/server.key'
-----
9.4 証明書ファイルの確認
生成された証明書ファイルを確認します。
# ファイルの存在確認
ls -l /etc/apache2/ssl/
# 証明書の内容確認
sudo openssl x509 -in /etc/apache2/ssl/server.crt -text -noout
以下のような情報が表示されます。
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
xx:xx:xx:xx:xx:xx:xx:xx
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
Validity
Not Before: Dec 6 12:00:00 2025 GMT
Not After : Dec 6 12:00:00 2026 GMT
Subject: C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
9.5 証明書ファイルのパーミッション設定
セキュリティのため、秘密鍵のパーミッションを制限します。
sudo chmod 600 /etc/apache2/ssl/server.key
sudo chmod 644 /etc/apache2/ssl/server.crt
- 秘密鍵(.key)は所有者のみが読み取り可能(600)
- 証明書(.crt)は誰でも読み取り可能だが書き込み不可(644)
9.6 site2の有効化
これまでの設定を反映させるため、site2を有効化してApacheを再起動します。
# site2の有効化
sudo a2ensite site2.conf
# 設定の構文チェック
sudo apache2ctl configtest
# Apacheの再起動
sudo systemctl restart apache2
9.7 HTTPSでの動作確認
ブラウザで https://site2.local にアクセスします。
-
証明書の警告画面が表示されます
- Chromeの場合: 「この接続ではプライバシーが保護されません」
- Firefoxの場合: 「警告: 潜在的なセキュリティリスクあり」
-
「詳細設定」→「site2.local に進む(安全ではありません)」をクリック
-
Basic認証のダイアログが表示されます
- ユーザー名:
user1 - パスワード: 先ほど設定したパスワード
- ユーザー名:
-
認証に成功すると、site2のページが表示されます
ここで正しいユーザ名とパスワードを打つと

このようにアクセスすることができました。
試しパスワードを間違えて見ると、再度ユーザ名とパスワードを求め、キャンセルを押すと「あなたを認証できませんでした」とアクセスできないようにすることができました。

これで
- Virtual Hostによる複数サイトの同時運用
- Basic認証によるアクセス制御
- 自己署名証明書を用いたHTTPS通信の実装
は完成です
警告画面が表示される理由
自己署名証明書は信頼された認証局(CA)によって署名されていないため、ブラウザは「この証明書を信頼できない」と判断します。これは自己署名証明書を使用する場合の正常な動作です。
本番環境では Let's Encrypt などの無料の認証局を使用することで、この警告を回避できます。
10. 動作確認と検証
構築したシステムが正常に動作しているか、各検証項目を確認します。
10.1 検証項目1: Apacheのインストールと起動
確認方法:
# Apacheの稼働状況確認
sudo systemctl status apache2
# プロセス確認
ps aux | grep apache2
# ポート使用状況確認
sudo ss -tlnp | grep apache2
期待される結果:
-
Active: active (running)と表示される - apache2プロセスが複数起動している
- ポート80と443でLISTEN状態になっている
LISTEN 0 511 *:443 *:* users:(("apache2",pid=16430,fd=6),("apache2",pid=16429,fd=6),("apache2",pid=16427,fd=6))
LISTEN 0 511 *:80 *:* users:(("apache2",pid=16430,fd=4),("apache2",pid=16429,fd=4),("apache2",pid=16427,fd=4))
10.2 検証項目2: Virtual Hostの設定
確認方法:
- ブラウザで
http://site1.localにアクセス - ブラウザで
https://site2.localにアクセス(警告を無視して進む)
期待される結果:
- site1.local: 紫色のグラデーション背景のページが表示される
- site2.local: ピンク色のグラデーション背景のページが表示される(認証後)
- それぞれ異なるコンテンツが表示される
ログの確認:
# site1のアクセスログ
sudo tail -f /var/log/apache2/site1_access.log
# site2のアクセスログ
sudo tail -f /var/log/apache2/site2_access.log
10.3 検証項目3: Basic認証
テストケース1: 認証情報なしでアクセス
curl -I https://site2.local -k
期待される結果:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Restricted Area - Please Enter Your Credentials"
テストケース2: 正しい認証情報でアクセス
curl -u user1:password https://site2.local -k
期待される結果: HTMLコンテンツが返される(200 OK)
テストケース3: 誤った認証情報でアクセス
curl -u user1:wrongpassword https://site2.local -k
期待される結果:
HTTP/1.1 401 Unauthorized
ブラウザでのテスト:
-
https://site2.localにアクセス - 認証ダイアログで「キャンセル」をクリック → 401 Unauthorized ページが表示される
- 誤ったパスワードを入力 → 再度認証ダイアログが表示される
- 正しいユーザー名とパスワードを入力 → ページが正常に表示される
10.4 検証項目4: HTTPS化
SSL/TLS接続の確認:
# SSL証明書の情報確認
openssl s_client -connect site2.local:443 -servername site2.local
期待される結果:
CONNECTED(00000003)
depth=0 C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
verify error:num=18:self signed certificate
verify return:1
---
Certificate chain
0 s:C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
i:C = JP, ST = Osaka, L = Osaka, O = My Company, OU = IT Department, CN = site2.local
---
ブラウザでのSSL確認:
-
https://site2.localにアクセス - アドレスバーの鍵アイコンをクリック
- 「証明書」または「接続は保護されていません」をクリック
- 証明書情報を確認:
- 発行先: site2.local
- 発行者: site2.local(自己署名)
- 有効期限: 365日
通信の暗号化確認:
ブラウザの開発者ツール(F12)→「セキュリティ」タブで以下を確認:
- 接続が暗号化されている
- TLS 1.2またはTLS 1.3が使用されている
- 暗号化スイートの情報
11. セキュリティ強化(追加設定)
11.1 セキュリティヘッダーの追加
site2の設定ファイルにセキュリティヘッダーを追加します。
sudo nano /etc/apache2/sites-available/site2.conf
</VirtualHost>の直前に以下を追加:
# セキュリティヘッダーの追加
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
セキュリティヘッダーの説明
-
Strict-Transport-Security: HTTPS接続を強制(HSTS) -
X-Frame-Options: クリックジャッキング攻撃を防止 -
X-Content-Type-Options: MIMEタイプスニッフィングを防止 -
X-XSS-Protection: XSS攻撃の検出と防御 -
Referrer-Policy: リファラー情報の送信ポリシー
11.2 不要な情報の非表示
Apacheのバージョン情報を隠すため、セキュリティ設定を変更します。
sudo nano /etc/apache2/conf-available/security.conf
以下の行を変更:
# 変更前
ServerTokens OS
ServerSignature On
# 変更後
ServerTokens Prod
ServerSignature Off
11.3 TLSプロトコルと暗号化スイートの強化
sudo nano /etc/apache2/sites-available/site2.conf
SSL設定部分に以下を追加:
# TLSプロトコルの制限(TLS 1.2以上のみ許可)
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
# 強力な暗号化スイートのみ使用
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on
11.4 設定の反映
# 設定の構文チェック
sudo apache2ctl configtest
# Apacheの再起動
sudo systemctl restart apache2
Apacheの再起動だけだとBasic認証時パスワードを正しく入力しても再度打ち直しになることがあります。
ブラウザを再起動や、キャッシュのクリアなどをしてください。
12. トラブルシューティング
構築中に発生しやすい問題と解決方法をまとめます。
12.1 Apacheが起動しない
症状:
sudo systemctl start apache2
Job for apache2.service failed because the control process exited with error code.
原因と対処法:
-
設定ファイルの構文エラー
sudo apache2ctl configtestエラー箇所が表示されるので修正する
-
ポート競合
sudo netstat -tlnp | grep :80 sudo netstat -tlnp | grep :443他のプロセスがポートを使用している場合は停止する
-
SSL証明書のパスが間違っている
ls -l /etc/apache2/ssl/証明書ファイルが存在し、パーミッションが正しいか確認
12.2 Virtual Hostが動作しない
症状: デフォルトページが表示され続ける
対処法:
-
サイトが有効化されているか確認
ls -l /etc/apache2/sites-enabled/site1.confとsite2.confのシンボリックリンクがあるか確認
-
hostsファイルの設定確認
cat /etc/hosts | grep site -
DNSキャッシュのクリア
sudo systemctl restart systemd-resolved -
ブラウザのキャッシュをクリア
Ctrl + Shift + Delete でキャッシュを削除
12.3 Basic認証が動作しない
症状: 認証ダイアログが表示されない、または常に401エラー
対処法:
-
パスワードファイルの存在とパーミッション確認
sudo ls -l /etc/apache2/.htpasswd sudo cat /etc/apache2/.htpasswd -
パスワードファイルのパスが正しいか確認
sudo grep AuthUserFile /etc/apache2/sites-available/site2.conf -
ユーザーの再作成
sudo htpasswd -c /etc/apache2/.htpasswd user1 -
エラーログの確認
sudo tail -f /var/log/apache2/site2_error.log
12.4 HTTPS接続エラー
症状: ERR_SSL_PROTOCOL_ERROR または SEC_ERROR_UNKNOWN_ISSUER
対処法:
-
SSLモジュールが有効か確認
sudo apache2ctl -M | grep ssl表示されない場合:
sudo a2enmod ssl -
証明書ファイルの確認
sudo openssl x509 -in /etc/apache2/ssl/server.crt -text -nooutCommon Nameがsite2.localと一致しているか確認
-
ポート443が開いているか確認
sudo netstat -tlnp | grep :443 -
証明書の再生成
sudo rm /etc/apache2/ssl/server.* # 9.3節の手順で再生成
12.5 Permission Denied エラー
症状: 403 Forbidden エラー、またはログに Permission denied
対処法:
-
ディレクトリのパーミッション確認
ls -la /var/www/site1 ls -la /var/www/site2 -
所有権の修正
sudo chown -R www-data:www-data /var/www/site1 sudo chown -R www-data:www-data /var/www/site2 -
SELinuxの確認(該当する場合)
sestatus # 有効な場合は適切なコンテキストを設定
12.6 ログファイルの確認方法
問題の原因を特定するため、ログを確認します。
# エラーログをリアルタイムで監視
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/site1_error.log
sudo tail -f /var/log/apache2/site2_error.log
# アクセスログの確認
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/site1_access.log
sudo tail -f /var/log/apache2/site2_access.log
# 特定のエラーを検索
sudo grep "error" /var/log/apache2/error.log | tail -20
13. 発展: HTTPからHTTPSへの自動リダイレクト
site2へのHTTPアクセスを自動的にHTTPSにリダイレクトする設定を追加します。
13.1 リダイレクト用の設定追加
sudo nano /etc/apache2/sites-available/site2.conf
ファイルの先頭に以下を追加:
# HTTP (port 80) での site2.local へのアクセスをHTTPSにリダイレクト
<VirtualHost *:80>
ServerName site2.local
# HTTPSへのリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
ErrorLog ${APACHE_LOG_DIR}/site2_redirect_error.log
CustomLog ${APACHE_LOG_DIR}/site2_redirect_access.log combined
</VirtualHost>
# 既存のHTTPS設定(変更なし)
<VirtualHost *:443>
...
</VirtualHost>
13.2 設定の反映
# rewriteモジュールが有効か確認
sudo a2enmod rewrite
# 設定の構文チェック
sudo apache2ctl configtest
# Apacheの再起動
sudo systemctl restart apache2
13.3 リダイレクトの動作確認
# HTTPアクセスがHTTPSにリダイレクトされることを確認
curl -I http://site2.local -L
期待される結果:
HTTP/1.1 301 Moved Permanently
Location: https://site2.local/
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Restricted Area - Please Enter Your Credentials"
14. 設定ファイルの完全版
14.1 site1.conf
<VirtualHost *:80>
# サーバの基本設定
ServerName site1.local
ServerAdmin webmaster@site1.local
# ドキュメントルート
DocumentRoot /var/www/site1
# ディレクトリ設定
<Directory /var/www/site1>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# ログファイルの設定
ErrorLog ${APACHE_LOG_DIR}/site1_error.log
CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>
14.2 site2.conf
# HTTPからHTTPSへのリダイレクト
<VirtualHost *:80>
ServerName site2.local
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
ErrorLog ${APACHE_LOG_DIR}/site2_redirect_error.log
CustomLog ${APACHE_LOG_DIR}/site2_redirect_access.log combined
</VirtualHost>
# HTTPS設定
<VirtualHost *:443>
# サーバの基本設定
ServerName site2.local
ServerAdmin webmaster@site2.local
# ドキュメントルート
DocumentRoot /var/www/site2
# SSL/TLS設定
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
# TLSプロトコルの制限
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on
# セキュリティヘッダー
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# ディレクトリ設定とBasic認証
<Directory /var/www/site2>
Options Indexes FollowSymLinks
AllowOverride All
# Basic認証の設定
AuthType Basic
AuthName "Restricted Area - Please Enter Your Credentials"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
# ログファイルの設定
ErrorLog ${APACHE_LOG_DIR}/site2_error.log
CustomLog ${APACHE_LOG_DIR}/site2_access.log combined
</VirtualHost>
14.3 security.conf
# Changing the following options will not really affect the security of the
# server, but might make attacks slightly more difficult in some cases.
#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of: Full | OS | Minimal | Minor | Major | Prod
# where Full conveys the most information, and Prod the least.
#ServerTokens Minimal
ServerTokens Prod
#ServerTokens Full
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#ServerSignature Off
ServerSignature Off
#
# Allow TRACE method
#
# Set to "extended" to also reflect the request body (only for testing and
# diagnostic purposes).
#
# Set to one of: On | Off | extended
TraceEnable Off
#TraceEnable On
#
# Forbid access to version control directories
#
# If you use version control systems in your document root, you should
# probably deny access to their directories.
#
# Examples:
#
#RedirectMatch 404 /\.git
#RedirectMatch 404 /\.svn
#
# Setting this header will prevent MSIE from interpreting files as something
# else than declared by the content type in the HTTP headers.
# Requires mod_headers to be enabled.
#
#Header set X-Content-Type-Options: "nosniff"
#
# Setting this header will prevent other sites from embedding pages from this
# site as frames. This defends against clickjacking attacks.
# Requires mod_headers to be enabled.
#
#Header set Content-Security-Policy "frame-ancestors 'self';"
15. まとめ
本記事では、Apacheを使用したWebサーバの構築を実践しました。
15.1 達成できたこと
✅ Apacheのインストールと起動
✅ Virtual Hostによる複数サイトの同時運用
✅ Basic認証によるアクセス制御
✅ 自己署名証明書を用いたHTTPS通信の実装
✅ セキュリティヘッダーの設定
✅ HTTPからHTTPSへの自動リダイレクト
15.2 学んだ技術要素
| 技術要素 | 詳細 |
|---|---|
| Virtual Host | 1つのサーバで複数のWebサイトをホスティング |
| Basic認証 | ユーザー名とパスワードによるアクセス制限 |
| SSL/TLS | 通信の暗号化とHTTPS化 |
| 自己署名証明書 | 開発環境でのHTTPS通信の実現 |
| セキュリティヘッダー | XSS、クリックジャッキング等の攻撃対策 |
16. 参考文献
- Apache HTTP Server Documentation
- Let's Encrypt Documentation
- OWASP Secure Headers Project
- Wikipedia - Webサーバ
- MDN - What is a web server?
- Heartbeats - Apache入門
付録A: OpenSSLコマンド一覧
証明書管理に役立つOpenSSLコマンドをまとめます。
秘密鍵の操作
# RSA秘密鍵の生成(2048bit)
openssl genrsa -out private.key 2048
# RSA秘密鍵の生成(4096bit、より安全)
openssl genrsa -out private.key 4096
# パスフレーズ付き秘密鍵の生成
openssl genrsa -aes256 -out private.key 2048
# 秘密鍵からパスフレーズを削除
openssl rsa -in encrypted.key -out decrypted.key
# 秘密鍵の詳細情報表示
openssl rsa -in private.key -text -noout
# 秘密鍵のモジュラス確認
openssl rsa -in private.key -noout -modulus
# 秘密鍵から公開鍵を抽出
openssl rsa -in private.key -pubout -out public.key
証明書署名要求(CSR)の操作
# CSRの生成(対話式)
openssl req -new -key private.key -out request.csr
# CSRの生成(設定ファイル使用)
openssl req -new -key private.key -out request.csr -config openssl.cnf
# CSRの内容確認
openssl req -in request.csr -text -noout
# CSRのサブジェクト情報のみ表示
openssl req -in request.csr -noout -subject
# CSRの検証
openssl req -in request.csr -noout -verify
証明書の操作
# 自己署名証明書の生成(CSRから)
openssl x509 -req -days 365 -in request.csr -signkey private.key -out certificate.crt
# 自己署名証明書の生成(一発生成)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate.crt
# 証明書の詳細情報表示
openssl x509 -in certificate.crt -text -noout
# 証明書の有効期限確認
openssl x509 -in certificate.crt -noout -dates
# 証明書のサブジェクト情報確認
openssl x509 -in certificate.crt -noout -subject
# 証明書の発行者情報確認
openssl x509 -in certificate.crt -noout -issuer
# 証明書のシリアル番号確認
openssl x509 -in certificate.crt -noout -serial
# 証明書のフィンガープリント確認
openssl x509 -in certificate.crt -noout -fingerprint -sha256
# 証明書のモジュラス確認
openssl x509 -in certificate.crt -noout -modulus
# PEM形式からDER形式への変換
openssl x509 -in certificate.crt -outform DER -out certificate.der
# DER形式からPEM形式への変換
openssl x509 -in certificate.der -inform DER -out certificate.crt
SSL/TLS接続のテスト
# SSLサーバへの接続テスト
openssl s_client -connect example.com:443
# SNI(Server Name Indication)を指定して接続
openssl s_client -connect example.com:443 -servername example.com
# 証明書チェーンの確認
openssl s_client -connect example.com:443 -showcerts
# 特定のTLSバージョンで接続
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
# タイムアウト設定付きで接続
openssl s_client -connect example.com:443 -timeout 10
# 証明書の有効期限をリモートサーバで確認
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
証明書と秘密鍵の整合性確認
# 秘密鍵のMD5ハッシュ
openssl rsa -in private.key -noout -modulus | openssl md5
# CSRのMD5ハッシュ
openssl req -in request.csr -noout -modulus | openssl md5
# 証明書のMD5ハッシュ
openssl x509 -in certificate.crt -noout -modulus | openssl md5
# 3つのハッシュが一致すれば、秘密鍵・CSR・証明書は対応している
その他の便利なコマンド
# ランダムなパスワード生成(16文字)
openssl rand -base64 16
# ランダムなパスワード生成(32文字)
openssl rand -base64 32
# ファイルのハッシュ値計算(SHA256)
openssl dgst -sha256 file.txt
# ファイルの暗号化(AES256)
openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc
# ファイルの復号化
openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt
# Base64エンコード
echo "Hello World" | openssl base64
# Base64デコード
echo "SGVsbG8gV29ybGQK" | openssl base64 -d
# 証明書の有効期限切れチェック(スクリプト向け)
openssl x509 -in certificate.crt -noout -checkend 86400
# 終了コード 0: まだ有効、1: 24時間以内に期限切れ
PKCS#12形式の操作
# PEMからPKCS#12への変換
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt
# PKCS#12からPEMへの変換
openssl pkcs12 -in certificate.pfx -out certificate.pem -nodes
# PKCS#12の内容確認
openssl pkcs12 -in certificate.pfx -info
付録B: コマンド一覧
よく使うコマンドをまとめます。
Apache関連
# Apache関連
sudo systemctl start apache2 # 起動
sudo systemctl stop apache2 # 停止
sudo systemctl restart apache2 # 再起動
sudo systemctl reload apache2 # 設定リロード(接続を切らずに設定反映)
sudo systemctl status apache2 # 状態確認
sudo systemctl enable apache2 # 自動起動有効化
sudo systemctl disable apache2 # 自動起動無効化
sudo apache2ctl configtest # 設定の構文チェック
sudo apache2ctl -M # 有効なモジュール一覧表示
sudo apache2ctl -S # Virtual Host設定一覧表示
sudo apache2ctl -V # Apacheバージョンとコンパイルオプション表示
サイトとモジュールの管理
# サイトの有効化/無効化
sudo a2ensite site1.conf # 有効化
sudo a2dissite site1.conf # 無効化
sudo a2ensite *.conf # すべてのサイトを有効化
# モジュールの有効化/無効化
sudo a2enmod ssl # 有効化
sudo a2dismod ssl # 無効化
sudo a2enmod rewrite headers # 複数モジュールを同時に有効化
# 設定ファイルの有効化/無効化
sudo a2enconf security # 有効化
sudo a2disconf security # 無効化
ログの確認
# ログの確認
sudo tail -f /var/log/apache2/error.log # エラーログをリアルタイム監視
sudo tail -f /var/log/apache2/access.log # アクセスログをリアルタイム監視
sudo tail -100 /var/log/apache2/error.log # エラーログの最新100行表示
sudo grep "error" /var/log/apache2/error.log # エラーのみ抽出
sudo grep "404" /var/log/apache2/access.log # 404エラーのみ抽出
sudo tail -f /var/log/apache2/site1_access.log # 特定サイトのログ監視
# ログローテーション後のログ確認
sudo zcat /var/log/apache2/access.log.2.gz | tail -100 # 圧縮されたログの確認
パスワードファイルの管理
# パスワードファイルの管理
sudo htpasswd -c /path/.htpasswd user1 # 新規作成(-cオプション付き)
sudo htpasswd /path/.htpasswd user2 # ユーザー追加
sudo htpasswd -D /path/.htpasswd user1 # ユーザー削除
sudo htpasswd -v /path/.htpasswd user1 # パスワード検証
cat /path/.htpasswd # 登録ユーザー一覧表示
OpenSSL関連
# SSL証明書の確認
sudo openssl x509 -in /path/cert.crt -text -noout # 証明書詳細表示
sudo openssl x509 -in /path/cert.crt -noout -dates # 有効期限確認
sudo openssl x509 -in /path/cert.crt -noout -subject # サブジェクト確認
sudo openssl rsa -in /path/key.key -text -noout # 秘密鍵詳細表示
# SSL接続テスト
openssl s_client -connect domain:443 -servername domain # SSL接続確認
openssl s_client -connect localhost:443 -servername site2.local # ローカルテスト
# 証明書と秘密鍵の整合性確認
sudo openssl rsa -in /path/key.key -noout -modulus | openssl md5
sudo openssl x509 -in /path/cert.crt -noout -modulus | openssl md5
ネットワーク確認
# ポート使用状況確認
sudo netstat -tlnp | grep apache2 # Apacheが使用中のポート確認
sudo netstat -tlnp | grep :80 # ポート80の使用状況
sudo netstat -tlnp | grep :443 # ポート443の使用状況
sudo ss -tlnp | grep apache2 # ss コマンドでの確認(高速)
# プロセス確認
ps aux | grep apache2 # Apacheプロセス確認
pgrep -a apache2 # Apacheプロセス一覧
# ファイアウォール確認
sudo ufw status # UFWの状態確認
sudo ufw status numbered # ルール番号付きで表示
sudo iptables -L -n # iptablesのルール確認
ファイル・ディレクトリ操作
# パーミッション設定
sudo chown -R www-data:www-data /var/www/site1 # 所有権変更
sudo chmod -R 755 /var/www/site1 # パーミッション変更
sudo chmod 640 /etc/apache2/.htpasswd # 認証ファイルの権限設定
sudo chmod 600 /etc/apache2/ssl/server.key # 秘密鍵の権限設定
# ディスク使用量確認
du -sh /var/www/* # 各サイトの容量確認
du -sh /var/log/apache2/* # ログファイルの容量確認
df -h # ディスク全体の使用状況
便利なワンライナー
# 特定IPからのアクセス数をカウント
sudo grep "192.168.1.100" /var/log/apache2/access.log | wc -l
# アクセス数の多いIPアドレス Top 10
sudo awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# ステータスコード別のアクセス数
sudo awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn
# 最もアクセスされたページ Top 10
sudo awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# リアルタイムでアクセスを監視(IPアドレスとURL)
sudo tail -f /var/log/apache2/access.log | awk '{print $1, $7}'
# 証明書の有効期限まで残り日数を計算
echo $(( ($(date -d "$(openssl x509 -in /etc/apache2/ssl/server.crt -noout -enddate | cut -d= -f2)" +%s) - $(date +%s)) / 86400 )) days
付録C: ディレクトリとファイルの完全なパス一覧
/var/www/
├── html/
│ └── index.html (Apacheデフォルトページ)
├── site1/
│ └── index.html
└── site2/
└── index.html
/etc/apache2/
├── apache2.conf (メイン設定ファイル)
├── sites-available/
│ ├── 000-default.conf
│ ├── site1.conf
│ └── site2.conf
├── sites-enabled/
│ ├── site1.conf -> ../sites-available/site1.conf
│ └── site2.conf -> ../sites-available/site2.conf
├── mods-enabled/
│ ├── ssl.conf -> ../mods-available/ssl.conf
│ ├── ssl.load -> ../mods-available/ssl.load
│ ├── rewrite.load -> ../mods-available/rewrite.load
│ └── headers.load -> ../mods-available/headers.load
├── ssl/
│ ├── server.crt
│ └── server.key
├── .htpasswd
└── conf-available/
└── security.conf
/var/log/apache2/
├── access.log
├── error.log
├── site1_access.log
├── site1_error.log
├── site2_access.log
├── site2_error.log
├── site2_redirect_access.log
└── site2_redirect_error.log
/etc/hosts


