かあスレッド_バージョンアップ_EC2セットアップ
紫本を読みながらやってみる
ネットワーク構築
10.0.0.0/16のCIDRブロックでVPCを構築する
VPC->作成
アカウント作成時点ではデフォルトのVPCが用意されている
10.0.0.0/16でproduction-kir-threadを作成した
作ったブロックでをサブネットとして切り分ける
DBサーバーとかには分割しないので、1つで良い
public-subnet-web作った
サブネットをインターネットと接続する
Amazon VPCでは、サブネットをインターネットと接続するためにインターネットゲートウェイを用いる
サブネットと繋ぐのではなく、大枠のVPCのCIDRブロックに入り口を作るイメージ
作成
作成後にアクションから希望のVPCにアタッチ
ルートテーブルを作る
ネットワークにデータを流すためにルーティングする必要がある
VPCを作成するつとデフォルトのものが用意されている
このデフォルトのルートテーブルがどこのサブネットにに紐づいているかは詳細で確認可能
今回は上で作成したサブネットに紐づいている
設定について
https://scrapbox.io/files/66c7332cacc8ca001de9da2b.png
10.0.0.0/16に含まれるIP宛のパケットなら、転送する
この範囲外ならば破棄するという設定になっている
デフォルトゲートウェイをインターネットに向けて設定する
今回の目的は10.0.0.0/16をインターネットに繋ぎたいが現状だと繋げない
自分宛以外のものは破棄してしまうので
→自分宛以外のものをインターネットゲートウェイに転送するように設定する
これがデフォルトゲートウェイ(0.0.0.0/0)
ルーターを作成する
public-route-table
サブネットとして、上記で作ったものを関連づける
public-route-table>ルートから現状を確認。10.0.0.0/16が存在する
デフォルトゲートウェイを追加するので編集。
送信先を0.0.0.0/0にして、作ったインターネットゲートウェイをターゲットにする
これで完成
EC2構築
インスタンスの立ち上げ
code:メモ
Amazon Linux 2023 AMI
t2.micro(1 vCPU, 1GiB mem)
キーペア
新規に作った
ネットワーク設定
上で作ったvpcで設定する。
サブネットも上で作ったもの
パブリックIPの自動割り当てを有効化(これでないとインターネットからアクセスできない)
セキュリティグループを新規作成する
SG-kir-thread
他は一旦デフォで。
ストレージ
どうしよ
conohaはSSD 100GBらしい。潤沢
code:本番のストレージ状況
df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/vda2 99G 6.9G 88G 8% /
6.9GBしか使ってない
なるほど。30GiB割り当てでいいや
作った!
code:sshテスト
# 鍵をssh-addしておく
ssh ec2-user@xxx.xxx.xxx.xxx
~\_ ####_ Amazon Linux 2023 ~~ \_#####\
~~ \###|
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
🦆
さらぴんのサーバが完成
続きはlaravelのverupが終わったらアプリ配置(ver古いのおいてもしゃあないので)
24.8.24 laravelのバージョン調整が終わった
動作も問題なさそうなので、以下を行なってみる
nginx導入
mysql導入
かあスレッド配置
stg-kir-thread.siteをドメイン移籍してみる
参考
nginx導入
stgでもapache入れたんだった〜も〜
code:nginx container
# ローカルのver
root@b30d702e1014:/var/www/laravel_kirthread# nginx -v
nginx version: nginx/1.25.3
とりあえず現時点でのverを入れてみよう
code:nginx導入.sh
# nginx
## サーバーのパッケージを最新にしてからnginxを導入する
sudo dnf update
sudo dnf install nginx -y
## 起動と、enableでサーバーが再起動した時に自動でnginxも起動されるようにする
sudo systemctl start nginx
sudo systemctl status nginx
sudo systemctl enable nginx
# firewalld
## 導入と起動設定
sudo dnf install firewalld -y
sudo systemctl start firewalld
sudo systemctl status firewalld
sudo systemctl enable firewalld
## http, httpdからの通信許可
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
これでIPで接続できるようになるようだが、動かない
→AWSで作っているので、インバウンドルールの調整が必要である。
調整し、httpとhttpsをパブリックに公開させた。
PHPの導入
Remiリポジトリを有効化する
Remiリポジトリ
PHPや関連パッケージの最新バージョンを提供するサードパーティのリポジトリ
RedHat系のディストリビューションが置いているデフォルトのパッケージリポジトリはデータが古いことが多い。
今回はPHP8.2を入れたいので、サードパーティのものを使う
code:sh
sudo dnf install dnf-utils -y
エラーになった Amazon Linux 2023はRemiの対象外っぽい。
PHP8.2リポジトリの有効化
code:sh
# インストール可能なパッケージを見る
sudo dnf list --available php*
# 8.2を指定する
sudo dnf install php8.2
...
php -v
PHP 8.2.21 (cli) (built: Jul 2 2024 12:51:54) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.2.21, Copyright (c) Zend Technologies
with Zend OPcache v8.2.21, Copyright (c), by Zend Technologies
# 他関連するパッケージも入れる
sudo dnf install php-cli php-fpm php-mysqlnd php-zip php-devel php-pear php-xml php-gd php-mbstring php-curl php-json php-bcmath php-intl -y
先にPHP8.2を入れておけば、パッケージもそれに依存するものを入れてくれる。
Composer導入
code:sh
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
# パスを通す
sudo mv composer.phar /usr/local/bin/composer
# 確認
composer -v
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 2.7.8 2024-08-22 15:28:36
おっけい
mysql導入
code:sh
sudo dnf config-manager --enable mysql80-community
sudo dnf install mysql mysql-devel -y
GPGエラーに遭遇
code:error
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'dnf clean packages'.
Error: GPG check FAILED
キーをインポートしてからやる
code:sh
sudo dnf install mysql mysql-devel -y
OK
code:sh
mysql --version
mysql Ver 8.0.39 for Linux on x86_64 (MySQL Community Server - GPL)
# その他クライアントも導入
sudo dnf install mysql-community-server mysql-community-client mysql-community-devel
# 起動
sudo systemctl start mysqld.service
sudo systemctl status mysqld.service
ログインする
code:sh
# 初期PWは /var/log/mysqld.log に記載されている
mysql -uroot -p"xxx"
# 変更
ALTER USER 'root'@'localhost' IDENTIFIED BY '新パスワード';
laravelプロジェクトの配置
git導入
code:sh
sudo dnf install git -y
プロジェクトを配置する
サーバ内のどこに置くかは少し考えたほうがいい気がする
基本は、/var/wwwなのでそうしようか
code:sh
git status
fatal: detected dubious ownership in repository at'/var/www/laravel_kirthread'
sudo chown -R ec2-user laravel_kirthread/
# OK
git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
# 作業ブランチに移動して作業
git fetch origin upgrade-php:upgrade-php
git checkout upgrade-php
git status
composer install
php artisan --version
# Laravel Framework 11.21.0 動作した。
nginx側でconfファイルを作成する
code:/etc/nginx/conf.d/kir-thread.conf
server {
listen 80;
root /var/www/laravel-kirthread/backend/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
パーミッション調整
code:sh
sudo chown -R nginx:nginx /var/www/laravel-kirthread/
sudo chmod -R 755 /var/www/laravel-kirthread/storage/
sudo chmod -R 755 /var/www/laravel-kirthread/bootstrap/cache/
映らない 502 Bad Gateway
キャッシュクリアしてみる
code:sh
php artisan optimize:clear
cache ....................... 6.28ms DONE
compiled .............................. 0.79ms DONE
config ............................ 0.54ms DONE
events ........................ 0.47ms DONE
routes ......................................... 0.48ms DONE
views .................................... 0.18ms FAIL
RuntimeException
View path not found.
# エラーで止まった。storage直下にフォルダがないようなので自作すると動作した
mkdir -p storage/framework/sessions
mkdir -p storage/framework/cache/data/
mkdir -p storage/framework/views/
まだ映らない。nginxの設定が原因な気がする。
https://scrapbox.io/files/66c934e81bbf5e001cd26529.png
conf再調整
code:conf
# laravel-kirthreadになってたので直した
root /var/www/laravel_kirthread/backend/public;
# 名前がややこしいのでリネーム
cp kir-thread.conf laravel_kirthread.conf
php-fpmの起動
code:sh
sudo systemctl start php-fpm.service
エラーログが出るようになった
nginxのエラーログ
code:log
2024/08/24 01:45:24 crit 32569#32569: *30 connect() to unix:/run/php/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 118.106.117.174, server: example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php-fpm.sock:", host: "18.177.140.139" code:www.conf
# 変更
;listen = /run/php-fpm/www.sock
listen = /var/run/php-fpm/php-fpm.sock
# コメント解除し、nobody -> nginxに変更。
listen.owner = nginx
listen.group = nginx
nginxのconfも一緒に変更
code:laravel-kirthread.conf
# fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
エラーが変わった。
次のエラー
https://scrapbox.io/files/66c93cb1982dd3001c5860da.png
よくあるやつ。envじゃないか?
nginx側のアクセスログは流れる。エラーログには記載が出ない。
envを作った。エラー画面になってくれた
laravel側のエラー
code:log
laravel.log" could not be opened in append mode: Failed to open stream: Permission denied
パーミッション関連を付与してやる
code:sh
sudo chmod 777 -R storage
chmod 777 bootstrap/cache -R
鍵のエラー
code:sh
No application encryption key has been specified.
# key generateするとエラーになった
php artisan key:generate
ErrorException
file_get_contents(/var/www/laravel_kirthread/backend/.env): Failed to open stream: Permission denied at vendor/laravel/framework/src/Illuminate/Foundation/Console/KeyGenerateCommand.php:100
# envの所有権を調整して成功
sudo chmod 777 -R .env
データベースの構築
code:sql
-- mysqlにログインしてから。
CREATE DATABASE kir_thread;
.env側も調整
code:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=kir_thread
DB_USERNAME=
DB_PASSWORD=
こことiframelyの鍵だけでいい
マイグレーションする
$ php artisan migrate
動いた
うれしー
https://scrapbox.io/files/66c94034b1c880001d159aea.png
次にやること
ドメイン移籍のテスト ✅
ssl証明書の発行
データ移行する(ストレージをケチりたい気持ちが多少あるため画像はどうしようか...) ✅
ドメイン移籍する
stg-kir-threadを持っているので、これをRoute53に登録してインスタンスに付与したい
正しくはドメイン移管である
Route53 > 開始する > ドメインを移管
ドメイン移管可否を確認するため、入力する欄がある
まずはconoha側でロックを外す。
無料で取ったものなので移管できないらしい....................
plusmash.blogもいけないのか!
kir-thread.siteはいけるのでこっちでやってしまおう
移管ロックを解除
できるようになった
https://scrapbox.io/files/66c95a8bd52e66001d9659ee.png
Route53側
認証コード入力
AuthCodeのことだろう。
住所とか登録
料金の認証 25ドル(3,609円)
移管リクエスト送信。これで数日待つらしい
30分後くらいに申請落ちの連絡が来た。(トランスファー申請不承認)
上記ドメインのトランスファー申請につきまして、下記いずれかに該当する
ため申請を不承認といたしました。
1.該当URLより不承認処理が行われた
2.Whois情報公開代行サービスの設定が行われている
3.ドメインの契約終了日まで7日以内(JPドメインのみ)
4.期限内に承認処理が行われなかった
再度申請を行う場合は、上記事項に該当しないことを確認した上で申請を
行ってください。
思い当たりそうなものを調整する
whois代行設定をOFFにした
これでもう一回申請
20分後申請通った。
conohaから来たページで、ドメイン移管の承認フォーム→完了。
さらに20分後くらいに承認処理の通知が来た。
これでAWSからの連絡を待つ。
10分後くらいに来た。
Verify your email address for kir-thread.site.
メールに書かれたurlにアクセスしてverifiedする
さらに来る
Your email address was verified for Amazon Route 53 domain registration.
まだRoute53側では移管の進行中である
20分後メールが届いた
Transferring kir-thread.site to Amazon Route 53 succeeded
成功ステータスになった。
EIPの取得をする
取っとくか!
取得→関連付けでEC2インスタンスに割り当てた。
Route53でDNS設定をする
ホストゾーンを作成
自動でネームサーバー設定のレコード(NSレコード)が作られる
SOAも作られている
権威サーバーを定義する役割を持つ。
必要なDNSレコードを追加する
Aレコードを作って 取得したEIPアドレスを紐づける。
nginxの設定
confファイルのserver_nameをkir-thread.siteに変更し、リスタートをかければ良い。
データ移行
DB
tableplusで接続してインポートした。
画像
アイコン、リアクション、postに添付したデータ
storage/publicのフォルダを移行すれば良い
storageフォルダ周りの権限が変
code:sh
storage/logs" and it could not be created: Permission denied
ec2-userに権限を渡す。
code:sh
sudo chown -R ec2-user:nginx /var/www/laravel_kirthread/backend/public
sudo chmod -R 755 /var/www/laravel_kirthread/backend/public
php artisan storage:link # 動作
説明
-R
再起的変更(ディレクトリ内のファイルにも全て同じ変更をする)
ec2-user:nginx
ec2-userを所有者、nginxをグループとして指定する
所有者とグループに属するプロセスがそのディレクトリを使えるようになる
storage直下に、appを配置する
これで移行できた。
けど権限がまだ変
laravel自身に作らせると(画像アップして)なぜか所有者がapacheになる
code:log
total 0
drwxr-xr-x. 4 apache apache 34 Aug 24 05:08 .
drwxr-xr-x. 2 apache apache 36 Aug 24 05:08 icons
drwxr-xr-x. 3 apache apache 20 Aug 24 05:03 ..
drwxr-xr-x. 2 apache apache 35 Aug 24 05:03 uploads
謎だ
code:sh
ps aux | grep php-fpm
root 33543 0.0 2.5 436844 24532 ? Ss 01:48 0:00 php-fpm: master process (/etc/php-fpm.conf)
apache 33549 0.0 4.8 438036 47108 ? S 01:48 0:01 php-fpm: pool www
apache 34696 0.0 4.3 437872 42608 ? S 02:04 0:02 php-fpm: pool www
apache 44029 0.0 4.2 437784 41080 ? S 04:44 0:00 php-fpm: pool www
apache 47819 0.1 4.2 437660 41436 ? S 05:02 0:00 php-fpm: pool www
ec2-user 49625 0.0 0.2 222312 2056 pts/0 S+ 05:12 0:00 grep --color=auto php-fpm
php-fpmがapacheとして起動している。
php-fpmの設定を調整すればいいらしい。
code:www.conf
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
リスタートすると治った
code:sh
ps aux | grep php-fpm
root 49928 0.6 3.0 436844 29556 ? Ss 05:14 0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 49929 0.0 0.8 436844 8128 ? S 05:14 0:00 php-fpm: pool www
nginx 49930 0.0 0.8 436844 8128 ? S 05:14 0:00 php-fpm: pool www
nginx 49931 0.0 0.8 436844 8128 ? S 05:14 0:00 php-fpm: pool www
nginx 49932 0.0 0.8 436844 8128 ? S 05:14 0:00 php-fpm: pool www
nginx 49933 0.0 0.8 436844 8128 ? S 05:14 0:00 php-fpm: pool www
ec2-user 49935 0.0 0.2 222312 2068 pts/0 S+ 05:15 0:00 grep --color=auto php-fpm
もう一回フォルダ削除→laravelでアップロード
code:sh
ls -lat
total 0
drwxr-xr-x. 3 nginx nginx 21 Aug 24 05:18 .
drwxr-xr-x. 3 nginx nginx 20 Aug 24 05:18 ..
drwxr-xr-x. 2 nginx nginx 35 Aug 24 05:18 uploads
nginxで作られるようになった。
とりあえず
laravel側で操作してフォルダが作れるものはそっちで作る。
その後、sudo chmod -R 777 storage/で替えた。
移管した
暫く時間が経っても、まだkir-thread.siteにアクセスすると昔のvpsに遷移する。
DNSキャッシュの問題の可能性があるのでもう少し待つ
ドメイン移管の仕組み
ドメインの管理権限を別のレジストラに移すこと。
今回の場合、conoha -> AWS Route 53
移管が完了すると
DNS設定や管理操作が全て新しいレジストラに移る。
新しいレジストラに設定されたDNSサーバーが有効になり、旧DNSサーバーは無効となる
そのため移管後は旧レジストラで設定していたIPなどは参照されなくなる。
新しいレジストラで設定したDNSレコードがインターネット全体に反映されると、ドメインにアクセスが発生した場合新しいAWSインスタンスに向かうようになる。
Route 53 ホストゾーンについて
ドメイン/サブドメインのトラフィックをルーティングできる
パブリックホストゾーンでインターネット上のルーティング定義
プライベートホストゾーンで、VPC内のルーティングを定義する
直らないので眺めてた
https://scrapbox.io/files/66c9a8c43d7b53001c22f98b.png
ネームサーバー登録がconohaのままである
Route 53 > ホストゾーン > kir-thread.site のNSレコードに登録されているものをここに書き写してみる。
ns-xxx.awsdns-xx.netとか。4つあったので4つ書いた。
1時間くらいすると反映されたかも?PCはまだだけど、スマホで見るといけた
デプロイテスト
gitでpullして反映されるかどうかをチェックする
リモートブランチを常に参照するようにしたい。
code:sh
# pullするとキャッシュデータでpermission deniedになった。
# とりあえず
sudo chown -R nginx:nginx storage/logs/
sudo chown -R nginx:nginx storage/framework/
sudo chown -R nginx:nginx bootstrap/cache
紐づける
code:sh
git checkout upgrade-php
git branch -u origin/upgrade-php
branch 'upgrade-php' set up to track 'origin/upgrade-php'.
# 確認
git branch -vv
コードが反映できた。
SSL証明書の発行
Let's Encryptではなく、AWS Certificate Managerを使ってみたい
ACMのページで証明書をリクエスト
DNS検証, RSA2048で発行した。
ステータスが保留中の検証となった。少し待つ?
待っても変わらないので、Route 53でレコードを作成でレコードを作ってみた
https://scrapbox.io/files/66c9b8614d7863001d57f51f.png
発行済み✅になった!
? 作ったはいいけど
ACMで発行する証明書はClondFront, ALBに関連付けするのが基本の証明書らしい...
なんじゃそりゃ
じゃあLet's Encryptで作ろう
code:sh
sudo dnf install certbot -y
# nginxの設定を自動で行ってくれるプラグインも入れておく
sudo dnf install python3-certbot-nginx -y
# 対話式で手続き
# 自動更新されるようにする。cronが入ってなかったので、入れる
sudo dnf install cronie -y
sudo systemctl enable crond
sudo systemctl start crond
sudo systemctl status crond
# crontab
0 3 * * * /usr/bin/certbot renew --quiet
できた!
コード反映する時
$ git pull origin main
で良い
画像リサイズライブラリ導入でやったこと
ImageMagickが必要になるので併せて調整する必要がある
git pullして
composer installして
code:sh
# 依存するライブラリを入れる
sudo dnf install ImageMagick ImageMagick-devel
sudo dnf install php-cli php-devel php-pear # いらない場合もある
sudo dnf install gcc # いらない場合もある
# ピクルでimagickの拡張をインストール
sudo pecl install imagick
# php.iniにimagick拡張を読み込むため、有効化させる
echo "extension=imagick.so" | sudo tee /etc/php.d/20-imagick.ini
# nginx/php-fpmリスタート
sudo systemctl restart php-fpm
sudo systemctl restart nginx
# チェック
php --ini | grep imagick
/etc/php.d/20-imagick.ini,
php -r 'phpinfo();' | grep imagick
/etc/php.d/20-imagick.ini,
imagick
imagick module => enabled
imagick module version => 3.7.0
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel
imagick.allow_zero_dimension_images => 0 => 0
imagick.locale_fix => 0 => 0
imagick.progress_monitor => 0 => 0
imagick.set_single_thread => 1 => 1
imagick.shutdown_sleep_count => 10 => 10
imagick.skip_version_check => 0 => 0
アップロードできる画像のMAXサイズを増やす
リサイズできるようになったので、こっちで絞る必要がなくなった
code:/etc/nginx/conf.d/laravel-kirthread.conf
client_max_body_size 20M;
code:/etc/php.ini
memory_limit = 128M
upload_max_filesize = 10M
post_max_size = 12M
これでリスタートをかければ良い