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 が待ち受けているのに外から届かないときは、そちらを確認します。