はじめに
TCP/IP の 9000 ポートで Nginx から PHP へ接続することができるようになりました。これを、Unix ドメインソケットに変更したい、そんな中で得たことを残します。。
ポイント
- php:fpm-alpine イメージのコンテナの設定ファイルを上書きする。
上書きする php-fpm の設定ファイルは、/usr/local/etc/php-fpm.d/zz-docker.conf- php-fpm の設定ファイルで、listen に socket ファイルを指定する。
- php-fpm の設定ファイルで、liten.mode に 0666 を設定する。
- ホスト、Nginx コンテナ、および PHP-FPM コンテナで socket ファイルを共有するように docker-compose.yml の volumes を記述する。
- 一番外側のスコープで volumes を定義し、Nginx コンテナ、および PHP-FPM コンテナではそれを pbp-fpm の設定ファイルで定義した listen のディレクトリ (ファイル部分は除く) に繋げる。
ポイントとなった部分、docker-compose.yml などの具体的な記述
version: '3' services: web: image: nginx:alpine ports: - 80:80 depends_on: - app volumes: - ./web/default.conf:/etc/nginx/conf.d/default.conf - ./data/html:/var/www/html - phpsocket:/var/run app: image: php:fpm-alpine volumes: - ./data/html:/var/www/html - ./php/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf - phpsocket:/var/run volumes: phpsocket:
[global] daemonize = no [www] listen = /var/run/php7-fpm.sock listen.mode = 0666
解決に大きく貢献したページ
次のページの内容で解決できました♪
実現するにあたって勉強したこと
次のページを見て、そもそも実現はできそうだと感触を得る。ただ、前提となる知識が自分に不足していて、全然理解できなかった。
– nginxで unix ドメイン socket をlisten してバックエンド専用に設定する。 – それマグで!
トップレベルに voluemes: を置く、とは?
docker-compose.yml の一番外側のスコープに volumes: が書いてある。phpsocket と。これを複数のコンテナで使用しているので、これらのコンテナで共有しているような雰囲気を感じる。そのように感じるのだが、一体何者なのか、よくわからない。
次のページを読んでみて、上記のような理解で大きくは外れていないはず、と思えました。
- Docker の Data Volume まわりを整理する – Qiita
- Docker Data Volume を理解する – Carpe Diem
- Docker の volumes についてよく整理されていてスッキリする。
- Docker Composeのトップレベルvolumesでホストのディレクトリをマウントする
listen.mode = 0666 にすること。について、簡単に検証
もし、デフォルト (PHP: 設定 – Manual) の listen.mode = 0660 とすると次のようなパーミッションエラーとなりました。
web_1 | 172.28.0.1 - - [29/Jul/2018:02:26:09 +0000] "GET / HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" web_1 | 2018/07/29 02:26:09 [crit] 7#7: *1 connect() to unix:/var/run/php7-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 172.28.0.1, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php7-fpm.sock:", host: "localhost" web_1 | 172.28.0.1 - - [29/Jul/2018:02:26:09 +0000] "GET /robots.txt HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" web_1 | 2018/07/29 02:26:09 [crit] 7#7: *4 connect() to unix:/var/run/php7-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 172.28.0.1, server: _, request: "GET /robots.txt HTTP/1.1", upstream: "fastcgi://unix:/var/run/php7-fpm.sock:", host: "localhost"
なお、listen.mode = 0666 時の php7-fpm.sock のパーミッションは次のようになっていました。
# ls -al /var/run/php7-fpm.sock srw-rw-rw- 1 root root 0 Jul 29 02:29 /var/run/php7-fpm.sock #
listen.mode = 0666 と設定することについての考察は、次のページが参考になりました。
おわりに
Docker は、そのまま使えるサンプルが豊富です♪とてもありがたいです♪
ですけれども、そこから少し外れると、Docker そのものについての知識や技術が要求されます。
それだけではなく、さらにはイメージの内容や、通信についての基礎的な技術も要求されます。ここが辛いです><。
特に今回は、TCP/IP、Unix ドメインソケットについてまだまだ、と思い知らされました。
以上です。
「Nginx + PHP-FPM で unix ドメインソケットを使ったシンプルな docker-compose.yml を書きました。」への1件の返信
[…] 本投稿は、Nginx + PHP-FPM で unix ドメインソケットを使ったシンプルな docker-compose.yml を書きました。 – oki2a24 の進化版となります。 […]