tag:crieit.net,2005:https://crieit.net/tags/AlmaLinux/feed 「AlmaLinux」の記事 - Crieit Crieitでタグ「AlmaLinux」に投稿された最近の記事 2022-02-25T22:46:15+09:00 https://crieit.net/tags/AlmaLinux/feed tag:crieit.net,2005:PublicArticle/18125 2022-02-25T22:46:15+09:00 2022-02-25T22:46:15+09:00 https://crieit.net/posts/change-timzezone-in-docker-for-wordpress-post-failed-20220224 Docker 上の Almalinux のタイムゾーン設定について <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>AlmaLinux ベースの自作LAMP環境構築用 Docker で WordPress を動かしたところ、投稿が「予約投稿の失敗」となってしまい正常に投稿できない現象に遭遇したため対処。</p> <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p><a href="https://crieit.now.sh/upload_images/49f0d2b150a7b5d422313af680baf9ae62124ffe1e1d2.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/49f0d2b150a7b5d422313af680baf9ae62124ffe1e1d2.jpg?mw=700" alt="今までの設定で発生していた現象" /></a></p> <p>今までの Docker Compose 環境で発生していた現象が上述の画像。普通に投稿したにも関わらず、「予約投稿の失敗」となってしまいます。</p> <p>困ったことに WordPress の管理画面で見ると日時はずれていない (WordPress インストール時のサンプル投稿「Hello World!」の投稿日時とほぼ同じ) ので、ぱっと見原因が掴みづらいところ。</p> <p>ちなみに、 <code>wp_posts</code> のテーブルを直接見たところ、 <code>post_date</code>, <code>post_date_gmt</code>, <code>post_modified</code>, <code>post_modified_gmt</code> が全て同じ日時になっていました。</p> <p>……あれ、 <code>_gmt</code> 系はグリニッジ標準時刻なので日本の時刻とは9時間ずれるはずでは……。ということで、どうもこの辺りが宜しくなさそうです。</p> <p>なお、この時の Dockerfile 等の各種設定は次のようになっていました。</p> <h3 id="Dockerfile (共通)"><a href="#Dockerfile+%28%E5%85%B1%E9%80%9A%29">Dockerfile (共通)</a></h3> <pre><code class="dockerfile">RUN \cp -pf /usr/share/zoneinfo/Japan /etc/localtime </code></pre> <h3 id="php.ini"><a href="#php.ini">php.ini</a></h3> <pre><code class="ini">[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone ;date.timezone = date.timezone = 'Asia/Tokyo' </code></pre> <h3 id="my.cnf 等"><a href="#my.cnf+%E7%AD%89">my.cnf 等</a></h3> <p>MySQL 側では特に指定なし。</p> <h2 id="変更"><a href="#%E5%A4%89%E6%9B%B4">変更</a></h2> <p>これらの設定を次のようにしました。</p> <h3 id="Dockerfile (共通)"><a href="#Dockerfile+%28%E5%85%B1%E9%80%9A%29">Dockerfile (共通)</a></h3> <pre><code class="dockerfile">RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux \ && dnf -y update && dnf -y install \ # 略 # timezone glibc-locale-source \ # locale, timezone && localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 \ && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime # local & timezone ENV LANG="ja_JP UTF-8" \ LANGUAGE="ja_JP:ja" \ LC_ALL="ja_JP.UTF-8" \ TZ="Asia/Tokyo" </code></pre> <p>やり方を大幅に変更。強制コピーで localtime ファイルを上書きするのではなく、段取りを踏んで設定するようにしました。</p> <h3 id="php.ini"><a href="#php.ini">php.ini</a></h3> <pre><code class="ini">[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone ;date.timezone = date.timezone = 'Asia/Tokyo' </code></pre> <p>変わらず。</p> <h3 id="my.cnf 等"><a href="#my.cnf+%E7%AD%89">my.cnf 等</a></h3> <p>こちらも変わらず。</p> <h3 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h3> <p><a href="https://crieit.now.sh/upload_images/d64288e5b382b9fe2564274e8237a20c6212500befe90.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d64288e5b382b9fe2564274e8237a20c6212500befe90.jpg?mw=700" alt="新しい設定方法で投稿した場合の挙動" /></a></p> <p>新しい方法で設定した Docker 環境上に先程と同様 WordPress をインストールして記事を投稿すると、無事投稿が公開されました。</p> <p>このとき、 <code>wp_posts</code> のテーブルを直接見ると、 <code>post_date</code>, <code>post_modified</code> は同じ日時、 <code>post_date_gmt</code>, <code>post_modified_gmt</code> は -9時間の日時になっていました。</p> <p>やはりここがおかしかったようです。</p> <h2 id="続・検証"><a href="#%E7%B6%9A%E3%83%BB%E6%A4%9C%E8%A8%BC">続・検証</a></h2> <p>さて、それではこの時刻の狂いはどこに起因しているのでしょうか。</p> <p><a href="https://crieit.now.sh/upload_images/67aea8dcc499e2cd3be8f9a4698e5de1621250140823c.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/67aea8dcc499e2cd3be8f9a4698e5de1621250140823c.jpg?mw=700" alt="Webサーバのみ新しい設定方法で投稿した場合の挙動" /></a></p> <p>Webサーバの Dockerコンテナ のみ今回の新しい方法で localtime を設定した場合。OKですね。</p> <p><a href="https://crieit.now.sh/upload_images/35de93c1057c97f109f3c8e152c7ec526212501e5c450.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/35de93c1057c97f109f3c8e152c7ec526212501e5c450.jpg?mw=700" alt="DBサーバのみ新しい設定方法で投稿した場合の挙動" /></a></p> <p>DBサーバの Dockerコンテナ のみ今回の新しい方法で localtime を設定した場合。NGです。</p> <p>ということで、原因は Webサーバ 側にありそうです。</p> <h3 id="Webサーバでの date"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7%E3%81%AE+date">Webサーバでの date</a></h3> <p>ただ、 Webサーバ のコンテナで <code>date</code> コマンドを打っても日時は正しい日時が返ってくるのですよね。</p> <h4 id="設定方法が未変更の状態の Webサーバ コンテナ"><a href="#%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E3%81%8C%E6%9C%AA%E5%A4%89%E6%9B%B4%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%AE+Web%E3%82%B5%E3%83%BC%E3%83%90+%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A">設定方法が未変更の状態の Webサーバ コンテナ</a></h4> <pre><code class="bash"># php -r 'echo date_default_timezone_get() . PHP_EOL; echo date(&quot;y-m-d H:i:s&quot;) . PHP_EOL;' Asia/Tokyo 22-02-13 19:06:21 # date Thu Feb 13 19:06:28 JST 2022 </code></pre> <h4 id="設定方法を変更した状態の Webサーバ コンテナ"><a href="#%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E7%8A%B6%E6%85%8B%E3%81%AE+Web%E3%82%B5%E3%83%BC%E3%83%90+%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A">設定方法を変更した状態の Webサーバ コンテナ</a></h4> <pre><code class="bash"># php -r 'echo date_default_timezone_get() . PHP_EOL; echo date(&quot;y-m-d H:i:s&quot;) . PHP_EOL;' Asia/Tokyo 22-02-13 19:16:50 # date 2022年 2月 13日 日曜日 19:16:56 JST </code></pre> <p>ご覧の通り時刻は正常……ってあれ、確かに日時は正常ですが、出力フォーマットが異なっています。</p> <p>どうやら今までの設定変更ではやはり不完全な部分があるようです。どこが、というところまでは追い切れていないですが、ここまでの検証で確かに今までの設定方法では宜しくないであろう、ということが断片的に表われているので、ここは大人しく新しい設定方法に変更していった方が良さそうです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/rururu_kenken/items/972314402d588e073d40">Dockerコンテナのタイムゾーン変更方法 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/jeffi7/items/9d4c85cf049644f711b8">Docker で \/etc\/localtime をホストに volume マウントしてハマった話 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://saito-shion-technology.hatenablog.jp/entry/2020/02/27/115040">Docker : コンテナのタイムゾーンを変更する - saito-shion technology diary</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/polarbear08/items/e5c00869c7566db5f7b8">CentOS7・CentOS8のDockerコンテナの日本語化および日本時間設定 - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/18122 2022-02-23T00:13:45+09:00 2022-02-23T00:13:45+09:00 https://crieit.net/posts/output-timezone-datetime-of-php-and-mysql-20220223 PHP と MySQL のタイムゾーンや時刻の確認メモ <p>PHP や MySQL でタイムゾーンや時刻を確認したくなったのでメモ。</p> <h2 id="PHP"><a href="#PHP">PHP</a></h2> <pre><code class="bash"># php -r 'echo date_default_timezone_get() . PHP_EOL; echo date(&quot;y-m-d H:i:s&quot;) . PHP_EOL;' Asia/Tokyo 22-02-13 19:16:50 </code></pre> <p>コマンドライン実行でサクッと確認。</p> <h2 id="MySQL"><a href="#MySQL">MySQL</a></h2> <pre><code class="bash">mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | JST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec) mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2022-02-13 19:46:19 | +---------------------+ 1 row in set (0.00 sec) </code></pre> <p>こちらはSQL文で確認。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="PHP"><a href="#PHP">PHP</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.softel.co.jp/blogs/tech/archives/2077">【php】ちょっとしたphpをコマンドラインからさくっと実行する at softelメモ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.date.php">PHP: date - Manual</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.date-default-timezone-get.php">PHP: date_default_timezone_get - Manual</a></li> </ul> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://mysql.javarou.com/dat/000848.html">現在の日付・時刻を取得する - MySQL 逆引きリファレンス</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tailak/items/63dce2dd7dfe049b038e">MySQLでタイムゾーンを設定する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.html">MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.6 MySQL Server でのタイムゾーンのサポート</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/18121 2022-02-23T00:12:52+09:00 2022-02-23T00:12:52+09:00 https://crieit.net/posts/error-at-install-mysql-community-server-import-rpm-pgp-key-20220223 Docker で MySQL の community版をインストールしようとした際に Failing package is: ... エラー <p>Docker の MySQL コンテナを構築する Dockerfile を走らせようとしたところ、</p> <blockquote> <p>The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package.</p> </blockquote> <p>や</p> <blockquote> <p>Public key for mysql-community-client-8.0.28-1.el8.x86_64.rpm is not installed. Failing package is: mysql-community-client-8.0.28-1.el8.x86_64</p> </blockquote> <p>というエラーが発生してしまったので対処。</p> <h3 id="改修前の Dockerfile"><a href="#%E6%94%B9%E4%BF%AE%E5%89%8D%E3%81%AE+Dockerfile">改修前の Dockerfile</a></h3> <pre><code class="dockerfile">RUN dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el8-2.noarch.rpm </code></pre> <p>コミュニティ版の MySQL8 をインストールしようとしています。</p> <h3 id="改修後の Dockerfile"><a href="#%E6%94%B9%E4%BF%AE%E5%BE%8C%E3%81%AE+Dockerfile">改修後の Dockerfile</a></h3> <pre><code class="dockerfile">RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 && dnf -y localinstall https://dev.mysql.com/get/mysql80-community-release-el8-2.noarch.rpm </code></pre> <p>エラー文で検索したところ、</p> <pre><code class="bash">rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 </code></pre> <p>を追加すると良い、という記事を見かけたので追加したところ、エラーが発生しなくなったのでこれで対処。</p> <h3 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://support.cpanel.net/hc/en-us/articles/4419382481815-MySQL-GPG-keys-expired-preventing-installation-upgrade-of-MySQL-packages-from-the-official-repository-">MySQL GPG keys expired, preventing installation\/upgrade of MySQL packages from the official repository. – cPanel</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://support.cpanel.net/hc/en-us/articles/4419382481815-Installer-fails-due-to-The-GPG-keys-listed-for-the-MySQL-repository-are-already-installed-but-they-are-not-correct-for-this-package-">MySQL GPG keys expired, preventing installation\/upgrade of MySQL packages from the official repository. – cPanel</a></li> </ul> <p>URLは異なりますがどちらも同じ内容の模様。</p> arm-band tag:crieit.net,2005:PublicArticle/17932 2022-01-12T00:06:20+09:00 2022-01-12T00:06:20+09:00 https://crieit.net/posts/centos-onelinear-ternary-and-compoare-operator-20220112 CentOS の bash で比較演算と三項演算子的な処理を使って変数に代入する値を分岐するワンライナー <p><a href="https://crieit.net/posts/diverting-date-as-args-in-dockerfile-20211230">Dockerfile 内でコンテナの時刻を変数として流用し、年に対応した rpmパッケージ の GPG署名 をインストールする</a>で試験した内容の続きとなります。</p> <ul> <li><code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021</code>: OK</li> <li><code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi2022</code>: Not Found.</li> </ul> <p>remiリポジトリのGPG署名が2022年版が存在しないので、条件分岐で2021を最大値とするように処理を書いてみました。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <pre><code class="bash"># date 2022年 1月 11日 火曜日 20:42:53 JST </code></pre> <p>今回の検証環境はこのような表示がされる CentOS の日本語版の環境。</p> <pre><code class="bash"># NOWYEAR=$(sudo date | sudo awk 'END{print $1}' | sudo sed -e 's/年//g') && [ ${NOWYEAR} -gt 2021 ] && ALTERYEAR=2021 || ALTERYEAR=${NOWYEAR} && echo ${ALTERYEAR} 2021 </code></pre> <p>早速完成したワンライナーですが、このようになりました。</p> <h2 id="説明"><a href="#%E8%AA%AC%E6%98%8E">説明</a></h2> <p>わりと複雑になってしまったので順番に読んでいきます。</p> <pre><code class="bash">NOWYEAR=$(sudo date | sudo awk 'END{print $1}' | sudo sed -e 's/年//g') \ # date コマンドの結果から、 awk でスペース区切り1つ目の値(2022年) を抽出し、 `sed -e` で`年`を落とす。結果、`2022`が得られる && [ ${NOWYEAR} -gt 2021 ] && ALTERYEAR=2021 || ALTERYEAR=${NOWYEAR} \ # 三項演算子的な処理。 {コマンドとして実行可能な式} && {前述式が true の場合の処理} || {前述式が false の場合の処理} 。今回は得られた現在の年が2021年以降ならば2021を変数に代入、そうでなければ現在の年を変数代入 && echo ${ALTERYEAR} # 上の三項演算子的な処理で代入された変数の値を echo </code></pre> <p>こんな感じです。</p> <pre><code class="dockerfile">RUN MELUSINE=$(sudo date | sudo awk 'END{print $6}') \ && [ ${NOWYEAR} -gt 2021 ] && ALTERYEAR=2021 || ALTERYEAR=${NOWYEAR} \ && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm \ && rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi${ALTERYEAR} </code></pre> <p>今回はこんな感じで <code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021</code> か、 <code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi{2020以下}</code> かを読み込む分岐に。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.pmi-sfbac.org/arithmetic-comparison/">【Shellスクリプト】演算子「算術演算子」「比較演算子」について! | Beエンジニア</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://eng-entrance.com/linux-shellscript-replacement">【Linux】シェルスクリプトによる文字列処理:置換や削除をする方法</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17929 2022-01-09T23:55:22+09:00 2022-01-09T23:55:22+09:00 https://crieit.net/posts/centos-cp-interactive-evenif-force-20220109 cp コマンドで強制上書きする際に気を付けること <p>CentOS 系で cp コマンドで強制上書きをする際のメモです。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>タイムゾーンを変更するために次のようなコマンドを実行しました。</p> <pre><code class="bash"># cp -pf /usr/share/zoneinfo/Japan /etc/localtime cp: overwrite `/etc/localtime'? </code></pre> <p>すると、 <code>-f</code> オプションで強制上書きするはずなのに上書きするかを聞かれてしまいました。</p> <h2 id="原因"><a href="#%E5%8E%9F%E5%9B%A0">原因</a></h2> <p>これは <code>cp</code> コマンドが <code>cp -i</code> のエイリアスとなっているため。</p> <p>つまり、デフォルトでインタラクティブ(対話式)になっているようです。そのため、仮に <code>-f</code> を付けても <code>-i</code> の方が優先され、上書きするか確認してくる、というわけです。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <p><code>cp</code> コマンドの頭に <code>\</code> を付けるとエイリアスが無効になるため、 <code>-i</code> が外れます。</p> <pre><code class="bash"># \cp -pf /usr/share/zoneinfo/Japan /etc/localtime </code></pre> <p>しばらく気付きませんでした……。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/owlbeck/items/6752a6f1b3fb58d0cb17">CentOSのcpコマンドで強制的にファイルを上書きする - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://dotnsf.blog.jp/archives/2918928.html">Linux の cp コマンドで強制上書き : まだプログラマーですが何か?</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://blog.livedoor.jp/harukisan7/archives/27306085.html">cp コマンドで強制上書きする時に気をつけること。 : リア充キラキラ系のnoteです。@kuromitsu_ka</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17901 2021-12-30T01:05:47+09:00 2021-12-30T01:07:46+09:00 https://crieit.net/posts/diverting-date-as-args-in-dockerfile-20211230 Dockerfile 内でコンテナの時刻を変数として流用し、年に対応した rpmパッケージ の GPG署名 をインストールする <p>Dockerコンテナ をビルドする際にコンテナ内の時刻(年)を他のコマンドに流用したくなりました。その方法をいくつか試したのでメモしておきます。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>AlmaLinux で PHP7.4系 をインストールする際に Remiリポジトリ からインストールしようとしました。</p> <pre><code class="dockerfile">RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm && \ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # disable default module RUN dnf module reset -y php # install php 7.4 RUN dnf module install -y php:remi-7.4 </code></pre> <p><code>rpm</code> を使用して Remiリポジトリ をインストールしています。</p> <p><code>rpm</code> ではパッケージインストールではパッケージが破損していないか、改ざんされていないかをチェックするために GPG署名 を用いています。</p> <p>その公開鍵の取得も、 Remiリポジトリ のインストールと同時に行っています。</p> <pre><code class="dockerfile">RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm && \ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 </code></pre> <p>ここでふと思ったのは、URLに年が入っていること。2022年になったら</p> <pre><code class="dockerfile">RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm && \ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2022 </code></pre> <p>に変えたい。かといってそれを毎年手動で更新するのは面倒なので、自動化したい。</p> <p>であれば、 <code>date</code> コマンドの値を <code>awk</code> に通すなどして年だけ取り出し、それを上述コマンドに流用できないか、と。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <p>まずは AlmaLinux のコンテナをビルド・起動します。</p> <pre><code class="bash">docker run --name yeartest -it almalinux:8 /bin/bash </code></pre> <pre><code class="bash"># \cp -pf /usr/share/zoneinfo/Japan /etc/localtime ## タイムゾーン変更 # dnf -y update && yum -y install sudo epel-release ## 略 </code></pre> <p>パッケージを入れたり前準備。</p> <h3 id="date から年のみ取り出す"><a href="#date+%E3%81%8B%E3%82%89%E5%B9%B4%E3%81%AE%E3%81%BF%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99">date から年のみ取り出す</a></h3> <pre><code class="bash"># date Wed Dec 29 22:28:18 JST 2021 </code></pre> <p>普通に <code>date</code> を叩きます。ふむ、6番目ですね……。</p> <pre><code class="bash"># sudo date | sudo awk '{print $6}' 2021 </code></pre> <p>そこでパイプで繋いで <code>awk</code> に渡します。無事、年のみを取り出せました。</p> <h3 id="rpm の GPG署名 について"><a href="#rpm+%E3%81%AE+GPG%E7%BD%B2%E5%90%8D+%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">rpm の GPG署名 について</a></h3> <p>一応インポートされている GPG署名 について確認しておきます。</p> <pre><code class="bash"># rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e </code></pre> <p>まずデフォルトの状態。1つのみインポートされていますね。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 </code></pre> <p>次に <code>RPM-GPG-KEY-remi2021</code> をインポートします。増えました。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 gpg-pubkey-00f97f56-467e318a </code></pre> <p>さらに <code>RPM-GPG-KEY-remi</code> をインポートすると増えました。</p> <h2 id="検証2"><a href="#%E6%A4%9C%E8%A8%BC2">検証2</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/test-docker-tychedight">Tychedight</a></li> </ul> <p>以上を踏まえて、 Docker Compose からの Dockerfile ビルドで試験。</p> <pre><code class="dockerfile">FROM almalinux:8 RUN \cp -pf /usr/share/zoneinfo/Japan /etc/localtime RUN dnf -y update && yum -y install \ sudo \ epel-release RUN mkdir /home/temp/ # パターン1 RUN GEOFFROY=$(sudo date | sudo awk 'END{print $6}') \ && sudo echo ${GEOFFROY} >> /home/temp/geoffroy.txt # パターン2 RUN FROMONT=$(sudo date | sudo awk 'END{print $6}') RUN sudo echo ${FROMONT} >> /home/temp/fromont.txt # パターン3 RUN sudo echo \ | sudo date \ | sudo awk 'END{print $6}' \ >> /home/temp/carillon.txt </code></pre> <p>一応3つパターンを試してみます。さあ、それぞれのファイルには何が出力されるのか……。</p> <pre><code class="dockerfile"># パターン1 RUN GEOFFROY=$(sudo date | sudo awk 'END{print $6}') \ && sudo echo ${GEOFFROY} >> /home/temp/geoffroy.txt # 2021 # パターン2 RUN FROMONT=$(sudo date | sudo awk 'END{print $6}') RUN sudo echo ${FROMONT} >> /home/temp/fromont.txt # # パターン3 RUN sudo echo \ | sudo date \ | sudo awk 'END{print $6}' \ >> /home/temp/carillon.txt # 2021 </code></pre> <p>結果、意図した出力になったのは1つ目と3つ目のパターンでした。 <code>RUN</code> ごとにコンテナが変わるとのことなので2は望み薄だと思っていましたが……。</p> <p>そこで、パターン1を使って次のように組んでみます。</p> <pre><code class="dockerfile">FROM almalinux:8 RUN \cp -pf /usr/share/zoneinfo/Japan /etc/localtime RUN dnf -y update && yum -y install \ sudo \ epel-release RUN mkdir /home/temp/ # args RUN MELUSINE=$(sudo date | sudo awk 'END{print $6}') \ && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm \ && rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi${MELUSINE} </code></pre> <p>これでビルド・起動したコンテナに bash で入って確認。</p> <pre><code class="bash"># rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 </code></pre> <p>内容的にデフォルトと2021の公開鍵が入っているように見えます。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 gpg-pubkey-00f97f56-467e318a </code></pre> <p>手動で <code>RPM-GPG-KEY-remi</code> を入れると増えました。</p> <pre><code class="bash"># rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # rpm -qa 'gpg-pubkey*' gpg-pubkey-3abb34f8-5ffd890e gpg-pubkey-478f8947-5ff329c5 gpg-pubkey-00f97f56-467e318a </code></pre> <p>ついでに手動で <code>RPM-GPG-KEY-remi2021</code> を入れようとしましたが、数は増えませんでした。先のコードで <code>RPM-GPG-KEY-remi2021</code> がインストールできていることが確認できました。OKです。</p> <h2 id="余談"><a href="#%E4%BD%99%E8%AB%87">余談</a></h2> <p>実は上述の通り年指定のない <code>http://rpms.famillecollet.com/RPM-GPG-KEY-remi</code> があるので、それを入れてしまえば終わりのような気もするのですが……折角なのでチャレンジしてみた次第です。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="PHP インストール"><a href="#PHP+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">PHP インストール</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.tsuda1.com/%E6%9C%AA%E5%88%86%E9%A1%9E/php%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/">PHPインストール PHP7.4 CentOS8 | AlmaLinux 自宅サーバ</a></li> </ul> <p>もしかして、そもそもいらない……?</p> <h3 id="rpm と GPG署名"><a href="#rpm+%E3%81%A8+GPG%E7%BD%B2%E5%90%8D">rpm と GPG署名</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s1-check-rpm-sig">B.3. パッケージの署名確認 Red Hat Enterprise Linux 6 | Red Hat Customer Portal</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/aosho235/items/9ba95b6b8fb1ce8ac580">CentOS 7 インストールされている全パッケージのrpmをダウンロードする - Qiita</a> <ul> <li>インポートされた公開鍵の確認</li> </ul></li> <li>参考: <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.kakiro-web.com/linux/centos6-remi-install.html">CentOS6.7 64bitのyumリポジトリにRemiを追加 - Kakiro-Web カキローウェブ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://pentan.info/server/linux/yum/remi.html">Remi 基本リポジトリで提供されていないパッケージのyumインストール - [yum/Linux [Red Hat/CentOSなど]] ぺんたん info</a></li> </ul></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17898 2021-12-29T00:16:11+09:00 2021-12-29T00:17:49+09:00 https://crieit.net/posts/test-centos8-lamp-for-almalinux-in-docker-20211229 (Docker) Almalinux を見据えて CentOS8 での環境構築を試験してみる <p>手前味噌で恐縮ですが、自作の LAMP環境 を検証する Docker Compose について。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/docker_compose_ambergrease">GitHub - arm-band/docker_compose_ambergrease</a></li> </ul> <p>イメージを CentOS7 ベースで構築しているので、いずれは AlmaLinux なり Rocky Linux なりに移行しなければならないことは分かっていました。</p> <p>そこで、その以降を見据えて残り数日の命の CentOS8 で試験してみることにしました。なぜ AlmaLinux や Rocky Linux ではなくわざわざ CentOS8 かというと、いきなりそれらのOSに飛びついて何らかの不具合が発生したときに原因の切り分けで苦労するならば、まだ同じシリーズで差分が少ない (と想定される) CentOS8 で試験して、問題なければ次に進もう、という段階的な試験を想定したためです。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <pre><code class="bash">docker run --name php7_cent8 -it centos:centos8 /bin/bash </code></pre> <p>まずはイメージを取得し、 bash に入ります。</p> <h3 id="Apache + PHP"><a href="#Apache+%2B+PHP">Apache + PHP</a></h3> <p>最初は Apache + PHP 。こちらについては、以前 <a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2020/02/23/centos8-lamp-install-note/">CentOS8 をインストールして遊んだとき</a>にremiリポジトリの入り方が CentOS7 とは異なることが分かっていたので、多少手を加える必要があるだろう、と踏んでいました。</p> <pre><code class="bash"># \cp -pf /usr/share/zoneinfo/Japan /etc/localtime # </code></pre> <p>これは問題なし。</p> <pre><code class="bash"># dnf -y update && yum -y install epel-release sudo less iproute httpd-devel zip unzip openssl mod_ssl ## 略 Installed: apr-1.6.3-12.el8.x86_64 apr-devel-1.6.3-12.el8.x86_64 apr-util-1.6.1-6.el8.x86_64 apr-util-bdb-1.6.1-6.el8.x86_64 apr-util-devel-1.6.1-6.el8.x86_64 apr-util-openssl-1.6.1-6.el8.x86_64 brotli-1.0.6-3.el8.x86_64 centos-logos-httpd-85.8-2.el8.noarch cyrus-sasl-2.1.27-5.el8.x86_64 cyrus-sasl-devel-2.1.27-5.el8.x86_64 epel-release-8-11.el8.noarch expat-devel-2.2.5-4.el8.x86_64 groff-base-1.22.3-18.el8.x86_64 httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 httpd-devel-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 httpd-filesystem-2.4.37-43.module_el8.5.0+1022+b541f3b1.noarch httpd-tools-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 libdb-devel-5.3.28-42.el8_4.x86_64 libpath_utils-0.2.1-39.el8.x86_64 libpkgconf-1.4.2-1.el8.x86_64 libtalloc-2.3.2-1.el8.x86_64 mailcap-2.1.48-3.el8.noarch mod_http2-1.15.7-3.module_el8.4.0+778+c970deab.x86_64 mod_ssl-1:2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 ncurses-6.1-9.20180224.el8.x86_64 openldap-devel-2.4.46-18.el8.x86_64 perl-Carp-1.42-396.el8.noarch perl-Data-Dumper-2.167-399.el8.x86_64 perl-Digest-1.17-395.el8.noarch perl-Digest-MD5-2.55-396.el8.x86_64 perl-Encode-4:2.97-3.el8.x86_64 perl-Errno-1.28-420.el8.x86_64 perl-Exporter-5.72-396.el8.noarch perl-File-Path-2.15-2.el8.noarch perl-File-Temp-0.230.600-1.el8.noarch perl-Getopt-Long-1:2.50-4.el8.noarch perl-HTTP-Tiny-0.074-1.el8.noarch perl-IO-1.38-420.el8.x86_64 perl-IO-Socket-IP-0.39-5.el8.noarch perl-IO-Socket-SSL-2.066-4.module_el8.3.0+410+ff426aa3.noarch perl-MIME-Base64-3.15-396.el8.x86_64 perl-Mozilla-CA-20160104-7.module_el8.3.0+416+dee7bcef.noarch perl-Net-SSLeay-1.88-1.module_el8.3.0+410+ff426aa3.x86_64 perl-PathTools-3.74-1.el8.x86_64 perl-Pod-Escapes-1:1.07-395.el8.noarch perl-Pod-Perldoc-3.28-396.el8.noarch perl-Pod-Simple-1:3.35-395.el8.noarch perl-Pod-Usage-4:1.69-395.el8.noarch perl-Scalar-List-Utils-3:1.49-2.el8.x86_64 perl-Socket-4:2.027-3.el8.x86_64 perl-Storable-1:3.11-3.el8.x86_64 perl-Term-ANSIColor-4.06-396.el8.noarch perl-Term-Cap-1.17-395.el8.noarch perl-Text-ParseWords-3.30-395.el8.noarch perl-Text-Tabs+Wrap-2013.0523-395.el8.noarch perl-Time-Local-1:1.280-1.el8.noarch perl-URI-1.73-3.el8.noarch perl-Unicode-Normalize-1.25-396.el8.x86_64 perl-constant-1.33-396.el8.noarch perl-interpreter-4:5.26.3-420.el8.x86_64 perl-libnet-3.11-3.el8.noarch perl-libs-4:5.26.3-420.el8.x86_64 perl-macros-4:5.26.3-420.el8.x86_64 perl-parent-1:0.237-1.el8.noarch perl-podlators-4.11-1.el8.noarch perl-threads-1:2.21-2.el8.x86_64 perl-threads-shared-1.58-2.el8.x86_64 pkgconf-1.4.2-1.el8.x86_64 pkgconf-m4-1.4.2-1.el8.noarch pkgconf-pkg-config-1.4.2-1.el8.x86_64 sscg-2.3.3-14.el8.x86_64 sudo-1.8.29-7.el8_4.1.x86_64 unzip-6.0-45.el8_4.x86_64 zip-3.0-23.el8.x86_64 Complete! </code></pre> <p>OK。</p> <pre><code class="bash"># dnf -y upgrade ## 略 Upgraded: epel-release-8-13.el8.noarch Complete! </code></pre> <p>特に大きな差分もなさそうです。OK。</p> <h3 id="remiリポジトリ"><a href="#remi%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA">remiリポジトリ</a></h3> <pre><code class="bash"># rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-8.rpm Retrieving http://rpms.famillecollet.com/enterprise/remi-release-8.rpm warning: /var/tmp/rpm-tmp.hlvLxe: Header V4 RSA/SHA256 Signature, key ID 5f11735a: NOKEY Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:remi-release-8.5-2.el8.remi ################################# [100%] # rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi2021 # </code></pre> <p>OK。 CentOS8 用のリポジトリに切り替えました。鍵についてはすぐ <code>RPM-GPG-KEY-remi2022</code> にしなければならないでしょうけど。</p> <h4 id="dnf"><a href="#dnf">dnf</a></h4> <pre><code class="bash"># dnf config-manager --enable remi && dnf config-manager --enable remi-php74 No such command: config-manager. Please use /usr/bin/dnf --help It could be a DNF plugin command, try: "dnf install 'dnf-command(config-manager)'" </code></pre> <p><code>remi-php74</code> に指定で躓くかと思いきや、そもそも <code>config-manager</code> がない、と?</p> <p>元々は <code>yum-config-manager</code> だったのですが、 CentOS8 であれば <code>dnf</code> ベースの方が良いだろう、ということで置き換えてはみましたが、ダメですか……。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.trippyboy.com/2021/terraform/almalinux%E3%81%ABterraform%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92yum%E3%81%A7%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%81%AE%E5%B7%BB/">Almalinuxにterraformコマンドをyumで導入するの巻 - TrippyBoyの愉快な日々</a></li> </ul> <p>こちらより <code>dnf install -y dnf-plugins-core</code> してみます。</p> <pre><code class="bash"># dnf install dnf-plugins-core ## 略 Installed: dbus-glib-0.110-2.el8.x86_64 dnf-plugins-core-4.0.21-3.el8.noarch python3-dateutil-1:2.6.1-6.el8.noarch python3-dbus-1.2.4-15.el8.x86_64 python3-dnf-plugins-core-4.0.21-3.el8.noarch python3-six-1.11.0-8.el8.noarch Complete! </code></pre> <p>OK。</p> <h4 id="remi + PHP"><a href="#remi+%2B+PHP">remi + PHP</a></h4> <pre><code class="bash"># dnf config-manager --enable remi && dnf config-manager --enable remi-php74 Error: No matching repo to modify: remi-php74. </code></pre> <p>……やはり <code>remi-php74</code> で引っかかりましたか。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mebee.info/2020/03/12/post-7365/">CentOs8 php7.4をインストールする | mebee</a></li> </ul> <p>……想定していたものとは少し違うやり方ですが、試してみましょう。</p> <pre><code class="bash"># dnf module reset php ## 略 Remi's RPM repository for Enterprise Linux 8 - x86_64 598 kB/s | 3.9 MB 00:06 Last metadata expiration check: 0:00:03 ago on DDD dd mmm yyyy hh:ii:ss AM UTC. Dependencies resolved. Nothing to do. Complete! </code></pre> <p>OK。</p> <pre><code class="bash"># dnf module install -y php:remi-7.4 ## 略 Installed: libedit-3.1-23.20170329cvs.el8.x86_64 libxslt-1.1.32-6.el8.x86_64 nginx-filesystem-1:1.14.1-9.module_el8.0.0+184+e34fea82.noarch oniguruma5php-6.9.7.1-1.el8.remi.x86_64 php-cli-7.4.27-1.el8.remi.x86_64 php-common-7.4.27-1.el8.remi.x86_64 php-fpm-7.4.27-1.el8.remi.x86_64 php-json-7.4.27-1.el8.remi.x86_64 php-mbstring-7.4.27-1.el8.remi.x86_64 php-xml-7.4.27-1.el8.remi.x86_64 Complete! # php --version PHP 7.4.27 (cli) (built: Dec 14 2021 17:17:06) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies </code></pre> <p>OK。入りましたね。これに従い該当箇所を書き換えます。</p> <pre><code class="dockerfile"># enable repository remi & remi-php74 #RUN dnf config-manager --enable remi && dnf config-manager --enable remi-php74 # disable default module RUN dnf module reset -y php RUN dnf module install -y php:remi-7.4 ## 略 # disable repository remi & remi-php74 #RUN dnf config-manager --disable remi && dnf config-manager --disable remi-php74 </code></pre> <p><code>config-manager</code> によるリポジトリ使用のオン・オフの切り替えを削除しました。</p> <pre><code class="bash"># dnf -y install php php-devel php-pdo php-mysqlnd php-mbstring php-gd php-pear php-pecl-apc-devel zlib-devel php-xml php-mcrypt php-pecl-xdebug ## 略 Installed: autoconf-2.69-29.el8.noarch automake-1.16.1-7.el8.noarch cmake-filesystem-3.20.2-4.el8.x86_64 cpp-8.5.0-4.el8_5.x86_64 dejavu-fonts-common-2.35-7.el8.noarch dejavu-sans-fonts-2.35-7.el8.noarch emacs-filesystem-1:26.1-7.el8.noarch fontconfig-2.13.1-4.el8.x86_64 fontpackages-filesystem-1.44-22.el8.noarch freetype-2.9.1-4.el8_3.1.x86_64 fribidi-1.0.4-8.el8.x86_64 gcc-8.5.0-4.el8_5.x86_64 gcc-c++-8.5.0-4.el8_5.x86_64 gd3php-2.3.3-4.el8.remi.x86_64 glibc-devel-2.28-164.el8.x86_64 glibc-headers-2.28-164.el8.x86_64 graphite2-1.3.10-10.el8.x86_64 harfbuzz-1.7.5-3.el8.x86_64 isl-0.16.1-6.el8.x86_64 jbigkit-libs-2.1-14.el8.x86_64 kernel-headers-4.18.0-348.2.1.el8_5.x86_64 keyutils-libs-devel-1.5.10-9.el8.x86_64 krb5-devel-1.18.2-14.el8.x86_64 libX11-1.6.8-5.el8.x86_64 libX11-common-1.6.8-5.el8.noarch libXau-1.0.9-3.el8.x86_64 libXpm-3.5.12-8.el8.x86_64 libcom_err-devel-1.45.6-2.el8.x86_64 libimagequant-2.12.5-1.el8.x86_64 libjpeg-turbo-1.5.3-12.el8.x86_64 libkadm5-1.18.2-14.el8.x86_64 libmcrypt-2.5.8-26.el8.x86_64 libmpc-1.1.0-9.1.el8.x86_64 libpng-2:1.6.34-5.el8.x86_64 libraqm-0.7.0-4.el8.x86_64 libselinux-devel-2.9-5.el8.x86_64 libsepol-devel-2.9-3.el8.x86_64 libsodium-1.0.18-2.el8.x86_64 libstdc++-devel-8.5.0-4.el8_5.x86_64 libtiff-4.0.9-20.el8.x86_64 libtool-2.4.6-25.el8.x86_64 libverto-devel-0.3.0-5.el8.x86_64 libwebp-1.0.0-5.el8.x86_64 libxcb-1.13.1-1.el8.x86_64 libxcrypt-devel-4.1.1-6.el8.x86_64 libxml2-devel-2.9.7-9.el8_4.2.x86_64 m4-1.4.18-7.el8.x86_64 make-1:4.2.1-10.el8.x86_64 openssl-devel-1:1.1.1k-5.el8_5.x86_64 pcre2-devel-10.32-2.el8.x86_64 pcre2-utf16-10.32-2.el8.x86_64 pcre2-utf32-10.32-2.el8.x86_64 perl-Thread-Queue-3.13-1.el8.noarch php-7.4.27-1.el8.remi.x86_64 php-devel-7.4.27-1.el8.remi.x86_64 php-fedora-autoloader-1.0.1-2.el8.remi.noarch php-gd-7.4.27-1.el8.remi.x86_64 php-mysqlnd-7.4.27-1.el8.remi.x86_64 php-opcache-7.4.27-1.el8.remi.x86_64 php-pdo-7.4.27-1.el8.remi.x86_64 php-pear-1:1.10.13-1.el8.remi.noarch php-pecl-apcu-5.1.21-1.el8.remi.7.4.x86_64 php-pecl-apcu-devel-5.1.21-1.el8.remi.7.4.x86_64 php-pecl-mcrypt-1.0.4-1.el8.remi.7.4.x86_64 php-pecl-xdebug-2.9.8-1.el8.remi.7.4.x86_64 php-process-7.4.27-1.el8.remi.x86_64 php-sodium-7.4.27-1.el8.remi.x86_64 xz-devel-5.2.4-3.el8.x86_64 zlib-devel-1.2.11-17.el8.x86_64 Complete! </code></pre> <p>OK。</p> <pre><code class="bash"># php -r &quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&quot; && php composer-setup.php && php -r &quot;unlink('composer-setup.php');&quot; && mv composer.phar /usr/local/bin/composer All settings correct for using Composer Downloading... Composer (version 2.2.1) successfully installed to: /etc/yum.repos.d/composer.phar Use it: php composer.phar # composer --version Composer version 2.2.1 2021-12-22 22:21:31 </code></pre> <p>Composer も入りました。</p> <pre><code class="bash"># mkdir /var/log/php # chown apache /var/log/php # chmod 755 /var/log/php # mkdir -p /etc/ssl/private </code></pre> <p>まあこの辺りは普通に。</p> <h3 id="SSL"><a href="#SSL">SSL</a></h3> <pre><code class="bash"># openssl req -new -newkey rsa:2048 -nodes -out /etc/ssl/private/server.csr -keyout /etc/ssl/private/server.key -subj &quot;/C=/ST=/L=/O=/OU=/CN=*.lvh.me&quot; ## 略 # openssl x509 -days 365 -req -signkey /etc/ssl/private/server.key -in /etc/ssl/private/server.csr -out /etc/ssl/private/server.crt Signature ok subject=CN = *.lvh.me Getting Private key </code></pre> <p>OK。</p> <h3 id="Apache の設定ファイル"><a href="#Apache+%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB">Apache の設定ファイル</a></h3> <h4 id="ssl.conf"><a href="#ssl.conf">ssl.conf</a></h4> <pre><code class="bash"># cat /etc/httpd/conf.d/ssl.conf ## 略 </code></pre> <p>表示させたSSL用の設定を現行のものと差し替えます。ただし、現行の設定をなるべく引き継ぐように。これは他の設定ファイルも同様です。</p> <pre><code class="conf">- SSLRandomSeed startup file:/dev/urandom 256 - SSLRandomSeed connect builtin - SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA </code></pre> <p>現行にあったこれらの行は削除。</p> <pre><code class="conf">+ SSLHonorCipherOrder on </code></pre> <p>これは新しく追加されていました。</p> <pre><code class="conf">SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 </code></pre> <p>プロトコルについては念のため現行の設定を引き継ぎ。流石にもう SSLv2 なんて存在しないでしょうけど……。</p> <pre><code class="conf">- <Files ~ "\.(cgi|shtml|phtml|php3?)$"> + <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars - </Files> + </FilesMatch> </code></pre> <p>微妙にディレクティブの表現が変わっていますが、影響はなさそうなので変更を受け入れます。</p> <h4 id="php.conf"><a href="#php.conf">php.conf</a></h4> <pre><code class="bash"># cat /etc/httpd/conf.d/php.conf ## 略 # Redirect to local php-fpm if mod_php (5 or 7) is not available <IfModule !mod_php5.c> <IfModule !mod_php7.c> # Enable http authorization headers SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 <FilesMatch \.(php|phar)$> SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" </FilesMatch> </IfModule> </IfModule> </code></pre> <p>こちらは最後の部分に追記がありますね。これはそのまま受け入れ。</p> <h4 id="php.ini"><a href="#php.ini">php.ini</a></h4> <pre><code class="bash"># cat /etc/php.ini ## 略 </code></pre> <p>こちらも設定を引き継ぎ、といっても現行の設定と変更点はなく(自前の設定を引き継いだ) 差分としてはコメントの文字列くらい。</p> <h3 id="AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message"><a href="#AH00558%3A+httpd%3A+Could+not+reliably+determine+the+server%27s+fully+qualified+domain+name%2C+using+192.0.2.1.+Set+the+%27ServerName%27+directive+globally+to+suppress+this+message">AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message</a></h3> <p>Apache を起動しようとしたところ、</p> <blockquote> <p>AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message</p> </blockquote> <p>のエラーメッセージがログに記録されて起動してこない現象に遭遇。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sachiko-kame/items/a6deebbad207d627b598">[Docker]AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using ***.***.*.*. Set the 'ServerName' directive globally to suppress this message - Qiita</a></li> </ul> <p>そういえば元々の Dockerfile には記述していましたが、 <code>httpd.conf</code> への追記をしていませんでした。</p> <pre><code class="bash">echo ServerName www.example.com:80 >> /etc/httpd/conf/httpd.conf </code></pre> <p>これでOK。</p> <pre><code class="bash"># httpd -v Server version: Apache/2.4.37 (centos) Server built: Nov 12 2021 04:57:27 </code></pre> <p>バージョンも拾えました。</p> <h3 id="(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed"><a href="#%282%29No+such+file+or+directory%3A+AH02454%3A+FCGI%3A+attempt+to+connect+to+Unix+domain+socket+%2Frun%2Fphp-fpm%2Fwww.sock+%28%2A%29+failed">(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed</a></h3> <p>これで Apache も起動してきたのでブラウザで表示確認、ということで <code>phpinfo()</code> でも表示させようかとファイルを用意して <code>curl</code> してみると……</p> <blockquote> <p>Service Unavailable</p> <p>The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.</p> </blockquote> <p>503エラーが出てしまいました。</p> <blockquote> <p>(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed</p> </blockquote> <p>Apache のエラーログには上述のログが記録されていました。</p> <p>今までとは異なる方法で PHP をインストールしたら、どうやら php-fpm (CGIモード) で動作しようとしてしまっているようです。</p> <p>今回の環境ではCGI版かモジュール版かはあまり考慮しておらず、Webサーバも Apache のためモジュール版でも良いと判断。</p> <p>動作を切り替えます。</p> <pre><code class="bash"># less /etc/httpd/conf/httpd.conf ## 略 Include conf.modules.d/*.conf </code></pre> <p>念のためモジュール読み込みの記述があることを確認。</p> <pre><code class="bash"># ls /etc/httpd/conf.modules.d/ 00-base.conf 00-lua.conf 00-optional.conf 00-ssl.conf 01-cgi.conf 10-proxy_h2.conf README 00-dav.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 10-h2.conf 15-php.conf </code></pre> <p>関係しそうなのは <code>00-mpm.conf</code>, <code>01-cgi.conf</code>, <code>15-php.conf</code> 辺りでしょうか。</p> <pre><code class="bash"># less /etc/httpd/conf.modules.d/15-php.conf # Cannot load both php5 and php7 modules <IfModule !mod_php5.c> <IfModule prefork.c> LoadModule php7_module modules/libphp7.so </IfModule> </IfModule> </code></pre> <p>ここはそのまま。</p> <pre><code class="bash"># less /etc/httpd/conf.modules.d/01-cgi.conf # This configuration file loads a CGI module appropriate to the MPM # which has been configured in 00-mpm.conf. mod_cgid should be used # with a threaded MPM; mod_cgi with the prefork MPM. <IfModule mpm_worker_module> LoadModule cgid_module modules/mod_cgid.so </IfModule> <IfModule mpm_event_module> LoadModule cgid_module modules/mod_cgid.so </IfModule> <IfModule mpm_prefork_module> LoadModule cgi_module modules/mod_cgi.so </IfModule> </code></pre> <p>ここもそのまま。</p> <pre><code class="bash"># less /etc/httpd/conf.modules.d/00-mpm.conf # Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines. See the httpd.conf(5) man # page for more information on changing the MPM. # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html # # NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux # boolean should be enabled, to allow graceful stop/shutdown. # #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # LoadModule mpm_event_module modules/mod_mpm_event.so </code></pre> <p>変更するのはここ。</p> <pre><code>- #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so + LoadModule mpm_prefork_module modules/mod_mpm_prefork.so - LoadModule mpm_event_module modules/mod_mpm_event.so # LoadModule mpm_event_module modules/mod_mpm_event.so </code></pre> <p>上述のうち2ヶ所を反転させます。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.out48.com/archives/5636/">CentOSにApacheとPHP入れてPHPファイルを表示しようとしたら503エラー Output48</a></li> </ul> <p>これでOK。起動も確認できました。</p> <p>テンプレートとして上述を反転させた <code>00-mpm.conf</code> を用意し、エントリポイントでファイルコピーして設定を上書きすることで対処しました。</p> <p><a href="https://crieit.now.sh/upload_images/abe7eb81a2b7f6580feb784cb81cdf1361cb21ea49eef.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/abe7eb81a2b7f6580feb784cb81cdf1361cb21ea49eef.jpg?mw=700" alt="最終的に AlmaLinux の Docker Compose で起動、確認した phpinfo() の画面" /></a></p> <p>最終的に AlmaLinux の Docker Compose を作成して起動し、ブラウザで該当の PHPファイル にアクセスし、 <code>phpinfo()</code> の画面が表示されることを確認できました。OK。</p> <h3 id="SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty"><a href="#SSLCertificateFile%3A+file+%27%2Fetc%2Fpki%2Ftls%2Fcerts%2Flocalhost.crt%27+does+not+exist+or+is+empty">SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty</a></h3> <p>上述のエラーの他に</p> <blockquote> <p>SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty</p> </blockquote> <p>localhost のSSL証明書がない、というエラーにも遭遇しました。</p> <p>なければ作れば良いだけ、上述で</p> <pre><code class="bash">echo ServerName www.example.com:80 >> /etc/httpd/conf/httpd.conf </code></pre> <p>としているので、このダミードメインを使います。</p> <pre><code class="bash"># openssl req -new -newkey rsa:2048 -nodes -out /etc/pki/tls/certs/localhost.csr -keyout /etc/pki/tls/private/localhost.key -subj &quot;/C=/ST=/L=/O=/OU=/CN=www.example.com&quot; ## 略 # openssl x509 -days 365 -req -signkey /etc/pki/tls/private/localhost.key -in /etc/pki/tls/certs/localhost.csr -out /etc/pki/tls/certs/localhost.crt Signature ok subject=CN = www.example.com Getting Private key </code></pre> <p>これでOK。 <code>ssl.conf</code> には記述はあるのですが……。</p> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <p>次に MySQL 側を。こちらはほぼ手を加える必要はないという想定です。</p> <pre><code class="bash"># dnf localinstall https://dev.mysql.com/get/mysql80-community-release-el8-2.noarch.rpm ## 略 Package mysql80-community-release-el8-2.noarch is already installed. Dependencies resolved. Nothing to do. Complete! </code></pre> <p>CentOS8 用ということでリポジトリの入れ方を少し変更。</p> <pre><code class="bash"># ls /etc/yum.repo.d/ CentOS-Linux-AppStream.repo CentOS-Linux-Media.repo epel-testing.repo CentOS-Linux-BaseOS.repo CentOS-Linux-Plus.repo mysql-community.repo CentOS-Linux-ContinuousRelease.repo CentOS-Linux-PowerTools.repo mysql-community-source.repo CentOS-Linux-Debuginfo.repo CentOS-Linux-Sources.repo remi-modular.repo CentOS-Linux-Devel.repo epel-modular.repo remi.repo CentOS-Linux-Extras.repo epel-playground.repo remi-safe.repo CentOS-Linux-FastTrack.repo epel.repo CentOS-Linux-HighAvailability.repo epel-testing-modular.repo </code></pre> <p><code>mysql-community.repo</code>, <code>mysql-community-source.repo</code> の2つが追加されたことを確認。</p> <pre><code class="bash"># dnf module disable mysql ## 略 Complete! </code></pre> <p>デフォルトの MySQL がいると邪魔になるので無効化して</p> <pre><code class="bash"># dnf -y install mysql-community-devel mysql-community-server ## 略 Installed: mysql-community-client-8.0.27-1.el8.x86_64 mysql-community-client-plugins-8.0.27-1.el8.x86_64 mysql-community-common-8.0.27-1.el8.x86_64 mysql-community-devel-8.0.27-1.el8.x86_64 mysql-community-libs-8.0.27-1.el8.x86_64 mysql-community-server-8.0.27-1.el8.x86_64 net-tools-2.0-0.52.20160912git.el8.x86_64 Complete! </code></pre> <p>インストール完了。</p> <pre><code class="bash"># mysqld --version /usr/sbin/mysqld Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL) </code></pre> <p>デフォルトでは <code>8.0.26</code> だったバージョンが地味に <code>8.0.27</code> に上がりました。</p> <pre><code class="bash"># grep 'temporary password' /var/log/mysqld.log yyyy-mm-ddThh:ii:ss.zzzzzzZ 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: XXXXXXXXXXXX </code></pre> <p>初期パスワードの出現位置が半角スペース区切りで13番目であることを確認。これはエントリポイントで <code>awk</code> を使って抽出、初期パスワードを環境変数の値で書き換える処理で使用するため個人的には重要ポイント。ここは変更しなくて良さそうです。</p> <pre><code class="bash"># cat /etc/my.cnf [mysqld] ## 略 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid </code></pre> <p>デフォルトで4つパラメータが指定されています。うち3つはテンプレートの設定ファイルに記述がされているので不要、 <code>pid-file</code> だけ現時点では指定がないため、これだけ <code>base.cnf</code> に移植します。</p> <p><code>/etc/my.cnf</code> には上述4つを削除した代わりに <code>!includedir /etc/my.cnf.d</code> を末尾に追加したものを現行の <code>my.cnf</code> と差し替え。</p> <p>これで MySQL 側は良さそうです。</p> <p>なお、 phpMyAdmin は公式イメージをそのまま使っているので変更なし。</p> <p>以上で一通り動作検証できたので、これをベースに AlmaLinux 用に書き換えれば良さそうです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="Docker"><a href="#Docker">Docker</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/almalinux?tab=tags">almalinux Tags | Docker Hub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/centos?tab=tags">centos Tags | Docker Hub</a></li> </ul> <h3 id="AlmaLinux"><a href="#AlmaLinux">AlmaLinux</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.apar.jp/linux/15554/">AlmaLinux 8.4 LAMPサーバインストールメモ【Apache2.4+MySQL8.0+PHP7.4】 | あぱーブログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yamada-hakase/items/17b41d33e30232b69fe2">AlmaLinuxを使ってみた(後編) - Qiita</a></li> </ul> <h3 id="dnf"><a href="#dnf">dnf</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://blog.trippyboy.com/2021/terraform/almalinux%E3%81%ABterraform%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92yum%E3%81%A7%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%81%AE%E5%B7%BB/">Almalinuxにterraformコマンドをyumで導入するの巻 - TrippyBoyの愉快な日々</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/40937056/dnf-missing-config-manager-command">linux - DNF missing config-manager command - Stack Overflow</a></li> </ul> <h3 id="remi"><a href="#remi">remi</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://rpms.remirepo.net/">Remi's RPM repository</a></li> </ul> <h3 id="AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message"><a href="#AH00558%3A+httpd%3A+Could+not+reliably+determine+the+server%27s+fully+qualified+domain+name%2C+using+192.0.2.1.+Set+the+%27ServerName%27+directive+globally+to+suppress+this+message">AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.0.2.1. Set the 'ServerName' directive globally to suppress this message</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sachiko-kame/items/a6deebbad207d627b598">[Docker]AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using ***.***.*.*. Set the 'ServerName' directive globally to suppress this message - Qiita</a></li> </ul> <h3 id="PHP"><a href="#PHP">PHP</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mebee.info/2020/03/12/post-7365/">CentOs8 php7.4をインストールする | mebee</a></li> </ul> <h3 id="(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed"><a href="#%282%29No+such+file+or+directory%3A+AH02454%3A+FCGI%3A+attempt+to+connect+to+Unix+domain+socket+%2Frun%2Fphp-fpm%2Fwww.sock+%28%2A%29+failed">(2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/58365479/no-such-file-or-directory-ah02454-fcgi-attempt-to-connect-to-unix-domain-sock">apache - No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /var/run/php/php5.6-fpm.sock (*) failed - Stack Overflow</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.out48.com/archives/5636/">CentOSにApacheとPHP入れてPHPファイルを表示しようとしたら503エラー Output48</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://ja.stackoverflow.com/questions/46727/amazon-linux2%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BCah02454%E3%82%84ah01079%E3%81%AA%E3%81%A9%E3%81%8C%E5%87%BA%E3%81%A6httpd%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93">php - amazon-linux2でエラーAH02454やAH01079などが出てhttpdがうまく起動しません - スタック・オーバーフロー</a></li> </ul> <h3 id="php-fpm"><a href="#php-fpm">php-fpm</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc">nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する - Qiita</a></li> </ul> <h3 id="SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty"><a href="#SSLCertificateFile%3A+file+%27%2Fetc%2Fpki%2Ftls%2Fcerts%2Flocalhost.crt%27+does+not+exist+or+is+empty">SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://daredemose.com/linux/ssl/">SSL/TLS | 初心者向けプログラミング講座</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://hacknote.jp/archives/51779/">いつの間にか作られてる /etc/pki/tls/certs/localhost.crt と /etc/pki/tls/private/localhost.key の謎 | ハックノート</a></li> </ul> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yasushi-jp/items/1579c301075d693a2a36">MySQL 8.0 を CentOS 8.1 にインストールする手順 - Qiita</a></li> </ul> arm-band