備忘録

CentOS7に最新のApache2.4をインストール

CentOS7のデフォルトでは2.4.6とバージョンが古いので、IUSリポジトリを使ってApache2.4.39をインストールした時のメモ

HTTP/2ではなくHTTP/1.1を利用する前提で記載します。

CentOS7の公式yumリポジトリで提供されているバージョン

# yum info httpd

利用可能なパッケージ
名前                : httpd
アーキテクチャー    : x86_64
バージョン          : 2.4.6
リリース            : 89.el7.centos
容量                : 2.7 M
リポジトリー        : updates/7/x86_64
要約                : Apache HTTP Server
URL                 : http://httpd.apache.org/
ライセンス          : ASL 2.0
説明                : The Apache HTTP Server is a powerful, efficient, and extensible
                    : web server.

Apacheがすでにインストールされていたら削除

Apacheインストール確認

# yum list installed | grep httpd

Apacheの停止

# systemctl stop httpd.service

Apacheの削除

# yum remove httpd

IUSリポジトリの追加

最新のApache(httpd)をインストールするのにIUSリポジトリを使います。

# yum install https://centos7.iuscommunity.org/ius-release.rpm

IUSリポジトリの無効化

IUSリポジトリは、インストールすると有効化の状態になっています。必要な時だけIUSリポジトリを使いたいので無効化にします。

/etc/yum.repos.d/ius.repo

enabled=1
↓
enabled=0

IUSリポジトリを無効化にしたので、使用する時は「--enablerepo=ius」といったように明示的に実行します。

mime.typesのインストール

最新のApacheをインストールするには、事前にmime.typesをインストールする必要があります。mime.typesはmailcapパッケージに含まれてます。

# yum install mailcap

最新のApache2.4をインストール

# yum --disablerepo=base,extras,updates --enablerepo=ius install httpd httpd-devel

インストールが完了したらバージョンを確認

# httpd -v

Server version: Apache/2.4.39 (IUS)

Apacheを起動

# systemctl start httpd.service

Apacheの自動起動の設定

# systemctl enable httpd.service

iptablesの設定

(※本サイトの「CentOS7を安全に運用する為の初期設定(iptablesの設定)」を参照ください)

http(80/443)ポートを許可

/etc/sysconfig/iptables

変更前にバックアップ

# cp -p /etc/sysconfig/iptables /etc/sysconfig/iptables_`date "+%Y%m%d%H%M%S"`
# http
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

「http://サーバのIPアドレス」にアクセスして、「It works!」が表示されるか確認します。

Apacheの設定

/etc/httpd/conf/httpd.conf

変更前にバックアップ

# cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_`date "+%Y%m%d%H%M%S"`
Header unset X-Powered-By
Header append X-Frame-Options SAMEORIGIN
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff

### headerの受信が10秒以内、bodyの受信が30秒以内に完了しない場合、「408」エラーとする ###
RequestReadTimeout header=10 body=30

Timeout 30

### KeepAliveで接続を保持する件数を30、タイムアウトまでの時間は10秒に設定 ###
KeepAlive On
MaxKeepAliveRequests 30
KeepAliveTimeout 10

### サーバのバージョン情報等を隠す ###
ServerTokens ProductOnly
ServerSignature Off

### 逆引きは無効化 ###
HostnameLookups Off

### XST対策 ###
TraceEnable Off

ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf

