【PHP 7.4以上版】ElastiCache Cluster Clientのインストールや設定、読み込み失敗時の原因調査までまとめてみた
この記事でやりたいこと
AWS ElastiCache for Memcachedを利用するためにはキャッシュ書き込み(EC2など)側で必要な設定がいくつかあります。その中のCluster Clientをインストールして設定する手順が特に最新(PHP7.4以上)版でややこしく、公式ドキュメント通りに進めても上手くいかなかったので、失敗時の原因調査や最終的に必要な設定についてまとめてみます。また完全版の手順をAnsibleのPlaybookでコード化を試みたので、そちらも紹介させて頂きます。
この記事の前提条件(環境、ソフト、バージョンなど)
- PHP 8.0 ※AWS公式ドキュメントによれば7.4以上が同様の設定手順となる模様
- Amazon Linux 2 のAMIで起動したEC2
- AWS ElastiCache for Memcachedを最大限活用したい
- WordPress 6.2 でDBキャッシュがしたい
- W3 Total Cache(WordPressのプラグイン)を利用 ※AWS公式ハンズオンも同様
※ 検証はしていませんが、WordPress以外でも同様にできると思います。
ダイジェスト版まとめ-何が起きて何を調べてどう対処したか
- 起きたこと:筆者の場合、公式手順のとおりに進めたところ、WordPressプラグインのW3 Total CacheやPHP InfoでMemcachedが表示されず(読み込まれず?)、失敗しました。まさに公式ハンズオンの「トラブルシューティング」に記載の事象が発生。。
- 何を調べたか:
公式ハンズオンでは「クライアントのインストールのための手順をもう一度確認」としか記載されておらず、情報の波にもまれたり、路頭に迷ったりしたのち、コマンドでphp -m
と実行すると、わかりやすいエラーメッセージが確認できることを発見(「記事化しようと決意」) - どう対処したか:メッセージに従い、以下の通りコマンドを実行したところ、正常に動作しました。
私の場合、公式ドキュメントのインストール手順を最後まで実施したのち、php -m
を実行すると、一番上に下記メッセージが表示されました。
PHP Warning: PHP Startup: Unable to load dynamic library 'amazon-elasticache-cluster-client.so' (tried: /usr/lib64/php/modules/amazon-elasticache-cluster-client.so (libcrypto.so.1.1: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/amazon-elasticache-cluster-client.so.so (/usr/lib64/php/modules/amazon-elasticache-cluster-client.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
要点としては、
- amazon-elasticache-cluster-client.soがロードできない
- libcrypto.so.1.1が開けなくて、そんなものは存在しない(と怒られている)
ということがわかります。
libcrypto.so.1.1
というのをみて、公式手順の最後で
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
というのを実行したのを思い出して、以下を調べました。
lrwxrwxrwx 1 root root 30 Jul 2 16:13 libssl.so.1.1 -> /usr/local/lib64/libssl.so.1.1
lrwxrwxrwx 1 root root 16 Jul 2 16:07 libssl.so.10 -> libssl.so.1.0.2k
lrwxrwxrwx 1 root root 19 Jul 2 16:07 libcrypto.so.10 -> libcrypto.so.1.0.2k
これからわかるのは、libssl.so.1.1
はシンボリックリンクができているが、libcrypto.so.1.1
のシンボリックはない(明らかに旧バージョンとわかるlibcrypto.so.10
にはシンボリックがある)。ということはlibcrypto.so.1.1
の新しいバージョンのシンボリックをlibssl.so.1.1
と同様に作成すればよいのでは、と考えました。
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
というわけで、めでたく動作確認まで到達しました。
完全版まとめ-インストール手順(Ansibleでやってみた)
結局のところ、筆者の場合、公式の手順にたったの1つ追加でコマンド実行するだけでした。にもかかわらず完全版として、この記事でわざわざ全て記載しなおすのもどうか(ほぼ公式ドキュメント丸パクることに?)と思い、Ansibleでインストール手順をコード化した例を紹介させてもらいます!
---
- name: check module memchached with elasticache-cluser-client.so
shell: |
/bin/bash -lc "php -m | grep memcached"
check_mode: no
failed_when: false
register: memcached_as_module
- debug:
var: memcached_as_module.stdout
- name: configure elasticache-cluser-client.so
block:
- name: download elasticache-cluser-client
get_url:
url: https://elasticache-downloads.s3.amazonaws.com/ClusterClient/PHP-8.0/latest-64bit-X86-openssl1.1
dest: /tmp
register: ecache_client_gz
- name: Unzip elasticache-cluser-client
unarchive:
# as of 230702, /tmp/AmazonElastiCacheClusterClient-PHP80-64bit-libmemcached-1.0.19-openssl1.1.tar.gz
src: "{{ ecache_client_gz.dest }}"
dest: /tmp
remote_src: yes
- name: copy amazon-elasticache-cluster-client.so to /modules
copy:
src: /tmp/amazon-elasticache-cluster-client.so
dest: /usr/lib64/php/modules/amazon-elasticache-cluster-client.so
owner: root
group: root
mode: 0755
- name: replace /etc/php.d/50-memcached.ini
template:
src: 50-memcached.ini
dest: /etc/php.d/50-memcached.ini
owner: root
group: root
mode: 0644
- name: check openssl1.1
shell: |
/bin/bash -lc "openssl version"
check_mode: no
failed_when: false
register: check_openssl11
- debug:
var: check_openssl11
- name: configure openssl1.1
block:
- name: install packages for openssl1.1
yum:
name: "{{ packages }}"
state: present
vars:
packages:
- make
- gcc
- pcre-devel
- wget
- zlib-devel
- name: download openssl1.1
get_url:
url: https://www.openssl.org/source/openssl-1.1.1c.tar.gz
dest: /tmp
register: openssl11
- name: Unzip openssl1.1
unarchive:
src: /tmp/openssl-1.1.1c.tar.gz
dest: /tmp
remote_src: yes
- name: install and setting openssl1.1
shell: |
/bin/bash -lc "cd /tmp/openssl-1.1.1c"
/bin/bash -lc "sudo ./config"
/bin/bash -lc "sudo make"
/bin/bash -lc "sudo make install"
check_mode: no
args:
chdir: /tmp/openssl-1.1.1c
when: "'OpenSSL 1.1.1c' not in check_openssl11.stdout"
- name: ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
file:
src: /usr/local/lib64/libssl.so.1.1
dest: /usr/lib64/libssl.so.1.1
state: link
- name: ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
file:
src: /usr/local/lib64/libcrypto.so.1.1
dest: /usr/lib64/libcrypto.so.1.1
state: link
become: yes
when: not memcached_as_module.stdout == "memcached"
- name: reload httpd service for memcached
systemd:
name: httpd
state: restarted
daemon_reload: yes
become: yes
extension=amazon-elasticache-cluster-client.so
参考ドキュメント
・AWS公式ドキュメント:PHP クラスタークライアントのインストール手順が記載
・AWS公式ハンズオン:「Memcached 用 Amazon ElastiCache を使用して WordPress を高速化する」
Discussion
記事にしていただき本当にありがとうございます!
この情報はあまり多くなく、みなさん悩んでいないのか不思議でした。
昨日立ち上げた AmazonLinux2 に OpenSSL1.1 を
yum install openssl11 openssl11-libs
でインストールしてみましたがこの方法でも問題ありませんでした。
※ 公式がソースからインストールしているのが気になっていたので...
この方法の場合は、必要なシンボリックリンクが2つともありました!