※当サイトの記事には、広告・プロモーションが含まれます。

Windows 10 HomeのDocker(Docker ToolBox)でApache2.4.25をソースからインストールしたけど動かない(インストールできてなかったようです)

CentOS7のdockerイメージの取得

dockerコンテナを作成するには、その元となるイメージであるdockerイメージが必要です。 dockerイメージはDocker Hubというところから取得可能です。

まずは、Docker Quickstart Terminalを起動します。

CentOSの最新版のイメージをDocker Hub の公開レポジトリから取ってきます。

docker pull centos:latest

f:id:ts0818:20170415163707j:plain 

イメージの確認。CentOSのイメージが取得できました。

docker images

f:id:ts0818:20170415162401j:plain

イメージを使って、dockerコンテナを作成し起動します。

docker run --plivileged --name docker_wordpress -p 8080:80 -d centos:latest sbin/init

f:id:ts0818:20170415162400j:plain

--prilivilegedオプションは、dockerコンテナ内のCentOS7でsystemctlコマンドを使えるようにしてくれます。-pオプションは『【ホストOSのポート】:【コンテナ内のOSのポート】』という形でポートをバインドすることで、ホストOS側のブラウザでコンテナ内にアクセスできます。この場合、ホスト側の8080からのアクセスがコンテナ側の80に届くことになります。

centos:latestの部分は、【REPOSITORY】:【TAG】とすることで使用するdockerイメージを指定していると思われます。

docker runのオプションの一例

オプション 内容
--name コンテナ名を定義(ホスト名ではない)
-p ポートフォワード。ホスト側とコンテナ側のポート番号を紐づける。
[ホストのポート番号]:[コンテナのポート番号]
-d コンテナをバックグラウンドで動かす
-h ホスト名を指定する
-i コンテナの標準入力を開く。
-t tty(端末デバイス)を確保する。
-v ホストとコンテナのディレクトリ共有。
[ホストのディレクトリ]:[コンテナのディレクトリ]

dockerコンテナ内に入ります。

docker exec -it docker_wordpress bash

f:id:ts0818:20170415164225j:plain

お馴染みのCentOS7にログインできました。バージョンを確認してみます。

cat /etc/centos-release

f:id:ts0818:20170415172749j:plain

Linuxの他のOSのバージョン確認は下記サイトへ

今更聞けない!LinuxのOSやバージョンの確認方法

 

CentOS7.3にアプリケーションの環境を構築

基本コマンドと開発ツールをインストールします。

yum -y groupinstall base
yum -y groupinstall development

zlib-devel

OpenSSLのコンパイルに zlib を使うので、インストールしておきます。WEBサーバでHTTP/2を使うには、OpenSSL1.0.2以上が必須のようです。ALPN(Application-Layer Protocol Negotiation)に対応しているのがOpenSSL1.0.2以上のため。

yum -y install zlib-devel

OpenSSL-1.1.0のインストール

wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz

zlib-develで圧縮を展開

tar xvzf openssl-1.1.0e.tar.gz

設定ファイルの場所まで移動

cd open-ssl.1.1.0e/

configコマンド

デフォルトでは、/usr/local/ssl にインストールされます。これを変更したい場合は、--openssldir で指定します。OpenSSL の実行ファイルを /usr/bin、ライブラリを /usr/lib の下などにインストールしたい場合は --prefix を指定します。--prefix を指定した場合でも、そのほかのファイルは、--openssldir にインストールされます。また、シェアードライブラリを作成したい場合は shared オプションを指定します。

OpenSSL のインストール

./config --prefix=/usr/local/openssl-1.1.0e shared zlib

./configオプションにno-*を付けている場合、make dependが必要。今回は必要なし。

make depend

コンパイル

make

OpenSSLのインストール開始

make install 

バージョン確認(フォルダはopenssl-1.1.0eなのにOpenSSL 1.0.1e-fipsって!?)

openssl version

f:id:ts0818:20170415192221j:plain

OpenSSLをインストールした際にshared library(共有ライブラリ)がインストールされますが(/usr/local/openssl/lib)、そのパスは、システムの検索対象になっていないため、環境変数LD_LIBRARY_PATHに登録するか、ldconfigでパスを指定する必要必要があるようです。

ldconfigはroot権限が必要なのでroot権限を持たない人は環境変数を使うしかないようです。

それ行けLinux~OpenSSL~

共有ライブラリをシステムに認識させるには、そのディレクトリを共有ライブラリ検索パスに追加する必要があります。/libディレクトリと/usr/libディレクトリはデフォルトで含まれていますが、FedoraCentOSでは/usr/local/libディレクトリが含まれていないため、手動で追加する必要があります。

共有ライブラリの追加 - tetsuyai’s blog

⇩  ldconfig、/etc/ld.so.conf、/etc/ld.so.cacheの関係については下記サイトへ

/etc/ld.so.cacheとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

lddコマンドで共有ライブラリの依存関係を表示

ldd /usr/local/openssl-1.1.0e/bin/openssl

f:id:ts0818:20170415205837j:plain

libssl.so.×. ×とlibcrypto.so.×.×の部分がnot foundとなってしまっている...これは共有ライブラリとしてパスが通っていないということらしいです。

LD_LIBRARY_PATHは、ライブラリのサーチパスを指定するもので、環境変数を設定してコマンドを実行するenvコマンドで実行するようです。

仕事で使える魔法のLAMP(17):OpenSSLをビルドしてApacheで利用する - @IT

env LD_LIBRARY_PATH=/usr/local/openssl-1.1.0e/lib ldd /usr/local/openssl-1.1.0e/bin/openssl

f:id:ts0818:20170415222922j:plain

ただ、下記コマンドでもパスを通すのが可能?なみたいです。openssl110e.confの部分がどこから来てるのかいまいちよく分かりませんが。

echo /usr/local/openssl-1.1.0e/lib > /etc/ld.so.conf.d/openssl110e.conf

⇩  下記サイトを参考にさせていただいています。 

Apache httpd 2.4.25 + mod_http2 インストールメモ | あぱーブログ

HTTP/2(mod_http2)のコアエンジン Nghttp2 をインストールします。

Nghttp2 をインストールするのに必要なライブラリのインストール

yum -y install libev-devel

ディレクトリの移動

cd /usr/local/src/

Nghttp2 のダウンロード

https://github.com/tatsuhiro-t/nghttp2/releases/latest

wget https://github.com/nghttp2/nghttp2/releases/download/v1.21.1/nghttp2-1.21.1.tar.gz

圧縮を展開します

tar xvzf nghttp2-1.21.1.tar.gz

ディレクトリの移動

cd nghttp2-1.21.1/

autoreconfは,指定されたディレクトリとそのサブディレクトリで,GNUビルドシステムを更新するために, autoconf,autoheader,aclocal, automake,libtoolize,そして(適切なときは) autopointを繰り返し実行します。デフォルトで,ソースファイルよ り古いファイルだけが再生成されます。 新しいバージョンのツールをインストールした場合,autoreconfに --forceオプションを与えることで,すべてのファイルを再生 成することが可能です。

Autoconf

autoreconf -i

 

automake

 

autoconf

 

env OPENSSL_CFLAGS="-I/usr/local/openssl-1.1.0e/include" OPENSSL_LIBS="-L/usr/local/openssl-1.1.0e/lib -lssl -lcrypto" ./configure

コンパイル

make

インストール

make install

パスを通す

echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig

Apache 2.4系を、ソースコードからインストールする場合は、ARPARP-util が必要になります。

APRApache Portable Runtime)、APR-util(Apache Portable Runtime Utility)のインストール

まずは、APRのインストール

ディレクトリ移動

cd /usr/local/src/

APRダウンロード

wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.5.2.tar.gz

展開

tar xvzf apr-1.5.2.tar.gz

ディレクトリ移動

cd apr-1.5.2/

 

./configureとは

C言語などのソースから実行ファイルを作成するには、Makefileに基づいたコンパイルが必要である。configureはMakefileを生成するためのスクリプトで、ソースアーカイブに用意されていることが多い。configureスクリプトを実行すると、ビルドに必要なコマンドがインストールされているか、といった環境のチェックを行い、Makefileを生成する。オプションはソースプログラムによって異なるので、使用可能なオプションは--helpオプションで確認する。

Linuxコマンド集 - 【configure】Makefileを生成する:ITpro

⇩  ./configureでエラーが出る場合は下記サイトを参考に『vi ./configure』で編集

Apache 2.4系をUbuntu 14.04にソースコードからインストールする手順 | hrendoh's memo

./configure

コンパイル

make

インストール

make install

続いて、APR-utilのインストール

ディレクトリ移動

cd /usr/local/src/

APR-utilダウンロード

wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.5.4.tar.gz

展開

tar xvzf apr-util-1.5.4.tar.gz

ディレクトリ移動

cd apr-util-1.5.4/

 

./configure --with-apr=/usr/local/apr

コンパイル

make

インストール

make install

いよいよ、Apache httpd のインストール

ディレクトリ移動

cd /usr/local/src/

Apacheダウンロード

wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.25.tar.gz

展開

tar xvzf httpd-2.4.25.tar.gz

ディレクトリ移動

cd httpd-2.4.25/

HTTP/2 を使うために必要なモジュール mod_http2 と mod_ssl を有効にしているようです。 with-ssl オプションで、自分のインストールしたopenssl-1.1.0eのディレクトリパスを指定。

./configure \
--enable-http2 \
--enable-ssl \
--with-ssl=/usr/local/openssl-1.1.0e \
--enable-so \
--enable-mods-shared=all \
--enable-mpms-shared=all

コンパイル

make

インストール

make install

これでApache が /usr/local/apache2/ 以下にインストールされたようです。

SSLサーバー証明書の作成(HTTPS用)

秘密鍵の作成

openssl genrsa 2048 > server.key

CSR(証明書署名要求)の作成(入力するのは2箇所だけで良いようです)

openssl req -new -key server.key > server.csr

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:<空エンター>
Locality Name (eg, city) [Default City]:<空エンター>
Organization Name (eg, company) [Default Company Ltd]:<空エンター>
Organizational Unit Name (eg, section) []:<空エンター>
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:<空エンター>
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<空エンター>
An optional company name []:<空エンター>

 

SSLサーバー証明書の作成(有効期限10年)

openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

 

秘密鍵SSL証明書を移動

mv -i server.key /etc/pki/tls/private/
mv -i server.crt /etc/pki/tls/certs/

パーミッションを変更

chmod 600 /etc/pki/tls/private/server.key
chmod 600 /etc/pki/tls/certs/server.crt

CSRを削除

rm server.csr

Apache httpd.conf の設定

・設定ファイルを作成します

vim /usr/local/apache2/conf/httpd.conf

自分はvimでの強制保存コマンド『:w !sudo tee % > /dev/null』が使えず、cd /usr/local/apache2/に移動し、mkdir confし、cd confし、touch httpd.confしてからvim httpd.confで編集しました。

httpd.conf

vim /usr/local/apache2/conf/extra/httpd-ssl.conf

httpd.conf

Apache httpd 2.4.25 + mod_http2 インストールメモ | あぱーブログ さんのソースコードを使わせていただいています。

 

systemd サービスファイルの作成

Apache httpd 用の systemd サービスファイル(起動スクリプトのようなもの)を作成。

vim /etc/systemd/system/httpd.service

書き込みます

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecReload=/usr/local/apache2/bin/apachectl graceful
ExecStop=/usr/local/apache2/bin/apachectl stop
 
[Install]
WantedBy=multi-user.target

作成したサービスファイルを systemd に反映させます。

systemctl daemon-reload

systemd に反映されているか確認します。

systemctl list-unit-files | grep httpd
httpd.service disabled ←この表示があればOKらしいです

起動。

systemctl start httpd

エラーが!

Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.

『journalctl -xe』コマンドで原因を表示してくれるみたいです。

