CentOS7にApache2.4.38+OpenSSL1.1.1a+PHP7.3.1をソースからインストール
先日Apache2.4.37をソースからインストールしてみて、そこそこ安定稼働するようになってきましたが、最近Apacheのバージョンが上がったようなので早速入れてみました。どうやらApache2.4.37のバグ修正(DoS脆弱性の修正)のようです。PHPも7.3.0→7.3.1に上がっていたので一緒にあげてみます。念の為httpd、httpd2は残したまま、「httpd3」という新しいサービスを立ち上げることにします。
1. OpenSSL 1.1.1a を /usr/local/ssl にインストール
これは前回と同じなので再インストールすることなくそのまま使いました。
$ sudo -i # yum -y groupinstall base # yum -y groupinstall development # yum -y update # yum -y install zlib-devel # yum -y install perl-core # cd /usr/local/src/ # wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz # tar xvfz openssl-1.1.1a.tar.gz # cd openssl-1.1.1a # ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib # make depend # make # make test # make install # ln -s /usr/local/ssl/lib/libcrypto.so.1.1 /lib64/libcrypto.so.1.1 # ln -s /usr/local/ssl/lib/libssl.so.1.1 /lib64/libssl.so.1.1 # /usr/local/ssl/bin/openssl version # echo /usr/local/ssl/lib > /etc/ld.so.conf.d/openssl111a.conf # ldconfig # /usr/local/ssl/bin/openssl ciphers -v TLSv1.3
2. Ngttp2とBrotliを /usr/local/lib にインストール
前回はHTTP/2対応用にNgttp2はyumから入れましたが、今回はソースインストールにトライ。また、高速化できるという噂のBrotliも追加で入れてみます。
2.1. Ngttp2(libnghttp2)
OpenSSL 1.1.1aは /usr/local/ssl 配下にインストールしてあるので、envで指定します。
# yum -y install jansson-devel # yum -y install libev-devel # yum -y install c-ares-devel # yum -y install centos-release-scl # yum -y install devtoolset-7 # scl enable devtoolset-7 bash # cd /usr/local/src/ # wget https://github.com/nghttp2/nghttp2/releases/download/v1.36.0/nghttp2-1.36.0.tar.gz # tar xvzf nghttp2-1.36.0.tar.gz # cd nghttp2-1.36.0/ # env OPENSSL_CFLAGS="-I/usr/local/ssl/include" OPENSSL_LIBS="-L/usr/local/ssl/lib -lssl -lcrypto" ./configure -enable-app # make # make install
2.2. Brotli
# yum -y install cmake # cd /usr/local/src/ # wget https://github.com/google/brotli/archive/v1.0.7.tar.gz # tar xvzf v1.0.7.tar.gz # cd brotli-1.0.7/ # mkdir out && cd out # ../configure-cmake # make # make test # make install # echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf # ldconfig
3. Apache 2.4.38 を /usr/local/httpd3 にインストール
前回はaprとapr-utilはyumから入れたものを使いましたが、mpm_eventが無いのがこのせいかも??と思い、これもソースから入れてみます。
3.1. APR
# cd /usr/local/src/ # wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.6.5.tar.gz # tar xvzf apr-1.6.5.tar.gz # cd apr-1.6.5/ # ./configure # make # make install
3.2. APR-util
# cd /usr/local/src/ # wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.1.tar.gz # tar xvzf apr-util-1.6.1.tar.gz # cd apr-util-1.6.1/ # ./configure --with-apr=/usr/local/apr # make # make install
3.3. Apache 2.4.38
—prefix=/usr/local/httpd3 とすることで「httpd3」のフォルダにインストールします。
# cd /usr/local/src/ # wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.38.tar.gz # tar xvzf httpd-2.4.38.tar.gz # cd httpd-2.4.38/ # ./configure \ --prefix=/usr/local/httpd3 \ --enable-http2 \ --enable-brotli \ --with-brotli=/usr/local/lib \ --enable-ssl \ --with-ssl=/usr/local/ssl \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr \ --enable-so \ --enable-mods-shared=all \ --enable-mpms-shared=all # make # make install
インストールされたらApacheの設定。httpd.confの該当箇所を有効化、追記・修正します。
※実際にはhttpd2のconfファイルをそのままコピーして、サーバールート他を/usr/local/httpd2→/usr/local/httpd3に、Brotli追加、mpm_worker→mpm_eventに書き換えました。今回は、aprをソースから入れたからか??(真因不明)mpm_eventがありました!
# cd /usr/local/httpd3/conf
# vi httpd.conf
-----------------------------------------
# for Brotli
LoadModule brotli_module modules/mod_brotli.so
# for HTTP/2 MPM event(★今回はmpm_eventがあったぞ!★)
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# for HTTPS
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
# for HTTP/2
LoadModule http2_module modules/mod_http2.so
# for VirtualHost
LoadModule vhost_alias_module modules/mod_vhost_alias.so
# for Rewrite
LoadModule rewrite_module modules/mod_rewrite.so
# for php-fpm
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_module modules/mod_proxy.so
# for gZip
LoadModule deflate_module modules/mod_deflate.so
# for cash expire
LoadModule expires_module modules/mod_expires.so
.
.
User apache
Group apache
.
.
# for cash expire
<IfModule mod_expires.c>
<filesMatch ".(jpg|jpeg|png|gif|swf|js|css)$">
ExpiresActive On
ExpiresDefault "access plus 30 days"
</filesMatch>
</IfModule>
.
.
<IfModule dir_module>
# index.php追加(WordPressに必要)
#DirectoryIndex index.html
DirectoryIndex index.html index.php
</IfModule>
.
.
# php追加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
.
.
Include conf/extra/httpd-mpm.conf
.
.
# Virtual hosts(http用、https用は分けて設定します)
#Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-vhosts-http.conf
Include conf/extra/httpd-vhosts-https.conf
.
.
Include conf/extra/httpd-ssl.conf
-----------------------------------------
:wqmpm_eventの設定
# cd extra
# vi httpd-mpm.conf
-----------------------------------------
.
.
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 2
MaxSpareThreads 4
ThreadsPerChild 2
MaxRequestWorkers 4
MaxConnectionsPerChild 150
</IfModule>
.
.
-----------------------------------------
:wq
HTTPSの設定。httpd-ssl.confを以下のように追記・修正します。せっかくなのでより安全なTLS 1.2、TLS 1.3だけに対応します。
# vi httpd-ssl.conf
-----------------------------------------
.
.
# 常時SSL
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff
.
.
# 明示的にSSL圧縮をOFF
SSLCompression off
.
.
SSLCipherSuite "TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES256-SHA \
DHE-RSA-AES256-SHA256"
SSLProxyCipherSuite "TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES256-SHA \
DHE-RSA-AES256-SHA256"
.
.
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv3 -TLSv1 -TLSv1.1
.
.
# for OCSP
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)
.
.
#ServerName www.example.com:443
#ServerAdmin you@example.com
.
.
SSLEngine on
#Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ji0vwl.net/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ji0vwl.net/chain.pem
.
.
#SSLCertificateFile "/usr/local/httpd2/conf/server.crt"
.
.
#SSLCertificateKeyFile "/usr/local/httpd2/conf/server.key"
-----------------------------------------
:wqHTTPバーチャルホストの設定
# vi httpd-vhosts-http.conf
-----------------------------------------
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName test.ji0vwl.net
<Directory "/var/www/html/">
Options FollowSymlinks Includes
AllowOverride All
AddType text/html .html
Require all granted
</Directory>
# HTTPSにリライトする場合はコメントアウト解除
#RewriteEngine on
#RewriteCond %{SERVER_NAME} =test.ji0vwl.net
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
-----------------------------------------
:wqHTTPSバーチャルホストの設定
# vi httpd-vhosts-https.conf
-----------------------------------------
<IfModule mod_ssl.c>
<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName test.ji0vwl.net
# HTTP/2有効化(h2追加)
Protocols h2 http/1.1
<Directory "/var/www/html/">
Options FollowSymlinks Includes
AllowOverride All
AddType text/html .html
Require all granted
</Directory>
# SSL証明書
SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ji0vwl.net/privkey.pem
#SSLCertificateFile /etc/letsencrypt/live/ji0vwl.net/cert.pem
#SSLCertificateChainFile /etc/letsencrypt/live/ji0vwl.net/chain.pem
# for gZip圧縮
<IfModule mod_deflate.c>
DeflateCompressionLevel 1
<IfModule mod_filter.c>
FilterDeclare COMPRESS
FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^text/#i"
FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^application/(atom\+xml|javascript|json|rss\+xml|xml|xhtml\+xml)#i"
FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} =~ m#^image/(svg\+xml|vnd\.microsoft\.icon)#i"
FilterChain COMPRESS
FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
</IfModule>
</Ifmodule>
# for dosdetector
DoSDetection on
DoSPeriod 60
DoSThreshold 250
DoSBanPeriod 60
DoSTableSize 100
RewriteEngine On
RewriteCond %{ENV:SuspectDoS} =1
RewriteRule .* - [R=503,L]
ErrorDocument 503 "<h1>Sorry, ji0vwl.net is busy.. Please access later.</h1>"
</VirtualHost>
</IfModule>
-----------------------------------------
:wq
4. Apache 2.4.38 を httpd3.service に登録
「systemctl start httpd3」で起動できるように、httpd3 という名前のサービスとして登録します。reload=graceful動作です。
# vi /etc/systemd/system/httpd3.service ----------------------------------------- [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/local/httpd3/bin/apachectl start ExecReload=/usr/local/httpd3/bin/apachectl graceful ExecStop=/usr/local/httpd3/bin/apachectl stop [Install] WantedBy=multi-user.target ----------------------------------------- :wq
# systemctl daemon-reload # systemctl list-unit-files | grep httpd3
5. PHP 7.3.1 を /usr/local/php7.3.1 にインストールする
–with-apxs2=[dir]でPHPとApacheを、–with-openssl=[dir]でPHPとOpenSSLを、–with-mysql-sock=[dir]でPHPとmySQLを結びつけます。
# cd /usr/local/src # yum -y install libxml2-devel systemd-devel libpng-devel # wget http://jp2.php.net/get/php-7.3.1.tar.gz/from/this/mirror -O /usr/local/src/php-7.3.1.tar.gz # tar -xvzf php-7.3.1.tar.gz # cd php-7.3.1 # ./configure \ --prefix=/usr/local/php7.3.1 \ --with-apxs2=/usr/local/httpd3/bin/apxs \ --with-openssl=/usr/local/ssl \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-mysqli \ --with-pdo-mysql \ --enable-mbstring \ --with-gd \ --with-zlib \ --with-fpm-systemd \ --with-fpm-user=apache \ --with-fpm-group=apache \ --enable-fpm # make # make install # libtool --finish /usr/local/src/php-7.3.1/libs
6. httpd2を停止し、今入れたhttpd3を起動
# systemctl stop httpd2 # systemctl disable httpd2 # systemctl start httpd3 # systemctl enable httpd3
7. cronを更新して完成!
最後に、定時再起動やLet’s EncryptのSSL証明書更新後のreloadをhttpd3に変更するのを忘れずに!
# vi /etc/cron.d/dailyjobs ------------------------------- . . # run-parts 30 * * * * root /bin/systemctl reload httpd3 00 2 1 * * root /bin/certbot renew --force-renew --rsa-key-size 4096 --post-hook "systemctl reload httpd3" 00 3 * * * root free -m && /bin/systemctl restart httpd3 && swapoff -a && swapon -a && free -m 02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily 22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly 42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly . . ------------------------------- :wq
# systemctl restart crond
httpd3を起動してSSL LabsでHTTPSの検証を行ったところ。無事、Apache 2.4.38/OpenSSL 1.1.1a/PHP 7.3.1の環境にて、TLS 1.3の対応が確認できました!


