CentOS7のdockerイメージの取得
dockerコンテナを作成するには、その元となるイメージであるdockerイメージが必要です。 dockerイメージはDocker Hubというところから取得可能です。
まずは、Docker Quickstart Terminalを起動します。
CentOSの最新版のイメージをDocker Hub の公開レポジトリから取ってきます。
docker pull centos:latest
イメージの確認。CentOSのイメージが取得できました。
docker images
イメージを使って、dockerコンテナを作成し起動します。
docker run --plivileged --name docker_wordpress -p 8080:80 -d centos:latest sbin/init
--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
お馴染みのCentOS7にログインできました。バージョンを確認してみます。
cat /etc/centos-release
⇩ 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 オプションを指定します。
./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
OpenSSLをインストールした際にshared library(共有ライブラリ)がインストールされますが(/usr/local/openssl/lib)、そのパスは、システムの検索対象になっていないため、環境変数LD_LIBRARY_PATHに登録するか、ldconfigでパスを指定する必要必要があるようです。
ldconfigはroot権限が必要なのでroot権限を持たない人は環境変数を使うしかないようです。
共有ライブラリをシステムに認識させるには、そのディレクトリを共有ライブラリ検索パスに追加する必要があります。/libディレクトリと/usr/libディレクトリはデフォルトで含まれていますが、FedoraやCentOSでは/usr/local/libディレクトリが含まれていないため、手動で追加する必要があります。
⇩ ldconfig、/etc/ld.so.conf、/etc/ld.so.cacheの関係については下記サイトへ
・/etc/ld.so.cacheとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
lddコマンドで共有ライブラリの依存関係を表示
ldd /usr/local/openssl-1.1.0e/bin/openssl
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
ただ、下記コマンドでもパスを通すのが可能?なみたいです。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オプションを与えることで,すべてのファイルを再生 成することが可能です。
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系を、ソースコードからインストールする場合は、ARP と ARP-util が必要になります。
APR(Apache 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オプションで確認する。
⇩ ./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
ディレクトリ移動
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
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
・設定ファイルを作成します
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で編集しました。
vim /usr/local/apache2/conf/extra/httpd-ssl.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のモジュールを確認。
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 Hat(Red 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
じゃあ、SSLとTLSって何が違うのかというと、大枠の仕組みはほとんど変わらないようですが、互換性はないようです。
⇩ 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」と表記することが多くなっています。
・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に対応させてソースコードからインストールするのは難しそうです。
今回はこのへんで。