親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

ApacheでVirtualHostを使うとSSLが効かなくなった


ApacheでVirtualHost

とある案件でApacheの設定でVirtualHostを使っておりました。
※VirtualHostとは簡単に言えば、1台のサーバで複数のドメインを管理できる仕組みです。
「www.aaa.com」というドメインからアクセスされた場合は「/var/www/aaa」へ、
「www.bbb.com」というドメインからアクセスされた場合は「/var/www/bbb」へ振り分けることができます。

この仕組みでしばらく運用していたのですが、後からSSLを導入することになりました。
その時に詰まったこととその解決方法を記したいと思います。

最初は単純に「httpd.conf」に以下のような設定をすれば問題ないかな、と甘く見ていたのですが、残念ながらhttpでは問題ないのですがhttpsでアクセスできませんでした。

httpsのポート番号が443なので、下記のように80の時と同様のドキュメントルートを設定すれば問題ないと思っていたのですが。。。

NameVirtualHost *:80
NameVirtualHost *:443
 
<VirtualHost *:80>
    DocumentRoot "/var/www/html"
    ServerName www.hogehoge.com
</VirtualHost>
<VirtualHost *:443>
    DocumentRoot "/var/www/html"
    ServerName www.hogehoge.com
</VirtualHost>

上手くいかないので、以下のような書き方を試しましたがやはりダメでした。

NameVirtualHost *:80
NameVirtualHost *:443
 
<VirtualHost *:80 *:443>
    DocumentRoot "/var/www/html"
    ServerName www.hogehoge.com
</VirtualHost>



原因はssl.conf

色々詰まりましたが、結果的にssl.confファイルでポート443をListenしていたことが原因でした。

Apacheを導入していればssl.confの中に以下の記述がありますよね?

vim /etc/httpd/conf.d
Listen 443

VirtualHostの設定をhttpd.confに入れていようと、ポート443からのアクセスを待っている設定があるのであれば、443からのアクセスはすべてそちらに行ってしまいます。

解決方法はssl.confのVirtualHostに設定

ssl.conf内にはすでにVirtualHostの記述があるはずです。(と記述があるはず)
ここのVirtualHostの中に以下を追記すれば上手く行きました。

<VirtualHost _default_:443>
 ・
 ・
 ・
ServerName www.hogehoge.com:443
DocumentRoot "/var/www/html/"
 ・
 ・
 ・
</VirtualHost>

まとめ

上記のやり方でも上手くいくはずですが、VirtualHostは設定の仕方が色々なので、他の書き方もあると思います。
VirtualHostの設定に限らず、ポート443でアクセスされた時の設定で上手くいかない場合、他のファイルでListenされていないかなど確認してみてください。


サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

初めてのWebサーバ「Apache」CentOS 7編 (NextPublishing)

初めてのWebサーバ「Apache」CentOS 7編 (NextPublishing)

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか