読者です 読者をやめる 読者になる 読者になる

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 が必要になります。

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

ディレクトリ移動

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

コンパイル

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に対応してるみたいです。

広告を非表示にする