好奇心に負けた後は

Dive into Code 2018-7月期生 エンジニアになれました

最近AWS漬けマグロ error 500 php

【目次】
 1.エラー原因
 2.解決方法
 3.今後の対策
 4.感想

【1.エラー原因】
きっかけは自社内のインフラ課題でAWSと連携しながらサーバーを立てるってやつで 基本的な設定はまあなんとか出来たんですが、いざソースコードを入れていきましょうってなった時にボロボロだったので自分の弔いのためにも書かせていただこうかなと、、

エラーが起こったのは自分のEC2で作成したIPアドレス/既存のコードファイルをダウンロードして既存の画面を表示させようってやつなんですが、まあ見事に表示しない。

server error 500

うん、、、
しょんぼり、、

【2.解決方法】
結論から書くと
 ①最初にwgetしたディレクトリが良くなかったのと
 ②define.phpが参照するファイルの設定が良くなかった
順に解説すると ①wgetした場所が悪かったのはダウンロードするディレクトリを間違えてしまい /var/www/html
に展開してたんですよ。でも、実際僕が今回使用していたWeb Serverは" nginx "の方で僕が間違えて勝手に" Apache "のDocumentRootに載せてしまっていたんです

お恥ずかしい、、

今回設定していた正しいDocumentRootは
/home/account1/server
の中をWeb表示の際は読み込むよって設定にしていたんです。

nginxの設定はserver.confって設定したファイルを使用していました

server{
listen 88;
server_name sample;
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;

client_body_temp_path /var/tmp/nginx;
#charset koi8-r;

location /{
    root /home/account1/server;
    index index.php index.html;
}

location /nginx_status{
    stub_status on;
    allow 127.0.0.1;
}

location ~ \.php$ {
    root /home/account1/server; ←ここで設定したphpファイルが読み込まれていくぅ
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
    include fastcgi_params;
    }

    location ~/\.ht{
    }

    location /favicon{
    }
}

自分で設定していたのにそれをすっとぼけて調査しているなんて愚の骨頂、、
大人しく正しいディレクトリに移動しました。

②これは後Siriだったんですが
どうやらメンター陣がこのまますんなり表示させてしまったらつまんないんじゃ、、?って事であえて設定を古いまま残しておいたらしいです。なんて事を、、(前の単元でもやってたのに覚えていない自分が悪い)

何はともあれ、まずはコンストラクタ部分を担っているであろうinit.phpの中身を覗いてみます

// ini_set('display_errors', 0);
↓
ini_set('display_errors', 1);

Web画面自体に表示させてしまいましょうというもの。上記の様にコメントアウトして数字を変えて書いておくとエラーがWeb画面に記載される様になります。

画面には以下の表示が

Fatal error: ------------ SQL STATE[HY000] [1045] Accsess denied for user ''@''(using 
password: YES) in /home/account1/server/hoge/app/db/db.php:7

あれ、スッゲー見覚えのある表示、これSQL画面でログイン出来なくてインストールしたての時パニくってたやつだどうやらここにヒントが続いているらしいよと

次はここ

 sudo vi /home/account1/server/hoge/app/db/db.php


 class DBAccess {
 private $_db_con = null;

 public function connect() {
  $dsn = 'mysql:host='. MYSQL_HOST .';dbname='. MYSQL_DB;
  $this->_db_con = new PDO($dsn, MYSQL_USER, MYSQL_PWD);
  $this->_db_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

実はphpはこのカリキュラムで触るのが初めてだけど
Java触ってる時のメソッドの書き方に似ているのと
Ruby触った時に散々頭抱えていたDBAccessはSQLと繋がる時に良く呼び出される物だって思い出した

そこまでわかったらさっきのinit.phpを読み進めると次は何か読み込んでいます、、

require_once("define.php");

あ、これは怪しいぞ、、define.phpを見に行くと

define("MYSQL_HOST", "ホスト名");
define("MYSQL_DB", "DB名");
define("MYSQL_USER", "ユーザ名");
define("MYSQL_PWD", "パスワード");

define("SITE_PATH", "/このファイルのルートパス/");

ぽいぽい。

ここの
MYSQL_USER
MYSQL_PWD
に自分がMySQLで作成した"DB名"でユーザ名とパスワードを確認すれば万事解決

mysql -u root -pでログイン後ユーザ情報を調べるSQLを叩く
mysql>SELECT * FROM mysql.user WHERE user = '自分で作成したユーザ名';
| Host      | User | Password
| ホスト名 | ユーザ名 | *21〜省略、暗号化された長ったらしいのが出ます |

ここの情報をdefine.jpに記載してあげれば完成。

【3.今後の対策】

  • エラーを吐いている場所は事前に把握しておくべき
  • 自分で作業したことは忘れない様にする
  • わからない時聞ける人がいる場合は粘りすぎず素直に聞く

【4.感想】
 エラーの発生原因がちょっとアホだったので参考にならないかも。