Open10
isucon本phpメモ EC2の場合
-
AWSのアカウントを作っておく
-
以下のリンクからインスタンスを起動
選んだ項目
- キーペア(private-isu)という名前にした
- c7a.large
- セキュリティグループ
- http
- ssh 自分のPCから
詳細のパブリック IPv4 アドレスから、立ち上げたサーバーにHTTPでアクセス
しばらくはInternal Server Errorが出るが、じきにIscogramが表示される
初期はrubyが動いている
キーペアを登録してあり、 ~/.ssh/private-isu.pem
にあればsshでログインできる
ssh ubuntu@xxx.xxx.xxx.xxx -i ~/.ssh/private-isu.pem
これを見てPHPに切り替える
$ sudo systemctl stop isu-ruby
$ sudo systemctl disable isu-ruby
$ sudo rm /etc/nginx/sites-enabled/isucon.conf
$ sudo ln -s /etc/nginx/sites-available/isucon-php.conf /etc/nginx/sites-enabled/
$ sudo systemctl reload nginx
$ sudo systemctl start php8.3-fpm
$ sudo systemctl enable php8.3-fpm
一通りコマンドを打ち終わると動作していないと出る。
DB接続でコケている
2024/11/22 19:42:07 [error] 1982#1982: *74 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost' in /home/isucon/private_isu/webapp/php/index.php:55
Stack trace:
#0 /home/isucon/private_isu/webapp/php/index.php(55): PDO->__construct()
#1 [internal function]: {closure}()
#2 /home/isucon/private_isu/webapp/php/vendor/php-di/invoker/src/Invoker.php(74): call_user_func_array()
#3 /home/isucon/private_isu/webapp/php/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php(69): Invoker\Invoker->call()
#4 /home/isucon/private_isu/webapp/php/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php(60): DI\Definition\Resolver\FactoryResolver->resolve()
#5 /home/isucon/private_isu/webapp/php/vendor/php-di/php-di/src/Container.php(353): DI\Definition\Resolver\ResolverDispatcher->resolve()
#6 /home/isucon/private_isu/webapp/php/vendor/php-di/php-di/src/Container.php(136): DI\Container->resolveDefinition()
#7 /home/isucon/private_isu/webapp/php/index.php(80): DI\Contain" while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "yyy.yyy.yyy.yyy"
マニュアルにある通り、userとpasswordを設定したら表示できた。
// dependency
$container = new Container();
$container->set('settings', function() {
return [
'public_folder' => dirname(dirname(__FILE__)) . '/public',
'db' => [
'host' => $_SERVER['ISUCONP_DB_HOST'] ?? 'localhost',
'port' => $_SERVER['ISUCONP_DB_PORT'] ?? 3306,
'username' => 'isuconp',
'password' => 'isuconp',
// 'username' => $_SERVER['ISUCONP_DB_USER'] ?? 'root',
// 'password' => $_SERVER['ISUCONP_DB_PASSWORD'] ?? null,
'database' => $_SERVER['ISUCONP_DB_NAME'] ?? 'isuconp',
],
];
});
isuconユーザーでsshログインできるようになると楽なので設定する。
ubuntuユーザーで
cat ~/.ssh/authorized_keys
クリップボードコピー
isuconユーザーにスイッチ
sudo su - isucon
authorized_keysを設定
mkdir .ssh
cd .ssh
touch authorized_keys
vi authorized_keys
コピーした内容を貼り付け
開発マシンの.ssh/config
Host isucon
HostName xx.xx.xx.xx
User isucon
IdentityFile ~/.ssh/private-isu.pem
これを設定すると
ssh isucon
isuconユーザーでサーバーにログインできるようになる
PHP版からMySqlに環境変数をつかって接続する方法?
# 手順
sudo vi /etc/php/8.3/fpm/pool.d/www.conf
1. 次のコメントアウトをはずします
clear_env = no
2. 追記します
env[ISUCONP_DB_USER] = isuconp
env[ISUCONP_DB_PASSWORD] = isuconp
env[ISUCONP_DB_NAME] = isuconp
3. 再起動させます
sudo systemctl restart php8.3-fpm