Dockerで作る開発環境:nginxの導入

スポンサーリンク
Dockerで作る開発環境:nginxの導入 ノウハウ
Dockerで作る開発環境:nginxの導入
この記事は約10分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、dockerで構築した開発環境において、nginxを導入した手順をご紹介します。

スポンサーリンク

実行環境

この記事は、特定の開発環境を前提として書かれています。もし興味がある場合は、その開発環境を構築するための説明が書かれている記事を参考にしてください。該当記事は下記になります。

ただ、この記事で紹介している修正内容がたくさんあるので、その修正を反映した最新版のプログラムをダウンロードして、参照することをおすすめします。該当のプログラムの詳細については、下記のページで確認できます。

背景

PHP-FPMとNginxを使用する理由は、高速かつ安定したWebサイトの提供が可能であるためです。

まず、PHP-FPMは、FastCGIプロトコルを使用してPHPの実行を管理するためのプログラムです。これにより、PHPの処理がApacheのモジュールモードよりも高速になります。また、PHP-FPMは、Apacheのmod_phpと比較してメモリ使用量が少なく、負荷分散機能をサポートするなどの機能があります。

次に、Nginxは、高速で軽量なWebサーバーで、多くの接続を処理することができます。Apacheよりもメモリ使用量が少なく、負荷分散機能が内蔵されているため、Webサイトのパフォーマンスを向上させることができます。

一方、Apacheは、広く使用されているWebサーバーで、多くの機能が内蔵されているため、柔軟性が高く、設定が容易です。ただし、ApacheはプロセスベースのWebサーバーであり、多数のリクエストを処理する場合には、メモリ使用量が増加し、パフォーマンスが低下することがあります。

つまり、PHP-FPMとNginxを使用することで、高速で軽量なWebサイトを実現できますが、Apacheを使用する場合でも、適切な設定を行うことで高速なWebサイトを提供することができます。ただし、負荷が高い場合には、ApacheよりもPHP-FPMとNginxの組み合わせの方が優れたパフォーマンスを発揮する場合があります。

なので、先日WEBサーバとPHPを分離したので、nginxを導入してみました。

ディレクトリ構造

ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新、削除になります。

.
├── LICENSE
├── Makefile
├── README.md
└── app
    ├── apache-exporter
    ├── compose.yml
    ├── flyway
    ├── grafana
    ├── influxdb
    ├── k6
    ├── memcached
    ├── memcached-exporter
    ├── php-fpm
    ├── php-fpm-exporter
    ├── mongo
    ├── mysql
    ├── mysqld-exporter
    ├── nginx
    │   ├── Dockerfile
    │   └── default.conf
    ├── prometheus
    ├── schemaspy
    ├── web
    └── xhgui

compose.yml

下記の赤字内容でファイル(compose.yml) 67-78 行目に追加します。

  nginx:
    build: ./nginx
    container_name: nginx
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8081:80
    depends_on:
      - php-fpm
    networks:
      - net

nginx/Dockerfile

下記の内容で新規ファイル(nginx/Dockerfile) を作成します。

FROM nginx:1.24-alpine

nginx/default.conf

下記の手順で新規ファイル(nginx/default.conf) を作成します。

