Nginx + PHP-FPM で unix ドメインソケットを使ったシンプルな docker-compose.yml を書きました。

スポンサードリンク


はじめに

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 と。これを複数のコンテナで使用しているので、これらのコンテナで共有しているような雰囲気を感じる。そのように感じるのだが、一体何者なのか、よくわからない。

次のページを読んでみて、上記のような理解で大きくは外れていないはず、と思えました。

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 ドメインソケットについてまだまだ、と思い知らされました。

以上です。

コメントを残す