先日、投稿した通り、アマゾン ウェブ サービス(AWS)のAmazon EC2で t4g.micro が3月末まで無料で使えるので、EBSをgp3ボリュームにしてインスタンスを立ち上げました。
t3.nano のRI36か月分がもったいない話はおいておきましょう。
早速、PHP8.1.0-devをビルドしてみました。
PHP8の目玉機能でもある、JITでどれくらいパフォーマンスが向上するか楽しみです!
インスタンスはT4g.microで、EBSはgp3ボリュームで8GiBをアタッチ、OSはAmazon Linux 2 AMI 64bit(Arm)で立ち上げました。
基本的にはec2-userで作業して、/usr/local 以下にインストールします。
※それぞれ2020/12/28時点のバージョンとなります
■必要そうなパッケージをインストール(PHP7.4以降、libgd がソースに同梱されなくなったので別途ビルドする必要があります)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
sudo yum install \ autoconf \ automake \ libtool \ flex \ bison \ libjpeg-turbo-devel \ libpng-devel \ libXpm-devel \ freetype-devel \ fontconfig-devel \ libicu-devel \ libxslt-devel \ libcurl-devel \ gmp-devel \ libzip-devel \ bzip2-devel \ libwebp \ libwebp-devel \ readline-devel \ net-snmp-devel \ oniguruma-devel \ libacl-devel \ sqlite-devel \ systemd-devel |
■libgdビルドに必要なライブラリをepelからインストール
1 |
sudo amazon-linux-extras install -y epel |
1 2 3 4 |
sudo yum install \ libtidy-devel \ libraqm-devel \ libimagequant-devel |
■re2cをビルド(パッケージだとうまくいかない)
1 2 3 4 5 6 7 |
git clone https://github.com/skvadrik/re2c cd re2c autoreconf -i -W all ./configure make sudo make install re2c -v |
■libgdをビルド(PHPに同梱されなくなった)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
git clone https://github.com/libgd/libgd cd libgd autoreconf -i automake autoconf ./configure \ --with-zlib \ --with-png \ --with-freetype \ --with-raqm \ --with-jpeg \ --with-liq \ --with-xpm \ --with-webp make sudo make install |
PHP8をビルドするために、PKG_CONFIG_PATHを追加しておく。
1 |
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/" |
■PHP8をビルド
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
git clone https://github.com/php/php-src cd php-src/ ./buildconf --force ./configure \ --prefix=/usr/local \ --with-gettext \ --with-gmp \ --with-openssl \ --with-pcre-jit \ --with-zlib \ --with-bz2 \ --enable-calendar \ --with-curl \ --enable-exif \ --with-readline \ --with-snmp \ --with-tidy \ --with-xsl \ --with-gnu-ld \ --with-zip \ --enable-cli \ --enable-exif \ --enable-intl \ --enable-pcntl \ --enable-soap \ --enable-mbstring \ --enable-fpm \ --enable-bcmath \ --enable-sockets \ --enable-mysqlnd \ --enable-gd \ --with-external-gd \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-mysql-sock=/var/lib/mysql/mysql.sock \ --with-fpm-acl \ --with-fpm-systemd \ --with-pear |
※悔しいことに、またメモリが足りなかったので、一時的にt4g.smallでmakeしました。
1 2 |
make sudo make install |
確認する。
1 2 3 4 5 |
php -v PHP 8.1.0-dev (cli) (built: Jan 5 2021 22:22:49) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.1.0-dev, Copyright (c) Zend Technologies with Zend OPcache v8.1.0-dev, Copyright (c), by Zend Technologies |
できたー。
■php.iniを作成
ソースに入っているテンプレをコピー。
1 |
sudo cp -p php-src/php.ini-production /usr/local/lib/php.ini |
主な変更点。
1 2 3 4 5 6 7 |
date.timezone = 'Asia/Tokyo' zend_extension=opcache opcache.enable=1 opcache.memory_consumption=64 mbstring.language = Japanese opcache.jit=1235 opcache.jit_buffer_size=32M |
■php-fpmの設定
テンプレを元に php-fpm.conf と www.conf を作成する。
まずは php-fpm.confを作成。こちらはデフォルトのまま使ってます。
1 2 |
cd /usr/local/etc/ sudo cp -p php-fpm.conf.default php-fpm.conf |
続いて www.confの作成。
1 2 |
cd /usr/local/etc/php-fpm.d/ sudo cp -p www.conf.default www.conf |
主な変更点。h2oと連携するので、h2oユーザーで起動、socket接続にします。
1 2 3 4 5 6 |
user = h2o group = h2o listen = /var/run/php-fpm/www.sock listen.acl_users = h2o pm = static pm.max_requests = 100 |
■OS起動時にsocket用のフォルダを自動作成する
1 |
sudo vi /usr/lib/tmpfiles.d/php-fpm.conf |
記述内容。
1 |
d /var/run/php-fpm 0755 root root - |
■php-fpmの起動設定
php-fpm を自動起動するよう設定します。
1 |
sudo vi /lib/systemd/system/php-fpm.service |
内容は以前と変わらず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# It's not recommended to modify this file in-place, because it # will be overwritten during upgrades. If you want to customize, # the best way is to use the "systemctl edit" command. [Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target [Service] Type=notify ExecStart=/usr/local/sbin/php-fpm --nodaemonize ExecReload=/bin/kill -USR2 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target |
動作確認と自動起動設定。
1 2 |
systemctl start php-fpm systemctl enable php-fpm |
startで起動確認できたら、enableしておく。
できたー。うれしー。
だが、悲しいことが判明。
どうやってもJITが有効にならない!どうしてもできない!
configureのメッセージを見落としていたんだけど、ARMは対応してないらしい・・・。
1 2 |
checking whether to enable JIT... yes configure: WARNING: JIT not supported by host architecture |
おーまいが。
JIT楽しみにしてたのにー!
せっかくリザーブドインスタンスも残っているので、t3.nanoでやるか・・・。せつない。
ちなみに今契約しているt3.nanoは前払いなし36か月、Standardで$0.002/時間なので、約151円/月。コンバートできない。
t4g.nanoを前払いなし36か月、StandardでもConvertibleでも$0.002/時間なので、約151円/月。
負け惜しみではないが、全然悔しくないからね。
2020/3/31までは、t4g.maicroが無料。悔しくないからね。
悔しくない。
※2021/7/9 追記:この金額計算が間違いだと気づきました。t4g.nano のほうが安いです。
※2022/12/9追記:ARM系プロセッサでも JIT が有効になりました。
今度やるなら、Compute Savings Plans にしてみるといいのかも。