こんぶにのブログ

エンジニアという職業を通して学んだことを発信するブログです。

インフラド素人がwindows10にて、AWS EC2を使ってphpが動く環境を作成してみた。

EC2を起動

ここは問題なし。 キーペアは作成か、選択しておくと楽。

EC2へSSH接続

私のPCはwindowsなのでOpenSSHを使って接続する必要がある。
以下を参考にした。

OpenSSH を使用して Windows から Linux インスタンスに接続する - Amazon Elastic Compute Cloud

自分の場合はOpenSSHにパスが通ってなかったので、インストール場所を確認して、パスを通した。

インスタンスの起動時、大事なことはEC2起動時にキーを作成するか、選択すること。
.pemの形式で今回はキーペアを作成した。
これが自動的に自分のPCにDLされる。
これが秘密鍵sshでEC2に接続するときにこれを指定する。大事なのでなくさない。
で、公開鍵の方が勝手にEC2の~/.ssh/authorized_keysに書き込まれる。(もしEC2起動時にキーペアを指定しなければ、自分で追加する必要がある。)
その場合は秘密鍵の方から、公開鍵を確認できる。

パブリックキーの説明 - Amazon Elastic Compute Cloud

実際に接続するときは、pemキーの権限を変更する必要があるみたい。
windowsの場合はmacよりもはるかにめんどい。がんばった。

🐚【Windows PowerShell】SSH接続する際にパーミッションエラーが発生した場合の権限変更 #Windows - Qiita

コマンドラインで使う「~」は何か?ディレクトリを指定するときの小さな波線(チルダ)の役割

あとはインスタンスに接続、ってところからSSHクライアントを選んで、コマンドをコピペできる。
その際にpemのディレクトリだけは自分のものに変更する必要あり。

amazon-linux-extras

amazon-linux-extrasを使って、phpをインストールしていく。
コマンドには色々あるが、この時点では list, install,をメインで使うことになりそう。
amazon-linux-extras listとすればインストールできる色々なものが表示される。
これだといっぱいありすぎるので、amazon-linux-extras list | grep phpとオプションを付けて検索する。

$ amazon-linux-extras list | grep php
 66 †php8.1                   available    [ =stable ]
 68 †php8.2                   available    [ =stable ]

こんな感じで表示される。
これをインストールする。
sudo amazon-linux-extras install -y php8.2
-yコマンドについては、以下。

-y オプションを指定すると、確認メッセージを表示せずに更新をインストールします。インストール前に更新を検査する場合は、このオプションを省略できます。

更新があるかどうかをチェックするコマンドのよう。
また、sudoと付けたのは今rootユーザではないから。

と、ここまでやって思った。
「先にrootユーザに切り替えて作業したほうがいいな」

rootユーザに切り替える

こんな感じである通り、まずはrootで設定するのが定石っぽい。
teleporter.hateblo.jp 以下でrootユーザに変更。
sudo su -
パスワードを変更する必要があるようなので変更。
passwd
パスワード入力画面になるので二回入力。
今回は適当にrootとした。(本番では絶対ダメ)

この状態で、ec2-userに対して、rootと同じ権限を付与してみる。

EC2初期設定 よく使うコマンド (ec2-user パスワード追加) | Cloud CIRCUS Dev Blog

作成したユーザーにroot権限を持たせる設定 | インフラエンジニアの技術LOG

EC2初期設定 よく使うコマンド (ec2-user パスワード追加) | Cloud CIRCUS Dev Blog

Amazon Linux - Amazon Elastic Compute Cloud

Amazon Linux 2023 での LAMP のインストール - Amazon Elastic Compute Cloud

諸々のインストール

yum install -y php-devel  
yum install -y php-gd

php-fpmを有効化する

systemctlというのがLinuxにはあって、そこでサービスとして、php-fpmを実行しているらしい。
基本がわからな過ぎると、分かったのか分からないのかも分からないまま、こうして二次情報を転々とする羽目になる。
Linuxの勉強をちゃんとしようと思った。
systemctl list-unit-files -t service | grep disabled と検索してみると、たしかにphp-fpmがあった。こいつをenabledにしよう。
systemctl enabled php-fpm
サービスも開始。
systemctl start php-fpm

nginxをインストールする

またまたamazon-linux-extrasの力を借りる。
amazon-linux-extras install nginx1
またまたsystemctlの力で動いているようなので、enabledにしてあげる。
systemctl enabled nginx
systemctl list-unit-files -t service | grep enabled
にいることを確認。
nginx -vでバージョンが表示されることを確認。
ここでnginxを起動する。そうすれば、例のあのページが返ってくるはずだ。
systemclt start nginx
インスタンスのパブリック IPv4 DNSにアクセスしてみる。


来た!!!!やっと報われた…。ここからが本番。

ちなみに、初めて知ったのだがcurlで動作確認もできるらしい。
curl パブリック IPv4てな感じ。
すると、

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>

こんなのが画面に表示。
curlとすると、GETでリクエストを送ってくれて、レスポンスまで受け取ってくれるということみたい。
これは楽だし、色んな事に使えそう。今までcurlなんかLaravelインストールするときくらいしか見たことなかった。

