2017年4月上旬から5月にかけて、当サイト「お酒の価格比較サイト 酒楽-SAKERAKU-」では色々な不具合が発生していました。
該当期間に当サイトを利用された方には、表示が変だったり一時的にアクセスできないなど不快な思いをされた方もいらっしゃるかも知れません。
深くお詫びしたいと思います。
その、原因と言うのがサーバーのアップグレード。
当サイトではPHPなどを利用してサイトを構成していますが、プロではないので何となくでソースを書いています。
そのせいで、修復に時間がかかりましたが現在は自分の確認できる範囲ですが、ほぼ復旧を致しました。
今回の記事は、復旧の際の健忘録として記事を書きたいと思います。
お酒以外の記事ですので、興味の有る方 以外はスルー推奨です。
興味の有る方も、あまり深い話はしないので読む必要は無いかも知れません。
あくまでも健忘録ですので。
もくじ
色々とアップグレードされ発生した3つの不具合
サーバーがアップグレードされる事、自体は喜ばしい事です。
ハードやシステムがアップグレードされ、ある程度は最新の環境になった事でのメリットは実感しているのでアップグレードされメリットが受けられるなら大歓迎です。
今回のアップグレードでメリットを感じた例としては
うちのサイトでは新商品のニュースリリースが発行されたら、新商品の情報を追加する為にデータベース(公開用テーブル)からCSVでデータをDLして新商品などを検索するのにを必要な情報などを追加・編集し、データベース(バックアップ用テーブル)にアップして問題がなければSQLでデータをDLし、データベース(公開用テーブル)にアップすると言う工程でデータ更新を行っています。
もっと効率の良い方法なども有るとは思いますが、CSVでデータを編集した方が感覚的に楽ですし、2つのテーブルで管理した方が問題があった時に対処しやすいと思うので、今後もこの方法で更新していくと思います。
個人的には感覚的に使いやすい方法なのですが、「SQLをアップする時に凄く時間がかかる」と言う問題点が有りました。
が、今回のアップグレードでサーバーのストレージがHDDからSSDに変更されたからでしょうか?
20秒~30秒くらいアップロードにかかっていた時間が5秒もせずにアップロードが完了するようになりました。
ええ。感動です。
回線が太くなったとか他の要因でアップロードの時間がかからなくなった可能性も有りますが、どちらにしても一瞬でデータをアップロード出来るのは凄いメリットです。
他にもサイト自体の表示速度が早くなっているなど嬉しい点が多数あって万々歳。
まあ、価格比較の検索結果を表示するページでは、APIなどのウェブサービスを利用しているので、外部にリクエストを送っている部分ではデータが返って来るまでの時間ってのはデータ量やウェブサービスによって変わり、向こう側の制限に依存するので、価格比較ページでの表示スピードはあまり変わらないのですが。
そんなメリットも有りつつ、今回のアップグレードではハード面だけでなくシステム面でもアップデートされていました。
特にMySQL・PHPの新しいバージョンがインストールされると言うのは、不具合が出る可能性は有ると思います。
私みたいな素人はネットで見つかる記事を元にソースを書いているので、対応バージョンなどが書かれていない古い記事を元に構成されているPHPなどは問題が出ても仕方ないですね。
MySQL 5.6 → 5.7
PHP 5.3 → 7.0
この辺りの影響はモロに受けたのでしょう。
あと、Apacheもアップデートされ、サーバーの設定なども変わっているのか、この点でも不具合が発生しました。
で、サーバー具体的に問題が発生したのは3点。
症状1.WordPressのダッシュボードにログインしようとすると403エラーがなどが出て入れないなどのWordPress関連の不具合。
症状2.サーバーにインストールされているPEARライブラリが、これまでの指定ではアクセスできない。
症状3.本体サイトの検索フォームで複数ワード指定すると500エラーが発生する。
これまでは普通に動いていたので、アップデートされたシステムが関係する不具合である事は予想出来ますね。
PHPとか廃止された関数とかも有るそうですし。
ネットで調べてみても解決法を探すのにかなりの時間を消費しましたので、何が問題だったのか考えつつ、私が行った対処を書き記しておこうと思います。
こんな素人記事でも何かのヒントになれば嬉しいです。
症状その1:WordPressのダッシュボードにログイン出来ない問題
必死だったので詳細については忘れている事も多いのですが
1.ブログ自体は表示されているがユーザー名でのログインが出来ずに403エラーが表示される。
2.メールアドレスでログインは出来たが、mysqli関連のエラーがダッシュボード内に表示される。
3.メールアドレスでログインし、この状態で記事を投稿しようとするとエラーになる。
まあ、十中八九でアップデートされたmysqli関連のエラーっぽいですね。
テストとして、エラーを起こしているWordPressをまるごとダウンロードして、新しいデータベースを作り、テスト用のフォルダで最初からセットアップすると問題なく動作した。
はい。何が問題なのか分からないけどMySQL関連の問題っぽいです。
MySQL 5.6 → 5.7では、かなり変わったと言う話をどこかで見かけましたが、マイナーバージョンアップで互換性が無いほど構造が変わってるのか?とは思うのですが・・・
WordPressが何かしらMySQL関係の情報をデータベースに保存していて問題を起こしているのか? それとも互換性が無い部分があってログイン出来ないのか?何が原因だったのかは未だに原因不明です。
記事は表示されていたので、データベース周りでの問題は無い様な気がするのですが・・・。
ダッシュボード周りで何が有るのか分かりませんが、多分 MySQLのアップデートで何かしら問題の有る部分があってログイン出来なくなったりの問題が出たのだろうと解釈する事に。
と、言う事はデータベースの方でSQLをダウンロードして新しいデータベースなどに移し、セットアップしても意味が無いだろうと判断。
幸い、メールアドレスでログインするとダッシュボードにアクセスは出来ましたし、記事などはWordPressでエクスポート出来たので、テスト用に作ったフォルダに設置したWordPressにインポートして ある程度は問題ない事を確認。
データベースを一旦消去してWordPressを元のURLで再セットアップ。
正直、再セットアップは面倒くさかったですが、データベースに問題があるっぽいのでこれ以上粘っても仕方ない。
これ以上の原因究明は難しそうなので諦めました。
で、また問題点が発生。
WordPressのエクスポートでは、テーマの機能で設定されていた部分のデザインやら アイキャッチなどは引き継がれないみたいなので、その辺りを対処。
テーマの機能で設定されている部分はMySQL内に記録されており、WordPressのエクスポートでは出力されない部分みたいです。
仕方ないので、元のデザインになるように設定していくしかないみたいでした。
アイキャッチ画像もエクスポートデータをインポートしても復旧しないみたいです。
WordPressの「メディア」の項目の中が空っぽになっているので、エクスポートしたデータでは「メディアライブラリ」の設定は出力しないのだろうと、この時点では判断。
画像自体はWordPressをまるごとダウンロードしたフォルダ内には有るのでURLで指定すれば表示出来ますが、アイキャッチなどは画像のURLではなくメディアライブラリの設定として紐付けされ表示している様です。
一時期、ブログのトップページにアイキャッチ画像が設定されずに真っ白だったと思いますが、MySQL内に画像との紐付けするデータが無かったと思われるためです。
でも、アイキャッチ画像の情報が全く無いなら、アイキャッチを設定しなかった時に表示されるはずの「NoImage」画像が表示されるはずなので、それが表示されないと言うのは変な話です。
もしかしたら、ユーザー名を変更したので、その関連で何かしら紐付けが上手く行かなかったのかも知れませんね。
まあ、ここまできたら再度やり直すのも面倒ですし、最低限の状態として記事にはアクセス出来る状態を維持したかったので、やり直しは諦める事としました。
何かしらのアイキャッチの設定が残っているみたいですから、取り敢えず それを削除出来ないか調べて見ることに。
検索してみるとそれっぽいの記事を発見
「テーマのための関数(functions.php)」に
$wpdb->query( ”
DELETE FROM $wpdb->postmeta
WHERE meta_key = ‘_thumbnail_id’
” );
を、記述するとアイキャッチ画像が削除出来るそうです。
あー。この記述を見た感じ、ユーザー名の変更が問題だったのかは分かりませんが、アイキャッチと画像の紐付けに問題があったのは確定っぽいですね。
まあ、取り敢えずこの方法で過去記事のアイキャッチを破棄したら「NoImage」画像は出てきたので良しとしましょう。
今回の件でデーターをエクスポートして復旧に使った際に変な事をしたらユーザー名を変更したくらいなので、確定情報かは分かりませんがユーザー名の変更しないようにした方が良さそうです。
取り敢えず、PHPとMySQLがアップデートされてWordPressのダッシュボードにログイン出来なかったり、色々エラーが出た時の対処法としてはWordPressでデータをエクスポートして新しいデータベースなどで再セットアップし、データインポートが手っ取り早い気がします。
PHPやMySQLを弄って元の状態に戻せるような人は、弄って元に戻せば良いと思います。
間違っている部分も多そうですが、以上がWordPressの復旧方法でした。
症状その2:PEARライブラリを読み込めない問題
おう・・・。
価格比較の検索結果が表示されていない。
と、気がついたのはWordPressにログイン出来ずに他に問題が無いか確認している時に総当りでチェックしていて、価格比較の検索結果が表示されていなかったので。
つまり、こう言うページの検索結果の部分が表示されてなかったのです。
うちのサイトってお酒の価格比較情報を表示するしかコンテンツが無いと言うのに、それが表示されないとなると存在の意味など無くなる!
と、言う事で、WordPressの方は一旦保留して、こっちの問題を解決する事に。
設定でエラー表示がされないように設定しており、サイトを見ただけでは原因が分からないので、取り敢えず確認用のフォルダを作って確認する事に。
価格比較を表示するページは途中まで表示されているから、問題が有るとすれば表示されていない辺りを調べる。
確認方法としては原始的で、問題が有りそうな場所をコメントアウトしていって正常に動いている場所と動いていない場所を洗い出す。
元々、PHPを知りたくて始めたと言う理由もある当サイトなので全部が全部パーツごとにPHPを書いてなんちゃってオブジェクト志向みたいな感じで構成されていない部分が多い当サイトですが、問題のある場所辺りは機能別にPHPファイルをインクルードしていたので意外と早くに原因のファイルが見つかる。
ページャーの表示など記述しているPHPファイルを、インクルードしてる記述をコメントアウトすると検索結果以外の個所は表示された!
うちでは価格比較の検索結果ページなどで、PEARライブラリのPager機能を使ってページャーを表示していますが、なぜかコレが機能していないっぽい。
問題の場所は大体分かった。
が、そうだと結論付けるまでには色々サイトを調べたり、htaccessに問題があるんじゃないかと設定を変更してみたりとしてみたが変な場所は無さそうだ。
この問題とは別の問題がhtaccessにあったので全くの無駄と言う事でも無いので良いとして、この時点では何が悪くて表示していないのかサッパリ分からない。
続けて調べる中で、Pager.phpを読み込んでいる「@require_once(“Pager/Pager.php”);」をコメントアウトすると、ページャー機能は無いものの価格比較の検索結果は1枚ページで表示されるようになる。
うん。Pager.phpを読み込んでないのは確定のようだ。
でも、これまで何の指定もせずに読み込んでいた「@require_once(“Pager/Pager.php”);」で読み込めない意味が分からない。
更に「phpinfo」や「Tera Term」で調べる事でPEAR自体はインストールされている事は分かったものの、だから余計に意味がわからない。
色々と調べた結果、PEARへのパスが通ってないだろうと言う結論には達したが、フォルダ内のhtaccessで指定しても何故か通らないになる。
ホント、意味不明だったので、ここかなり迷う事となるのですが、結果として問題のPHPファイルの最初に「set_include_path(‘/usr/share/pear’);」を記述する事で問題は解決しました。
php.iniやhtaccessとかで設定する事も出来るらしいけど、何かエラーになったりしたし、全体で設定する必要も無い気がするし、PHPファイルで設定した方が次にトラブルがあった時にも問題解決に時間がかからなそうだし、他に影響も与えないだろうと言う理由で、この様な対処としました。
何かphp.iniやhtaccessへの記述が間違っていてパスが通らなかった可能性は高いと思いますが、本音を言うとこの時には疲弊していたので面倒臭くて問題がなくなった この方法で妥協した感じです。
この問題の結論としては、サーバーのユーザー領域より上の階層で、アップグレード前まで設定されていたPEARへのパスが設定されておらずに各自でパスを通さないといけなくなったのだと思います。
サーバーのアップグレードなどで、PEARなどのライブラリが使えなくなった時には、取り敢えずPEARがインストールされているか確認し、パスを設定してあげると解決するかも知れません。
ちなみに「set_include_path(‘/usr/share/pear’);」の「/usr/share/pear」の部分は、うちのサーバーの設定なので「phpinfo」や「Tera Term」などでパスを調べて、ご自身のサーバーの位置を設定してあげて下さい。
症状3.本体サイトの検索フォームで複数ワード指定すると500エラーが発生する
本体サイトの左カラムに検索フォームが有りますが、実はこれで登録されているアイテムを検索する事が出来ます。
あまり、使われていないみたいですが、データベースでフラグ設定した完全に製造終了したと思われる商品以外は左カラムに有る検索フォームから検索出来ます。
さて、検索フォームで例えば「ドライプレミアム豊醸」と言うワードで検索すると検索出来るのに、「ドライ 豊醸」の様に半角で区切ると500エラーが発生する事が判明したので対策を開始。
何かしらの問題が有るようですが、調べ始めた時点では問題点が特定出来ませんでした。
間違っている部分も有るかも知れず責任が持てないため、詳しくは書きませんが色々調べてある程度の対策は完了。
まだ、改良の余地が有るので完全に問題解決とまでは言えませんが、現時点では問題なく対策が出来ていると思います。
何をしたかを問題ない部分で少し書くとするならSQLへのクエリの書き方を変更。
以前の書き方では、違う結果が返って来ることに気がつきクエリの書き方を変更した所、望む結果が返ってくるように・・・
書き方は違うけど、同じ様な事をリクエストしている様に見えて、全然違う結果が返ってくる事が有る様なので、クエリの書き方を見直してみると問題解決するかも知れません。
必要には事足りていますが、クエリの書き方に関してはもう一度調べなおしてみようと思います。
と、言う事である程度は修正出来ました。
まだ、修正した方が良い部分が沢山有りそうですが、取り敢えずは完了と言う事で。
もっと効率の良いソースの書き方などは山ほど有りそうですが、更新だけでも結構 手一杯なのでボチボチ勉強していきたいと思います。
結局、長いだけであまり役に立つ情報は無かったなと書き終えて思いましたが、少しでも何かの役に立てたなら幸いです。