2026年5月19日

2026年5月19日

Apacheで複数のIPアドレスをListenする方法|ports.confとIPベースのバーチャルホスト

Apache は既定で Listen 80 と書かれており、サーバーのすべてのIPアドレスの80番ポートで接続を受け付けます。社内向けと外部向けでIPアドレスを分けたい、IPアドレスごとに別のサイトを出したい、といった場合は、Listen に IP アドレスを指定します。

この記事では、Apache 2.4 で複数のIPアドレスを指定して待ち受ける手順を説明します。パスは2026年10月時点の Ubuntu 24.04 / Debian 12 を例にし、RHEL 系(AlmaLinux・Rocky Linux)の違いは都度書いています。例のIPアドレス 192.0.2.10 と 198.51.100.20 は説明用のものなので、自分の環境の値に置き換えてください。

前提: IPアドレスがサーバーに割り当てられていること

Apache が待ち受けられるのは、そのサーバーのネットワークインターフェースに実際に割り当てられたIPアドレスだけです。先に確認します。

ip -brief address

割り当てられていないIPアドレスを Listen に書くと、Apache は起動に失敗し、エラーログに Cannot assign requested address と出ます。IPアドレスの追加は、Ubuntu なら netplan、RHEL 系なら NetworkManager(nmcli)で行います。クラウドの場合は、管理画面でセカンダリIPを割り当てる操作も必要です。

Listenの書き方

Listen の書式は Listen [IPアドレス:]ポート番号 [プロトコル] です。IPアドレスを指定するときも、ポート番号は省略できません。

# IPアドレスとポートを指定する
Listen 192.0.2.10:80
Listen 198.51.100.20:80

# IPv6 は [] で囲む
Listen [2001:db8::10]:80

Listen 192.0.2.10 のようにポートを付けずに書くと、設定の読み込み時に Port must be specified というエラーになり、Apache は起動しません。

設定ファイルを編集する

Listen が書かれている場所は OS によって違います。

OS ファイル
Ubuntu / Debian /etc/apache2/ports.conf
RHEL 系 /etc/httpd/conf/httpd.conf

Ubuntu の ports.conf には、最初は次の内容が書かれています。

Listen 80

<IfModule ssl_module>
	Listen 443
</IfModule>

<IfModule mod_gnutls.c>
	Listen 443
</IfModule>

ここで大事なのは、既存の Listen 80 を残したまま Listen 192.0.2.10:80 を足さないことです。Listen 80 はすべてのIPアドレスの80番を意味するため、IPを指定した行と範囲が重なります。Apache の公式マニュアルは、重なる Listen は起動できない致命的なエラーになると説明しています(エラーログには Address already in use: ... could not bind to address 192.0.2.10:80 のように出ます)。

IPアドレスで絞るときは、Listen 80 を書き換えます。

# /etc/apache2/ports.conf
Listen 192.0.2.10:80
Listen 198.51.100.20:80

<IfModule ssl_module>
	Listen 192.0.2.10:443
	Listen 198.51.100.20:443
</IfModule>

<IfModule mod_gnutls.c>
	Listen 192.0.2.10:443
	Listen 198.51.100.20:443
</IfModule>

すべてのIPアドレスで待ち受けたまま、IPアドレスごとにサイトを分けたいだけなら、Listen 80 は変えずに、次のバーチャルホストの設定だけで足ります。Listen を IP で絞るのは、特定のIPアドレスでは待ち受けたくない(たとえば外部向けのIPでは管理用のサイトを出さない)場合です。

IPアドレスごとにサイトを分ける(バーチャルホスト)

Listen は「どのアドレスとポートで待ち受けるか」を決めるだけで、どのサイトを返すかは決めません。IPアドレスごとに別のサイトを出すには、<VirtualHost> にIPアドレスとポートを書きます。

# /etc/apache2/sites-available/internal.conf
<VirtualHost 192.0.2.10:80>
    ServerName intranet.example.com
    DocumentRoot /var/www/internal
    ErrorLog ${APACHE_LOG_DIR}/internal_error.log
    CustomLog ${APACHE_LOG_DIR}/internal_access.log combined
</VirtualHost>
# /etc/apache2/sites-available/public.conf
<VirtualHost 198.51.100.20:80>
    ServerName www.example.com
    DocumentRoot /var/www/public
    ErrorLog ${APACHE_LOG_DIR}/public_error.log
    CustomLog ${APACHE_LOG_DIR}/public_access.log combined
</VirtualHost>

Ubuntu では、作った設定を a2ensite で有効にします。Listen を IP で絞った場合、既定の 000-default.conf(<VirtualHost *:80>)は残しておいてもかまいませんが、不要なら無効にします。

sudo a2ensite internal.conf public.conf
# 不要なら既定のサイトを無効にする
sudo a2dissite 000-default.conf

RHEL 系では、/etc/httpd/conf.d/ に .conf で置けば読み込まれます。ErrorLog は /var/log/httpd/... のように書き換えます(${APACHE_LOG_DIR} は Debian 系の変数です)。

<VirtualHost> に書いたアドレスとポートで Apache が待ち受けていないと、そのサイトにはアクセスできません。Listen と <VirtualHost> の組み合わせがそろっているか確認してください。

HTTPSのサイト

HTTPS も同じ考え方で、<VirtualHost 192.0.2.10:443> の中に SSLEngine on と証明書の設定を書きます。443番では Listen のプロトコルは自動的に https になります。443以外のポートで HTTPS を出す場合だけ、Listen 192.0.2.10:8443 https のようにプロトコルを書きます。

設定を反映して確認する

# 構文チェック
sudo apache2ctl configtest

# 反映(ここでは待ち受けを作り直すため restart を使う)
sudo systemctl restart apache2

RHEL 系では sudo apachectl configtest と sudo systemctl restart httpd です。

待ち受けているアドレスとバーチャルホストの対応を確認します。

# 待ち受けているアドレスとポート
sudo ss -ltnp | grep -E 'apache2|httpd'

# どのアドレスにどのバーチャルホストが割り当てられたか
sudo apache2ctl -S

ss の出力で 192.0.2.10:80 と 198.51.100.20:80 が並び、*:80(0.0.0.0:80)が無ければ、IPアドレスで絞り込めています。

それぞれのIPアドレスにリクエストを送って、別々のサイトが返ることを確かめます。

curl -sI http://192.0.2.10/
curl -sI http://198.51.100.20/

うまくいかないとき

エラーログのメッセージ(抜粋) 原因 対処
(98)Address already in use: ... could not bind to address Listen 80 とIP指定の Listen が重なっている、または nginx など別のプログラムが同じポートを使っている ports.conf を確認し、sudo ss -ltnp でポートを使っているプログラムを調べる
(99)Cannot assign requested address: ... could not bind to address そのIPアドレスがサーバーに割り当てられていない ip -brief address で確認し、IPアドレスを割り当てる
no listening sockets available, shutting down 待ち受けに1つも成功しなかった 上の2つのメッセージが出ていないか確認する

エラーログは Ubuntu なら /var/log/apache2/error.log、RHEL 系なら /var/log/httpd/error_log です。起動に失敗した直後は sudo journalctl -u apache2 -n 50(RHEL 系は -u httpd)でも確認できます。

ファイアウォール(ufw や firewalld)で80番・443番を開けていない場合や、クラウドのセキュリティグループで止めている場合も、つながりません。Apache が待ち受けているのに外から届かないときは、そちらを確認します。

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