「nginx実践ガイド」をすこし読んでみた

きっかけ
Laravelの学習をするために、Dockerを使ってnginx + php-fpmの環境をググった記事を参考に構築して動かしていたのだけど、nginxの設定ファイルについてほぼ理解していなかったので読んでみようと思いました。
感想
内容のハンズオン部分がなかなかバージョン古くて大変でした。
aws ec2に環境を作ってハンズオンしてみたのですが、そもそもcent osが終了していたので苦戦しました。
書籍の通りに進められないので、ググって書籍に紹介されているものとほぼ同様のことを再現してみました。
書籍の内容としては、nginxの様々な使い方を紹介しているのですが、Dockerでローカル環境を構築する程度なら必要ないという判断でセキュリティや性能など後ろ半分くらいの章はほぼ読み飛ばしました。
それでも、「nginx何それ?」の状態から「nginxぜんぜんわからん」の状態には持ってこれたかなという感じはします。
メモ
- centos7はもうない
- Amazon Linux 2023で代用
- centosと同じ様にyumでパッケージをインストールするから
- Amazon Linux 2023で代用
- nginxのバージョン
- 書籍は1.11.8だが、1.26.3で進める
- /etc/selinux/configのSELINUX=の設定値
- 書籍ではdisabledにするよう指示があるが、Amazon Linux 2023ではほぼdisabledと同等の動作をするpermissiveがデフォルト値で設定されているので、設定変更しないで進める(後で不都合が出るようならdisabledにする)
- Amazon Linux 2023のnginxのインストール手順は書籍と異なる
- Amazon Linxt 2023にyum-cronがインストールできなり
- dnf-automaticというのを使う
- 書籍ではcentosに対してファイアウォールでhttpを受けつけられるようにポートを開ける手順があるけど、ec2ではインスタンスの作成時にhttp及びhttpsの受付をできるようにするチェックボックスで有効化できているので設定不要
- Jekyllのインストールでエラーになる。
- 下記コマンド実行
sudo dnf groupinstall "Development Tools"
sudo dnf install gcc-c++ make openssl-devel libffi-devel ruby-devel
- ruby周りの操作手順解説が不親切。 jekyll build -d /www/dir/でエラーになるので、下記コマンドを先に実行しておく。
sudo bundle install
wordpressのインストール手順は書籍の内容が参考にならない
php-mysql じゃなくて php-mysqli をインストールする
php-fpmは5.4じゃなくて最新(8.4)が入った
- 設定ファイルは/etc/php-fpm.iniではなく、/etc/php-fpm.conf
wordpressのダウンロードは wget https://ja.wordpress.org/latest-ja.tar.gz でインストーラを落としてくる
nginxが起動しなくなったら
- sudo nginx -t で理由が確認できる
unix socketのパスを変更した場合は、指定したパスにsocket用のファイルをtouchコマンドで作成する
- chmod 660 ファイル名とchown nginx ファイル名 で権限を設定する
「Python(uWSGI)でtracを動かす」の章は飛ばした
- uWSGIを使うことは現状なさそうなので
RubyでRedmineを動かすの章も手順通りに進まなかったので断念。別の機会にやりたい
秘密鍵の作成
- sudo openssl genrsa -out your-server.key -aes128 2048
証明書を使ったSSL/TLS対応は、証明書の取得に使うLet's Encryptがawsのデフォルトのdomainをブラックリストに入れている為実施できず
正式な証明書の発行ができない代わりに、オレオレ証明書を発行してSSL/TLS対応してみる
- 参考記事 https://qiita.com/ohakutsu/items/814825a76b5299a96661
- 秘密鍵(pem)のパスフレーズは不要なので、設定してしまった場合は解除しておく
- sudo openssl rsa -in /etc/nginx/ssl/privkey.pem -out /etc/nginx/ssl/privkey.pem
- nginx側の設定だけだと、httpsで開いた時に保護されていない通信と出てしまう
- scpコマンドで証明書(crt)をローカルに持ってきてダブルクリックで登録する
- キーチェーンアクセス > システム > 名前欄がcommon nameになっているので、追加した証明書をダブルクリック
- 信頼 > 「この証明書を使用するとき」を「常に信頼」に変更
- キーチェーンアクセス > システム > 名前欄がcommon nameになっているので、追加した証明書をダブルクリック
- scpコマンドで証明書(crt)をローカルに持ってきてダブルクリックで登録する
ChatGPTに質問したら得られた回答の、nginx.confの内容と照らし合わせた実際のリクエストに対する処理の流れがわかりやすかったので残しておきます。
連携の流れ(例:http://backend.local/login にアクセス)
1 ユーザーがブラウザでURLにアクセス(* 例:http://backend.local/login)
2 Nginx がリクエストを受け取る
3 Nginx が /login に該当する静的ファイルがないか確認
→ なければ /index.php にルーティング(Laravelの場合)
4 location ~ .php$ { ... } にマッチして、PHP-FPM に処理を渡す
5 Nginx は fastcgi_pass php:9000; で、PHP-FPM に接続
6 SCRIPT_FILENAME を含むパラメータを使って、「/var/www/backend/public/index.php を実行してください」と依頼
7 PHP-FPM が Laravel の index.php を実行
8 Laravel がルーティング設定(routes/web.php)に従って /login を処理
9 生成されたHTMLを PHP-FPM → Nginx → ブラウザ に返す