UNIXCentOSWebサーバー Apache

Apache HTTP Server のインストールと設定

更新日:2017年10月17日

Apache HTTP Server インストール

Apache HTTP Serverは世界中で最も普及しているWebサーバーです、無料で利用できることはもとより、全てオープンソースとして公開されているため、随時よりよいプログラムに改編されています。
また、A pache 名の由来と同じく、モジュールによる機能拡張の追加が簡単でCGI(perl,PHP)プログラムと親和性が高いことが特徴です。CentOSではyumを使用して手軽にインストールできます。

Apache インストールと起動

ApacheをインストールしWebサービスを起動させて、起動状態を確認しましょう。

# yum -y install httpd
# systemctl start httpd.service
# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 土 2017-09-30 20:58:37 JST; 4s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 13268 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
tq13268 /usr/sbin/httpd -DFOREGROUND

...

9月 30 20:58:37 localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.

ファイアウォール変更

CentOS 7ではデフォルトではWebサービス関連のポートはファイアウォールによって閉じられているため、外部ブラウザからWebページを見ることが出来ません。
http:80番,https:443番を解放してブラウザからアクセスできるようにしましょう。

# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --reload

ブラウザからアクセスして画像のような画面が表示されたら正常です。
※2017年9月30日にApache 2.4.6 (CentOS)をyumリポジトリからインストールした状態の画面です。

アパッチテスト画面

アクセスが確認できたら自動起動を有効にしましょう。

# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

Apacheのバージョンを確認してみます。

# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 23 2017 15:47:21

OpenSSL インストール・設定

Webサーバー Apacheで安全に通信するためには、OpenSSLをインストールする必要があります。
CentOS では簡単に導入出来ますので yum でインストールして設定まで行いましょう。

OpenSSL インストール

yum で Apache のモジュールとしてインストールしましょう。
インストールが終わったら、バージョンを確認しましょう。

# yum -y install mod_ssl
# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017

Apache 再起動

インストールがすんだら Apache を再起動させます。
ブラウザで表示させようとすると、セキュリティ証明書に問題があると表示されますが、続行できるなら閲覧し、先ほどのテスト画面が表示できるかどうか確認しましょう。

# systemctl restart httpd.service

設定確認

CentOS の yumでインストールした Apache と OpenSSL の場合、インストール時点でセキュア通信の設定が有効なっているはずですが、もし有効にならない場合は次の点を確認しましょう。次の例は、Apache バージョン 2.4.6 OpenSSL バージョン 1.0.2k の例です。

Apache 設定ファイル httpd.conf にモジュールを読み込む行が記載されているか確認しましょう。
記載が無かったり、コメントアウトされていたら、書き込んでおきましょう。

# vi /etc/httpd/conf/httpd.conf
...
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
Include conf.modules.d/*.conf
...

SSLモジュールがディレクトリに存在するか確認しましょう。
存在しなければ、OpenSSL のインストールが正常終了していません。再インストールしましょう。

# ls /etc/httpd/modules/mod_ssl.so
/etc/httpd/modules/mod_ssl.so

SSLモジュール追加用ファイルがディレクトリに存在するか確認しましょう。
存在しなければ、OpenSSL のインストールが正常終了していません。
もし、/etc/httpd/modules/mod_ssl.so は存在するのであれば、設定ファイルを作成することでセキュア通信を有効に出来ます。

# ls -la /etc/httpd/conf.d/ssl.conf
rw-r--r--. 1 root root 9436 10月 1 16:14 /etc/httpd/conf.d/ssl.conf

暗号化通信するための秘密鍵・公開鍵ファイルを設定しましょう。ファイルの作成方法については セキュリティ証明 OpenSSL に記載しています。

# vi /etc/httpd/conf.d/ssl.conf
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName www.example.com:443
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
#公開鍵ファイル設定
SSLCertificateFile /etc/pki/tls/certs/newcert.pem
#秘密鍵ファイル設定
SSLCertificateKeyFile /etc/pki/tls/private/newkey.pem
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

SSL設定ファイルがディレクトリに存在するか確認しましょう。
存在しなければ、OpenSSL のインストールが正常終了していません。
もし、/etc/httpd/modules/mod_ssl.so は存在するのであれば、設定ファイルを作成することでセキュア通信を有効に出来ます。

# ls -la /etc/httpd/conf.modules.d/00-ssl.conf
-rw-r--r--. 1 root root 41 8月 23 20:11 /etc/httpd/conf.modules.d/00-ssl.conf
# vi /etc/httpd/conf.modules.d/00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so

バーチャルホスト設定

1台のサーバー+1 Apache に複数のサイトを公開したいときは、バーチャルホストを設定します。
例では、公開IPアドレスも1つの場合でデフォルトの80番ポート(http)以外に8080番ポートを使用して作成しています。

設定ファイル編集

大本の設定ファイル:httpd.conf を編集して、8080番ポートにアクセスがあった場合、Apacheでページを表示できるように待機させます。

# vi /etc/httpd/conf/httpd.conf
...
#Listen 12.34.56.78:80
Listen 80
Listen 8080
...

バーチャルホスト設定

バーチャルホスト設定ファイルを作成します。
Apache 2.4のデフォルトではインストールした箇所に conf.d ディレクトリが有り、その中の.confファイルを読み込むようになっています。ファイル名は .conf の識別子があれば何でも構いません。
例では /var/www2/virtual ディレクトリにバーチャルホストの内容がある前提です。

# vi /etc/httpd/conf.d/virtual.conf
<VirtualHost *:8080>
ServerName life.com
DocumentRoot /var/www2/virtual
<Directory "/var/www2/virtual">
Require all granted
</Directory>
</VirtualHost>

ファイアウォールを開きます。

# firewall-cmd --zone=public --add-port=8081/tcp --permanent
# firewall-cmd --reload

困ったときは

ページが開けない場合、エラーログよく見ましょう。
標準インストールでは /etc/httpd/logs/error_log に出力されます。

ページが開けない:Permission denied

[Tue Oct 17 02:10:34.830974 2017] [core:error] [pid 17070] (13)Permission denied: [client ....:60058] AH00132: file permissions deny server access: ...
と出力されているときはhtmlのディレクトリパーミッションかSELinux を疑います。
SELinuxが有効にしていると、他のアプリケーションでもエラーとなる場合が多いため、無効にしてしまいます。

一時的に無効にするには

# setenforce 0
LoadModule ssl_module modules/mod_ssl.so

再起動後も SELinux を無効にします。

# vi /etc/sysconfig/selinux
...
SELINUX=disabled
...