User apache
Group apache
#ServerAdmin root@localhost
#ServerName www.example.com:80
AddDefaultCharset UTF-8
EnableSendfile on
IncludeOptional conf.d/*.conf

<Directory />
    AllowOverride none
    Options None
    Require all denied
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
    #LogFormat "[%{%Y-%m-%d %H:%M:%S}t] %a:%p %u %D %m %H %>s %U%q \"%{Referer}i\" \"%{User-Agent}i\"" combined_space
    LogFormat "[%{%Y-%m-%d %H:%M:%S}t]\t%a:%p\t%u\t%D\t%m\t%H\t%>s\t%U%q\t\"%{Referer}i\"\t\"%{User-Agent}i\"" combined_tab
    SetEnvIf Request_URI "\.(gif|jpeg|jpg|png|css|js|ico|swf)$" nolog
    SetEnvIf User-Agent "internal dummy connection" nolog
</IfModule>

<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>

### MIME 追加 ###
AddType image/vnd.microsoft.icon .ico

### コンテンツ圧縮 ###
<IfModule mod_deflate.c>
    DeflateCompressionLevel 1
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    BrowserMatch "\bMSIE [1-6]\." no-gzip

    SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png|zip|gz|ico|swf|mp.|wav)$" no-gzip dont-vary
    Header append Vary User-Agent env=!dont-vary

    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/json
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/xhtml
    AddOutputFilterByType DEFLATE text/xhtml+xml
    AddOutputFilterByType DEFLATE text/atom+xml

    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/json
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/xhtml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/atom+xml
    AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>

### キャッシュ有効期限 ###
<ifModule mod_expires.c>
    FileETag None
    ExpiresActive On
    ExpiresByType text/css "access plus 1 days"
    ExpiresByType text/javascript "access plus 1 days"
    ExpiresByType application/javascript "access plus 1 days"
    ExpiresByType application/x-javascript "access plus 1 days"
    ExpiresByType image/gif "access plus 3 days"
    ExpiresByType image/jpeg "access plus 3 days"
    ExpiresByType image/png "access plus 3 days"
    ExpiresByType image/vnd.microsoft.icon "access plus 3 days"
</ifModule>

/etc/httpd/conf.d配下の設定ファイル

以下の3ファイルは使用しないので削除。ファイル自体を削除するとアップデート時に再作成されるので、空ファイルにする。

/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf

変更前にバックアップ

# cp -p /etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/autoindex.conf_`date "+%Y%m%d%H%M%S"`
# cp -p /etc/httpd/conf.d/userdir.conf /etc/httpd/conf.d/userdir.conf_`date "+%Y%m%d%H%M%S"`
# cp -p /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf_`date "+%Y%m%d%H%M%S"`

ファイルの中身を空にする

# cp /dev/null /etc/httpd/conf.d/autoindex.conf
cp: `/etc/httpd/conf.d/autoindex.conf' を上書きしますか? [y][Enter]

# cp /dev/null /etc/httpd/conf.d/userdir.conf
cp: `/etc/httpd/conf.d/userdir.conf' を上書きしますか? [y][Enter]

# cp /dev/null /etc/httpd/conf.d/welcome.conf
cp: `/etc/httpd/conf.d/welcome.conf' を上書きしますか? [y][Enter]

/etc/httpd/conf.modules.d配下の設定ファイル

基本モジュール

/etc/httpd/conf.modules.d/00-base.conf

変更前にバックアップ

# cp -p /etc/httpd/conf.modules.d/00-base.conf /etc/httpd/conf.modules.d/00-base.conf_`date "+%Y%m%d%H%M%S"`

必要なモジュールのみ設定

LoadModule alias_module modules/mod_alias.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
LoadModule filter_module modules/mod_filter.so
LoadModule headers_module modules/mod_headers.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule mime_module modules/mod_mime.so
LoadModule remoteip_module modules/mod_remoteip.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule substitute_module modules/mod_substitute.so
LoadModule unixd_module modules/mod_unixd.so

MPMモジュール

/etc/httpd/conf.modules.d/00-mpm.conf

変更前にバックアップ

# cp -p /etc/httpd/conf.modules.d/00-mpm.conf /etc/httpd/conf.modules.d/00-mpm.conf_`date "+%Y%m%d%H%M%S"`
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
StartServers              5
MinSpareServers           5
MaxSpareServers           20
ServerLimit               256
MaxRequestWorkers         256
MaxConnectionsPerChild    1000

systemdモジュール

/etc/httpd/conf.modules.d/00-systemd.conf(そのまま使用)

以下の5ファイルは使用しないので削除。ファイル自体を削除するとアップデート時に再作成されるので、空ファイルにする

/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-optional.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/01-cgi.conf

# cp -p /etc/httpd/conf.modules.d/00-dav.conf /etc/httpd/conf.modules.d/00-dav.conf_`date "+%Y%m%d%H%M%S"`
# cp -p /etc/httpd/conf.modules.d/00-lua.conf /etc/httpd/conf.modules.d/00-lua.conf_`date "+%Y%m%d%H%M%S"`
# cp -p /etc/httpd/conf.modules.d/00-optional.conf /etc/httpd/conf.modules.d/00-optional.conf_`date "+%Y%m%d%H%M%S"`
# cp -p /etc/httpd/conf.modules.d/00-proxy.conf /etc/httpd/conf.modules.d/00-proxy.conf_`date "+%Y%m%d%H%M%S"`
# cp -p /etc/httpd/conf.modules.d/01-cgi.conf /etc/httpd/conf.modules.d/01-cgi.conf_`date "+%Y%m%d%H%M%S"`

ファイルの中身を空にする

# cp /dev/null /etc/httpd/conf.modules.d/00-dav.conf
cp: `/etc/httpd/conf.modules.d/00-dav.conf' を上書きしますか? [y][Enter]

# cp /dev/null /etc/httpd/conf.modules.d/00-lua.conf
cp: `/etc/httpd/conf.modules.d/00-lua.conf' を上書きしますか? [y][Enter]

# cp /dev/null /etc/httpd/conf.modules.d/00-optional.conf
cp: `/etc/httpd/conf.modules.d/00-optional.conf' を上書きしますか? [y][Enter]

# cp /dev/null /etc/httpd/conf.modules.d/00-proxy.conf
cp: `/etc/httpd/conf.modules.d/00-proxy.conf' を上書きしますか? [y][Enter]

# cp /dev/null /etc/httpd/conf.modules.d/01-cgi.conf
cp: `/etc/httpd/conf.modules.d/01-cgi.conf' を上書きしますか? [y][Enter]

VirtualHostの設定

ディレクトリを作成

# mkdir -p /var/www/ip/html/

/etc/httpd/conf.d/11-ip.conf を作成

<VirtualHost XXX.XXX.XXX.XXX:80>
    ServerName XXX.XXX.XXX.XXX
    DocumentRoot /var/www/ip/html

    <Directory /var/www/ip>
        AllowOverride none
        Options None
        Require all denied
    </Directory>

    <Directory /var/www/ip/html>
        Require method GET POST
        Options FollowSymLinks
        RewriteEngine On
    </Directory>

    CustomLog logs/ip_access_log combined_tab env=!nolog
    ErrorLog logs/ip_error_log
</VirtualHost>

※「XXX.XXX.XXX.XXX」はサーバのIPアドレスを設定します。

シンタックスチェック

# service httpd configtest

Syntax OK

※シンタックスエラーがないことを確認

設定ファイルの再読み込み

# systemctl reload httpd.service

DocumentRootにindex.htmlを作成

/var/www/ip/html/index.html を作成

<html>
  <body>
    Hello World!
  </body>
</html>

「http://サーバのIPアドレス」にアクセスして、「Hello World!」が表示されればOKです。

Apacheの主なコマンド

状態確認
# systemctl status httpd.service

起動
# systemctl start httpd.service

停止
# systemctl stop httpd.service

再起動
# systemctl restart httpd.service

設定ファイルの再読み込み
# systemctl reload httpd.service

自動起動設定状態の確認
# systemctl is-enabled httpd.service

自動起動設定
# systemctl enable httpd.service

自動起動解除
# systemctl disable httpd.service

シンタックスチェック
# service httpd configtest