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

2025-05-02 | カテゴリー: IT技術

記事のメイン画像

きっかけ

Laravelの学習をするために、Dockerを使ってnginx + php-fpmの環境をググった記事を参考に構築して動かしていたのだけど、nginxの設定ファイルについてほぼ理解していなかったので読んでみようと思いました。

感想

内容のハンズオン部分がなかなかバージョン古くて大変でした。
aws ec2に環境を作ってハンズオンしてみたのですが、そもそもcent osが終了していたので苦戦しました。
書籍の通りに進められないので、ググって書籍に紹介されているものとほぼ同様のことを再現してみました。
書籍の内容としては、nginxの様々な使い方を紹介しているのですが、Dockerでローカル環境を構築する程度なら必要ないという判断でセキュリティや性能など後ろ半分くらいの章はほぼ読み飛ばしました。
それでも、「nginx何それ?」の状態から「nginxぜんぜんわからん」の状態には持ってこれたかなという感じはします。

メモ

  • centos7はもうない
    • Amazon Linux 2023で代用
      • centosと同じ様にyumでパッケージをインストールするから
  • 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がインストールできなり
  • 書籍では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になっているので、追加した証明書をダブルクリック
          • 信頼 > 「この証明書を使用するとき」を「常に信頼」に変更

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 → ブラウザ に返す

© Copyright 2025 浅井 All rights reserved.