Winodws Docker環境でnginx+php-fpm環境構築

+ できたこと
nginx経由でphpinfo()の内容を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22836/cb8835c9-6877-b12f-95ea-db0a764b6d8a.png)
+ 大まかな流れ
　Docker for Windowsの環境構築　【参考】[WindowsでDocker](https://qiita.com/tyakosuke/items/6c77c057913453820fa4)
　nginxの環境構築　【参考】[Dockerでnginx環境を構築](https://qiita.com/tyakosuke/items/29982379929791e5da7d)
　php-fpmの環境構築 ：下記記載

やることは単純だが、様々な設定が絡んでどこがどこに影響しているかわからなくなるので、最小限の構成でエラーメッセージを確認しながら一つ一つ確実に実施する。

参考：[bitnami/php-fpm](https://hub.docker.com/r/bitnami/php-fpm)

+ php-fpmイメージ取得
~~~
docker pull bitnami/php-fpm:latest
~~~ 
+ 取得確認（イメージIDをコピーしておくと良い）
~~~
docker images
~~~
docker内でコンテナ同士で通信するためネットワークを構築する
参考：[Docker network 概論](https://qiita.com/TsutomuNakamura/items/ed046ee21caca4a2ffd9)
+ ネットワーク構成図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22836/208daf6f-12a5-4555-34d0-331026ff0649.png)
+ ネットワーク作成
参考：[docker network](https://docs.docker.jp/engine/reference/commandline/network.html)
~~~
docker network create app-tier --driver bridge
~~~
+ php-fpmコンテナ起動
~~~
docker run -d --network app-tier bitnami/php-fpm --name pfp-fpm
~~~
+ nginxコンテナ起動（事前にnginxのイメージを取得していること）
~~~
docker run -dp 8080:80 --network app-tier nginx --name nginx
~~~
+nginxとphp-fpmの設定を変更する
下記のような通信の流れになるように、nginxとphp-fpmの設定を変更していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22836/f1d8b516-7f50-7437-1b61-3bdcd9489609.png)
+ nginx.confの確認
<details><summary>/etc/nginx/nginx.conf</summary>

~~~~nginx
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
~~~~
</details>

includeされているconf.d配下のdefault.confに設定変更を加える
+ defaul.confの変更

<details><summary>/etc/conf.d/default.conf</summary>

~~~~diff_nginx
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
+       root           /app;
+       fastcgi_pass   pfp-fpm:9000;       
+       fastcgi_index  index.php;
+       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
-       #root           html;
-       #fastcgi_pass   127.0.0.1:9000;
-       #fastcgi_index  index.php;
-       #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
~~~~
</details>

+ 変更箇所の説明

~~~nginx
root           /app;　#php-fpmコンテナ側のドキュメントルート
fastcgi_pass   pfp-fpm:9000;　#Proxy先のphp-fpmコンテナ側のホストとポート情報
fastcgi_index  index.php;　#$fastcgi_script_nameに格納するインデックスファイル名
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;　#php-fpm側コンテナ側へリクエストするパラメータ
~~~
+ nginxのconfチェック
~~~
nginx -t
~~~
+ nginxのconfリロード
~~~
service nginx reload
~~~
+ nginxの動作確認
 localhost:8080へアクセスし、nginxが稼働していることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22836/60d2e46b-7663-ca9e-2ca5-f47043e9ed58.png)
+ php-fpmコンテナ側の設定
ドキュメントルートへindex.phpを配置。

<details><summary>index.php</summary>

~~~php
<?php phpinfo(); ?>
~~~

</details>

+ php-fpmの動作確認
localhost:8080/index.phpへアクセスする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22836/cb8835c9-6877-b12f-95ea-db0a764b6d8a.png)

参考：
[Module ngx_http_fastcgi_module](http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_index)
[【docker】php-fpmを使う際のnginxのconfファイルについて](https://zenn.dev/honda/scraps/4fba8235622704)
[FastCGIに関して](https://skill-up-engineering.com/2016/12/14/post-2238/)
[nginx $document_root$fastcgi_script_name と $request_filename の違い](https://qiita.com/kotarella1110/items/3b0bd84fdb55276f37d9)