server {

    listen 80 default_server;
    listen [::]:80 default_server;

    server_name localhost;

    root /var/www/html;
    index index.php index.html;

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

    location ~ \.php$ {
        #fastcgi_keep_conn on;
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

}

動作確認

下記のコマンドを実行して、サービスを起動します。

make setup

ブラウザで「http://localhost:8081/Welcome」にアクセスして、「Welcome to CodeIgniter!」の画面が表示されていれば成功です。

解説

nginxについて

Nginxは、高速かつ軽量なWebサーバーおよびリバースプロキシソフトウェアです。主にLinux系のオペレーティングシステムで使用され、多数の同時接続を処理することができます。

Apacheと比較して、メモリ使用量が少なく、スレッドベースの設計を採用しているため、多数のリクエストを処理する場合にも高いパフォーマンスを発揮します。また、リバースプロキシとして使用することで、複数のWebサーバーの負荷分散を行うことができます。

HTTPやHTTPSをはじめ、メールプロキシやTCP/UDPのプロキシなど、さまざまなプロトコルをサポートしています。また、フル機能の負荷分散機能を提供しており、サーバーの負荷分散やフェイルオーバーを簡単に実装することができます。

Nginxの設定は、Apacheに比べて直感的でシンプルであり、軽量な静的コンテンツの配信においても高い性能を発揮します。しかし、動的なWebアプリケーションにおいては、PHP-FPMなどのFastCGIプロセスマネージャーと連携して使用することが一般的です。

オープンソースであり、無料で利用することができます。そのため、多くのWebサイトで使用され、高い信頼性とパフォーマンスを発揮しています。

default.conf

server {

    listen 80 default_server;
    listen [::]:80 default_server;

    server_name localhost;

    root /var/www/html;
    index index.php index.html;

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

    location ~ \.php$ {
        #fastcgi_keep_conn on;
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

}

下記に各設定を説明しています。

  • listen 80 default_server;
    • ポート80番でのリクエストを受け付けることを指定します。
    • default_serverを指定することで、Nginxが複数の仮想ホストを持つ場合でも、デフォルトの仮想ホストとして使用されることを示します。
  • listen [::]:80 default_server;
    • IPv6アドレスでのリクエストを受け付けることを指定します。
  • server_name localhost;
    • この仮想ホストが使用するドメイン名を指定します。
    • この例では、localhostという名前が指定されています。
  • root /var/www/html;
    • この仮想ホストのドキュメントルートのパスを指定します。
    • この例では、/var/www/htmlディレクトリがドキュメントルートになります。
  • index index.php index.html;
    • ディレクトリのインデックスファイルとして優先的に使用するファイルを指定します。
    • この例では、index.phpおよびindex.htmlが優先的に使用されます。
  • location / { ... }
    • ドキュメントルート配下のリクエストに対する処理を定義します。
    • try_filesディレクティブによって、リクエストされたファイルが存在しない場合は、同じ階層のディレクトリを探索して存在するファイルを探し、最終的にindex.phpを呼び出します。
  • location ~ \.php$ { ... }
    • .phpで終わるリクエストに対する処理を定義します。
    • fastcgi_passディレクティブによって、PHP-FPMのリクエストを処理するために、php-fpm:9000というソケットに接続します。
    • fastcgi_indexディレクティブによって、.phpで終わるリクエストに対して、index.phpを使用するように指定されます。
    • includeディレクティブによって、FastCGIプロトコルで使用されるパラメーターが定義されたファイルを読み込みます。
    • fastcgi_paramディレクティブによって、FastCGIプロセスに渡す環境変数が定義されます。SCRIPT_FILENAMEは、実行するPHPファイルのパスを指定するもので、`$document_root$fastcgi_script_nameを結合して、実行するPHPファイルのパスを構成します。$document_rootrootディレクティブで指定されたドキュメントルートのパスを表し、$fastcgi_script_nameはFastCGIで処理するPHPファイルのパスを表します。

この設定は、NginxをWebサーバーとして使用し、PHPアプリケーションを動作させるための基本的な設定となります。また、PHP-FPMとの組み合わせによって、より高速なリクエスト処理を実現することができます。

エラーについて

nginx導入中に下記のエラーになることがありました。

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

原因は、nginxのドキュメントルートとphp-fpmのドキュメントルートに相違があることでした。今回は、php-fpmに合わせて、nginxのドキュメントルートを「/var/www/html」にしました。なので、もし同じようなエラーになっている方がいれば、各ドキュメントルートの設定を見直すといいかも知れません。

おわりに

今日は、dockerで構築した開発環境にnginxを導入し、php-fpmと連携させました。次回は、exporterを導入したいと思います。

今回使用したファイルは下記のGitHubにタグ付けしています。

もし、質問等あればコメントください。確認後、ご連絡いたします。随時、エンジニア案件も相談可能ですので、よろしくお願いいたします。

よっしー
よっしー

また明日お会いしましょう!

コメント

タイトルとURLをコピーしました