MYSQL

Queryの作成をミスって、大量のQueryが溜まってしまうことがあります。MSYQLの接続数上限を超え、以下のエラーが出ます。

mysqli::real_connect(): (HY000/1040): Too many connections

実行中のQuery確認

mysql> show processlist;

上記で実行中のQueryを確認してみると、数百秒経過していないQueryが大量に発生しています。

300秒以上実行しているQueryリスト

mysql -h <HOST> -u <USER> -p -e'SELECT GROUP_CONCAT(ID) FROM information_schema.PROCESSLIST WHERE TIME > 300;'

上記で300秒以上経過しているQueryのプロセスIDがカンマ区切りで帰ってきます。

300秒以上経過しているQueryをまとめてKill

mysqladmin kill <ID>,<ID> -h localhost -u root -p

プロセスIDをコピペし、上記を実行すると数百秒経っても終わっていないQueryをまとめてKillすることができます。

Apache

mod_rewriteでURLを書き換えたい時に、以下のケースで困りました。

https://hogehoge.com/BBB/CCC/DDD/
でアクセスしてきた時には、
https://hogehoge.com/AAA.php?HOGE=$1&HUGA=$2

としたい。

且つ

https://hogehoge.com/BBB/
でアクセスしてきた時には、
https://hogehoge.com/AAA.php

を読ませたい。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond  %{REQUEST_URI} ^/BBB/
RewriteRule ^/BBB/ /AAA\.php [L]
RewriteCond  %{REQUEST_URI} ^/BBB/([a-z_]+)/([0-9]+)/
RewriteRule ^/BBB/([a-z_]+)/([0-9]+)/+ /AAA\.php?CCC=$1&DDD=$2 [L]
</IfModule>

どちらも同じPHPを読ませるので上記の記述で良いと思ったけど、mod_rewriteのレスポンスがものすごく悪く、ページの表示に5秒ほどかかるようになってしまいました。

しっかり、RewriteCondの末尾を書かないと行けないらしい。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond  %{REQUEST_URI} ^/BBB/$
RewriteRule ^/BBB/ /AAA\.php [L]
RewriteCond  %{REQUEST_URI} ^/BBB/([a-z_]+)/([0-9]+)/$
RewriteRule ^/BBB/([a-z_]+)/([0-9]+)/+ /AAA\.php?CCC=$1&DDD=$2 [L]
</IfModule>

上記の様に$をつけたところ正常なレスポンスになりましした。

PHP

# yum install --enablerepo=remi,remi-php71,epel php71-php-bcmath

上記だけだと、phpinfoに出てこないことがあります。Apacheを再起動してもbcmathが出てきません。

/etc/php.d/や/etc/php.d/に必要なファイルがコピーされていないことが原因なので以下を実行し手動でコピーします。

# cp /etc/opt/remi/php70/php.d/20-bcmath.ini /etc/php.d/
# cp /opt/remi/php70/root/usr/lib64/php/modules/bcmath.so /usr/lib64/php/modules/
# systemctl restart httpd
# php -m
[PHP Modules]
bcmath

PHP

CentOS7にComposerをインストールする手順です。PHPはすでにインストールされている前提です。

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

上記を実行すると、composer-setup.phpというファイルがダウンロードされます。composer-setup.phpを実行します。

# php composer-setup.php

上記を実行するとcomposer.pharが出来上がります。必要のなくなったcomposer-setup.phpは削除します。

# php -r "unlink('composer-setup.php');"

色々な場所・ユーザーで使いたいので、composer.pharを/usr/local/bin/に移動します。

# mv composer.phar /usr/local/bin/composer

Apache

Googleが作ったWebサイトの高速化モジュールのmod_pagespeed。インストールも設定も簡単なのですが、キャッシュが残って、更新した内容が反映されないということがよくあります。

そういうときには、mod_pagespeedのキャッシュを削除します。

touch /var/cache/mod_pagespeed/cache.flush

Linuxサーバー構築・設定

ディレクトリ内の特定のLinuxユーザー権限のファイルを探したいときには以下(例:nobody)

find /home/ -user nobody

WordPress

kusanagiでサイトを公開している時に、http://でもhttps://でもサイトが閲覧できてしまうことがあります。

すべてhttps://にリダイレクトさせたい時にには以下のコマンド。

kusanagi ssl --https redirect kusanagi_provision

WordPress

Aタグ内にエラー

Aタグ内を見てみるとpost_idが受けて取れていない感じのエラーが一緒に入ってた。

書き換え

get_the_permalink($post_id)

と書かれていたので、

get_permalink($post->ID);

と書き換え無事解決しました。

WordPress

PHP5.*

「昔構築したWordPressの調子が悪い」と状態を確認してみると、PHP5.*のままレンタルサーバーを運用していたりすることがあります。

WordPressもPHP5.*のままだとバージョンアップできずに古いまま。当然プラグインも古いままという状態。

同じバージョンのPHPが利用できるサーバーを準備

本番環境で、PHPもWordPressも一気にバージョンアップなんてしたら取り返しの付かないことになります。エラーがでて残業して復旧作業とかになりかねません。

まずは、同じバージョンのPHPが使えるサーバーを準備します。

そして、コンパネから問題のサーバーと同じくらいのPHPバージョンを指定します。

MYSQLに関してはなかなかそうも行かないので、できる限り近いバージョンで。

MYSQLをダンプ・ファイル一式をコピー

SSHが使えるレンタルサーバーならコマンド一発でファイル一式をコピーすることができます。FTPでそれをやると恐ろしく時間がかかることがあります。

MYSQLはダンプファイルを使って開発環境サーバーでレストアします。

wp-config.phpの書き換え

wp-config.php内のDB情報を今回準備したサーバーの情報に書き換えます。

この状態で動作するか確認

元の環境と可能な限り近い環境にしたら、WordPressの閲覧・投稿などができるか確認します。この時点でエラーが出ていたら厄介(笑)

同じ環境ならエラーは出ないはず。

プラグイン関連をアップデート

WordPressの管理画面から、プラグインをアップデートします。

WordPressが動作しているか、エラーを吐いていないかもチェックします。

WordPressをアプデート

プラグインをアップデートしたら、WordPressもアップデートします。

WordPressが動作しているか、エラーを吐いていないかもチェックします。

プラグインをもう一回アップデート

WordPressをアップデートすると、更にプラグインのアップデートが必要な場合があるので、あればアップデート。

WordPressが動作しているか、エラーを吐いていないかもチェックします。

PHPのバージョンアップ

最後にPHPのバージョンアップ。PHP5.*からで、function.phpをいじっている場合色々書き換える必要が出てくると思います。

デバックモードにして、エラーを潰します。

最後にエラーも出ずに動作しているかのチェックをして完了。

元のサーバーの各種アップデート

開発環境でいじった手順で元の本番サーバーもアップデートしていきます。似たような環境でテストしたとは言え全く同じでは無いと思うので、おかしな挙動を起こしたときはデバッグモードでチェック。

PHP,ニュース

最近はPHPはアクティブサポートは2年、セキュリティサポートは3年という周期が続いています。PHP7.4はとっくに2022/11/28でSecurityサポートが終了しました。

バージョン初回リリースアクティブサポートセキュリティサポート
8.12021/11/252023/11/252024/11/25
8.02020/11/262022/11/262023/11/26
7.42019/11/282021/11/282022/11/28

PHPのバージョンアップが早すぎて、各ディストリビュージョンはついていけてない感じ?サーバー管理者はPHPを使う場合は、各自でバージョンを確認しインストールする必要がありそうです。