CentOS7 Apache2.4インストールと設定

2017.6.5 (月)

インストール

リポジトリの調整しなくても2.4が入ってくれるっぽいです。

yum -y install httpd

これで完了。

httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 12 2017 21:03:28

なるほど。
Firewallやiptablesを無効にしていればこの時点で80がListenされます。
IPなどでアクセスするとApacheのWelcomeページが表示される筈です。

httpd.confの設定

以下を例に設定します。基本的には/var/www/htmlは使いません。すべてバーチャルホストで設定します。

Domain port
host1.example.com virtualhost 1 80
host2.example.com virtualhost 2 8080

httpd.confの設定

最初のオリジナルのhttpd.confはとっておきましょう。

cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
vi /etc/httpd/conf/httpd.conf

httpd.confは基本的にはそのままで殆ど大丈夫です。そのかわりconf.d/* conf.modules.d/*あたりで各種細かい設定をしてゆく感じになります。

バーチャルホストの設定

Apache2.4からはバーチャルホストの明示的な設定はしなくてよくなりました。予めインクルードされている/etc/httpd/conf.d/virtualhost.confにバーチャルホストの設定をしてゆけばよいようになっています。

adduser host1 ← バーチャルホストのユーザー作成
passwd host1 ← パスワード作成
chmod 755 /home/host1 ← パーミッション変更
su host1
cd ~
source .bash_profile
mkdir -m 755 /home/host1/www ← DocumentRoot作成
vi /home/host1/www/index.html

ここまででバーチャルホストのユーザーとかドキュメントルートとかの作成をして下準備をします。
httpd.confのいちばん最後あたりに、

IncludeOptional conf.d/*.conf

という設定があるので、そのインクルードファイルの

vi /etc/httpd/conf.d/virtualhost.conf

を設定します。
ErrorLog、CustomLogは保存先を変更する場合は予めディレクトリを作成しておきます。
またDocumentRootにはRequire all grantedをつけないと403になってしまうのでご注意。

# /etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:80>
   DocumentRoot /home/host1/www
   ServerName host1.example.com
   ErrorLog /home/host1/logs/host1.example.com-error_log
   CustomLog /home/host1/logs/host1.example.com-access_log combined
   <Directory /home/host1/www>
        Options All
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

こんな感じで設定。設定後は再起動。

systemctl restart httpd.service

とはいえvirtualhostが全然有効にならないときがあって、結構デバックに手間喰います。

# apachectl -t -D DUMP_VHOSTS
VirtualHost configuration:
*:80                   is a NameVirtualHost
         default server foo.example.com (/etc/httpd/conf.d/virtualhost.conf:2)
         port 80 namevhost foo.example.com (/etc/httpd/conf.d/virtualhost.conf:2)
         port 80 namevhost bar.example.com (/etc/httpd/conf.d/virtualhost.conf:15)

まずはこのコマンドできちんと読み込んでいるか確認します。これでちゃんと読み込んでいるとしたら、DNSの設定とかhostの設定の問題かもしれません。

post 8080の設定

開発環境などで80以外のポートを使うときは、listenに8080を加えてからバーチャルホストの設定で明示的に8080を指定してあげます。httpd.confの40行目あたりです。
DocumentRootやログの保管場所は予め作っておいてください。

# /etc/httpd/conf/httpd.conf
....
#Listen 12.34.56.78:80
Listen 80
Listen 8080 ← 追加
....

バーチャルホストの設定は

# /etc/httpd/conf.d/virtualhost.conf
<VirtualHost *:8080> ← 8080に変更
   DocumentRoot /home/host2/www
   ServerName host2.example.com
   ErrorLog /home/host2/logs/host2.example.com-error_log
   CustomLog /home/host2/logs/host2.example.com-access_log combined
   <Directory /home/host2/www>
        Options All
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

再起動すると、これでhost2.example.com:8080でアクセスできるようになります。

いろいろ書き方変わりました。
Apache2.4ではconfの書き方が変わりましたなので、いろいろ面倒くさい。

CentOS7のサービス自動起動について

Apacheに限ったことではないのでいったん総合的に書いておきます。
chkconfigはsystemdにかわりました。(私の環境ではchkconfigには2つのサービスを残して全部いなくなってました。)
引き続きchkconfigのコマンドは使えるようですが、全部systemdに転送されているみたいです。(というか転送されてます。)

自動起動を設定

systemctl enable httpd.service

自動起動を解除

systemctl disable httpd.service

設定を確認する

systemctl list-unit-files -t service
....
httpd.service                                 enabled
....

セキュリティー

どこに書いてもよいのですが、
/etc/httpd/conf.d/security.confとかを適当につくってあげるとか、virtual.confの頭に書いてあげるとかで設定します。
ネットワークの設定やアプリケーションの仕様によっては全部このままってわけにもイカない場合があるので注意してください。

# Security
# hide version
ServerTokens Prod
Header unset X-Powered-By
# httpoxy
RequestHeader unset Proxy
# Click jacking
Header append X-Frame-Options SAMEORIGIN
# XSS
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
# XST
TraceEnable Off

アクセスするとForbiddenになってしまう。

DocumentRootの1階層上のディレクトリも755にしないと駄目。

testuser01 [D:755]
└── public [D:755] *DocumentRoot
    ├── hoge.html [F:644]
    └── index.php [F:644]

という感じ。

Require all grantedが設定されていない。

バーチャルホストの設定で、

<VirtualHost *:80>
    DocumentRoot "/home/testuser01/public"
    ServerName testuser01.a-test01.gce
    ErrorLog "logs/testuser01.localhost-error.log"
    CustomLog "logs/testuser01.localhost-access.log" common
    <Directory "/home/testuser01/public">
      Options All
      AllowOverride All
      Require all granted ←こいつ
      AddType text/html .html
    </Directory>
</VirtualHost>

みたいな感じにしないと駄目。

SULinuxを無効にする

SULinuxをデフォルトのままにしておくと403になってしまう。

# getenforce
Enforcing

Enforcingが出たら駄目。

# vi /etc/selinux/config

SELINUX=enforcing
↓ 無効化する
SELINUX=disabled 

保存して閉じて筐体の再起動をしないと反映されません。