qiita.com

nginxとphp-fpmの連携

ここまでやってきたはいいんだけど、もうちょっと足りないところがある。
それはphp-fpmとnginxの連携。
正直、イマイチこの二つの関係性が分かってない。
Apachephp関係特に何もしなくても読み込んでくれるじゃん?なんでfpmが必要なの?
と未だに思っている。
色々読んだ感じだと、
Apacheの場合
Apacheがリクエスト受け付け、リクエストのパスのphpファイルに対して、Apacheの中に組み込まれているモジュール版phpを実行して動的にファイル作成
nginxの場合
nginxがリクエストを受け付け、リクエストのパスのphpファイルに対して、php-fpmにphpの実行を依頼する、php-fpmがphpを実行して動的にファイル作成
という感じなのかな。。。
う~ん、ちゃんとnginxとfpmを勉強しないと良く分からない。
実行順序とか、中で何をやっているのかというのが見えてこないからイマイチ理解した感じが無いんだよね。
とはいえ、どこで勉強するんだ??
公式ドキュメント…?
ま、ともかく動かしてみて分かることもあるはず。
と思って色々5時間くらいやった。
結果、動いた。

すっげえ長かった。
やっぱ、どんだけ人の記事読んでも根本と基本を理解できてないから、「ここをこうしたらこうなるだろう」っていうのが分からない。
結果、膨大な時間を使った。
以下のコマンドを何度も打った。

systemctl status php-fpm -l
systemctl restart php-fpm
systemctl restart nginx

今回はfpmとnginxをTCPで接続した。
最終的に以下のような感じになった。変更した部分のみを記述。
あんなに時間をかけたのにそこまで変更点はないという。
あるある。
/etc/nginx/conf.d/ php-fpm.confの記述

# PHP-FPM FastCGI server
# network or unix domain socket configuration

upstream php-fpm {
        server 127.0.0.1:9000;
}

/etc/nginx/nginx.conf

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/アプリ名/webroot;
        index index.php

        access_log /var/www/アプリ名/logs/access.log;
        error_log /var/www/a/アプリ名gs/error.log;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
          try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
          try_files $uri =404;
          include fastcgi_params;
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_intercept_errors on;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
        }
    }

/etc/php-fpm.d/www.confの変更点

; RPM: apache user chosen to provide access to the same directories as httpd
user = 新しく作ったシステムユーザ(特に特別な権限なし)
; RPM: Keep a group allowed to write in log dir.
group = 新しく作ったユーザグループ(特別な権限なし)

listen = 127.0.0.1:9000

今のところ、システムユーザの作り方とかどのくらいの権限を付与すればいいのかとかあんまりわかってない。
なので適当に作ってとりあえずうごかした。
あとでちゃんと作る予定。

インストール - 4.x

nginx で PHP を動かす #php-fpm - Qiita

nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する #PHP - Qiita

nginxとphp-fpmの設定 #PHP - Qiita

Nginxが404notfoundエラーを出してくる時の対処 #Python3 - Qiita

composer

Composer

パーミッション

drwxr-xr-x 2 root root 76 Oct 15 02:50 bin -rw-r--r-- 1 root root 2103 Oct 15 02:50 composer.json -rw-r--r-- 1 root root 214309 Dec 28 06:09 composer.lock drwxr-xr-x 3 root root 210 Dec 28 06:09 config -rw-r--r-- 1 root root 649 Oct 15 02:50 index.php drwxrwxrwx 2 root root 58 Dec 28 08:21 logs -rw-r--r-- 1 root root 207 Oct 15 02:50 phpcs.xml -rw-r--r-- 1 root root 234 Oct 15 02:50 phpstan.neon -rw-r--r-- 1 root root 1029 Oct 15 02:50 phpunit.xml.dist drwxr-xr-x 2 root root 22 Oct 15 02:50 plugins -rw-r--r-- 1 root root 1878 Oct 15 02:50 README.md drwxr-xr-x 2 root root 22 Oct 15 02:50 resources drwxr-xr-x 6 root root 87 Oct 15 02:50 src drwxr-xr-x 8 root root 86 Oct 15 02:50 templates drwxr-xr-x 4 root root 76 Oct 15 02:50 tests drwxr-xrwx 5 root root 48 Oct 15 02:50 tmp drwxr-xr-x 30 root root 4096 Dec 28 06:09 vendor drwxr-xr-x 6 root root 103 Oct 15 02:50 webroot

sudo chmod -R 777 /var/www/アプリ名/tmp sudo chmod -R 777 /var/www/アプリ名/logs book.cakephp.org

gitをインストール

sudo yum install git-all commitしてpushしよう、と思うとごちゃごちゃ言われて無理だった。
アクセスキーを使ってhttpsで接続しようとしてもうまく行かない。
う~ん・・・ってことでssh接続をした。
結構簡単。

vscodessh remoteでサーバに接続

今のままだと、ローカルで動作確認→push→merge→サーバでpullみたいな手順を踏まないと開発できないので面倒ってことで、
直接サーバの中でつないで動作確認を出来るようにした。
ここは簡単だった。
【AWS】EC2インスタンス作成~VSCodeでRemote-SSH接続するまで Output48