Open10

isucon本phpメモ EC2の場合

あかつかあかつか
  1. AWSのアカウントを作っておく

  2. 以下のリンクからインスタンスを起動

https://github.com/catatsuy/private-isu#ami

選んだ項目

  • キーペア(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
あかつかあかつか
あかつかあかつか
$ 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ユーザーでサーバーにログインできるようになる

miiyurickmiiyurick

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