Apr 16 08:50:01 70ca98c2126b CROND[2505]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Apr 16 08:52:41 70ca98c2126b polkitd[2148]: Registered Authentication Agent for unix-process:2508:2980390 (system bus name :1.150 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, Apr 16 08:52:41 70ca98c2126b systemd[1]: Starting The Apache HTTP Server...
-- Subject: Unit httpd.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has begun starting up.
Apr 16 08:52:41 70ca98c2126b systemd[2514]: Failed at step EXEC spawning /usr/local/apache2/bin/apachectl: No such file or directory
-- Subject: Process /usr/local/apache2/bin/apachectl could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /usr/local/apache2/bin/apachectl could not be executed and failed.
--
-- The error number returned by this process is 2.
Apr 16 08:52:41 70ca98c2126b systemd[1]: httpd.service: control process exited, code=exited status=203
Apr 16 08:52:41 70ca98c2126b systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit httpd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has failed.
--
-- The result is failed.
Apr 16 08:52:41 70ca98c2126b systemd[1]: Unit httpd.service entered failed state.
Apr 16 08:52:41 70ca98c2126b systemd[1]: httpd.service failed.
Apr 16 08:52:41 70ca98c2126b polkitd[2148]: Unregistered Authentication Agent for unix-process:2508:2980390 (system bus name :1.150, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) (disconnected from bus)
~

わ、分からん!とりあえず、次の工程へ。

firewalld設定

firewalldが入っていなかったのでインストール

firewalld 停止時にサービスを追加する - ARCHIVESDRIVE HB

 yum install firewalld

 

firewalldを起動(停止するときはsystemctl stop firewalldでOK)

systemctl start firewalld

HTTP(80/tcp) と HTTPS(443/tcp) を開けておきます。

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload

ポートが空いたか確認

firewall-cmd --list-all

portsの部分を確認

public (default, active)
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports: 443/tcp 80/tcp ←この表示があればOK
(略)

ログのローテーション設定

・設定ファイルを作成します

vim /etc/logrotate.d/httpd

書き込みます

/usr/local/apache2/logs/*log { 
    daily 
    missingok 
    dateext 
    rotate 60 
    create 644 daemon daemon
    sharedscripts 
    postrotate 
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript 
}

下記のような表示になればOKのようです。

reading config file /etc/logrotate.d/httpd
 
Handling 1 logs
 
rotating pattern: /usr/local/apache2/logs/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
(略)

⇩ 下記サイトを参考にさせていただいています。

Apache httpd 2.4.25 + mod_http2 インストールメモ | あぱーブログ

結局、自分の環境では systemctl start httpd.service は動かずじまいでした。共有ライブラリのパスの設定とかの問題かしら?getenforceコマンドでSELinuxの状態を確認したところDisabledで無効化されてるようですし、一応apache2のモジュールを確認。

f:id:ts0818:20170416200543j:plain

mod_access_compat.so  mod_authz_dbm.so        mod_dumpio.so        mod_macro.so           mod_proxy_hcheck.so    mod_session.so
mod_allowmethods.so   mod_authz_groupfile.so  mod_echo.so          mod_mime_magic.so      mod_proxy_http.so      mod_setenvif.so
mod_auth_basic.so     mod_authz_host.so       mod_env.so           mod_mime.so            mod_proxy_scgi.so      mod_slotmem_plain.so
mod_auth_digest.so    mod_authz_owner.so      mod_expires.so       mod_mpm_event.so       mod_proxy.so           mod_slotmem_shm.so
mod_auth_form.so      mod_authz_user.so       mod_ext_filter.so    mod_mpm_prefork.so     mod_proxy_wstunnel.so  mod_socache_dbm.so
mod_authn_anon.so     mod_buffer.so           mod_file_cache.so    mod_mpm_worker.so      mod_ratelimit.so       mod_socache_memcache.so mod_authn_core.so     mod_cache_disk.so       mod_filter.so        mod_proxy_ajp.so       mod_reflector.so       mod_socache_shmcb.so
mod_authn_dbd.so      mod_cache.so            mod_headers.so       mod_proxy_balancer.so  mod_remoteip.so        mod_substitute.so
mod_authn_dbm.so      mod_cache_socache.so    mod_include.so       mod_proxy_connect.so   mod_reqtimeout.so      mod_unique_id.so
mod_authn_file.so     mod_charset_lite.so     mod_log_config.so    mod_proxy_express.so   mod_request.so         mod_usertrack.so
mod_authn_socache.so  mod_data.so             mod_log_debug.so     mod_proxy_fcgi.so      mod_sed.so             mod_version.so
mod_authz_core.so     mod_dbd.so              mod_log_forensic.so  mod_proxy_fdpass.so    mod_session_cookie.so  mod_watchdog.so
mod_authz_dbd.so      mod_deflate.so          mod_logio.so         mod_proxy_ftp.so       mod_session_dbd.so

なんか、mod_http2.so と mod_ssl.soとかが見当たらない...、httpd.confでは読み込まれてるはずなんですが、インストールしないといけないのかしら?

LoadModule http2_module modules/mod_http2.so
LoadModule ssl_module modules/mod_ssl.so    

ってなってたし。

下記コマンドでモジュールの一覧が見えるようです。ここに mod_so.c が無いともう駄目らしい。

apache2 にモジュールを追加する - Enjoi Blog

/usr/local/apache2/bin/httpd -l

結果

bash: /usr/local/apache2/bin/httpd: No such file or directory

そういえば、systemctl start httpdしたときに、『/usr/local/apache2/bin/apachectl could not be executed and failed.』って怒られたけど、そもそもbinフォルダ丸々ないみたい....駄目だコリャ。

 

ちなみに、nginxもHTTP/2に対応してるみたいです。

 

2017年5月7日 追記

やはり、Apache2.4.25がインストールできてなかったようです。

Apache2.4.25でmakeしたときに、

undefined reference to `SSLv2_client_method'

undefined reference to `CRYPTO_malloc_init'

というエラーが出ていたのですが、調べてみたところ、OpenSSL1.1.0で『mallocラップ関数名の変更』があったため、『undefined reference to `CRYPTO_malloc_init'』のエラーが起こっていたようです。

OpenSSL1.1.0への対応について - Apache 2.4系でHTTP/2対応サーバを構築してみるテスト。

また、『undefined reference to `SSLv2_client_method'』に関しては、『OpenSSLの1.0.2では、SSLv2関連の関数が完全に削除されてしまった』ようで、OpenSSL1.1.0でも同様ではないかと思われます。

また、Red HatRed Hat系のLinuxディストリビューション を作っている会社)によるとSSLの使用を止めてTLSを使ってくれ、ということみたいです

httpd における POODLE SSLv3.0 脆弱性問題の解決方法 (CVE-2014-3566)

SSL を無効にし、TLSv1.1 または TLSv1.2 だけを使用することを Red Hat は推奨します。後方互換性は、TLSv1.0 を使用すると実行できます。Red Hat がサポートする多くの製品には SSLv2 または SSLv3 プロトコルを使用する機能があります。これらのプロトコルはデフォルトで有効になっています。ただし、SSLv2 または SSLv3 は使用しないことが現在強く推奨されています。

httpd における POODLE SSLv3.0 脆弱性問題の解決方法 (CVE-2014-3566) - Red Hat Customer Portal

じゃあ、SSLTLSって何が違うのかというと、大枠の仕組みはほとんど変わらないようですが、互換性はないようです。

TLSについては下記サイトが詳しいです。

理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話 · けんごのお屋敷

SSL(Secure Sockets Layer)とTLS(Transport Layer Security)とは

インターネット上でデータを暗号化して送受信できるトランスポート層プロトコルのことです。

SSLプロトコルは、バージョンアップを重ねた後、SSL3.0を元にしたTLS(Transport Layer Security)1.0がRFC (*)として定められました。

SSL3.0とTLS1.0は大枠の仕組みは同じですが、SSLという名称が既に普及しているため、RFCにおける最新バージョンはTLS1.2であっても一般には「SSL」や「SSL/TLS」と表記することが多くなっています。

OpenSSLは、SSL/TLSを利用した暗号化通信を実装するソフトウェアです。

SSLとTLSの違いと脆弱性 | シマンテック

PHP - php-5.3.3のビルドでエラーが出てしまう(32141)|teratail

httpd における POODLE SSLv3.0 脆弱性問題の解決方法 (CVE-2014-3566) - Red Hat Customer Portal

2017年5月7日現在、Apach HTTPDサーバをOpenSSL1.1.0に対応させてソースコードからインストールするのは難しそうです。

今回はこのへんで。