はじめに
Docker勉強中です。
あまり詳しくありません。
環境
- MacOS High Sierra (10.13.4)
- Docker for Mac 18.06.1-ce-mac73 (26764)
質問要点
Amazon Linux2のDockerイメージを使い、
- nginx
- php-fpm
- mysql
をそれぞれ別のコンテナで立ち上げ連結させたいと思って始めたのですが、
まずnginxとphp-fpmの連携がうまく行かず、
2018/10/20 02:27:09 [error] 6#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.48.1, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://192.168.48.2:9000", host: "localhost"
がnginxのエラーとして吐き出されます。
これはなぜかがわからない。
質問
動かしているサービスが、Amazon Linux2を用いたEC2インスタンスなので、
そのローカル開発環境用に勉強がてらDockerを使って同じ環境を構築しようとしています。
ベースイメージをAmazon Linux2で立ち上げ、
nginx、php-fpm、mysqlをそれぞれ、別イメージとして連携(1イメージ1コンテナ?)し、
3つのコンテナにしたいと考えています。↓
nginx ⇔ php-fpm ⇔ mysql
nginxをインストールしたAmazon Linux2のインスタンス単体にアクセスすると、
正常にブラウザから設定したページを見ることができました。
しかし、php-fpmを連携しようとすると、
おそらくですが、 nignx → php-fpm
の部分でコケているようで、
502 Bad Gateway
が返ってきます。
この原因と解決方法を知りたいです。
コンテナ間通信なので、127.0.0.1:9000
となっているところを、
docker-compose.ymlで定義した「phpfpm」などに変えてみましたが、
結果は変わりませんでした……
もしご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
よろしくお願いいたします。
フォルダ構成
docker-compose.yml
yml
version: '3.5' services: # 起動するサービス nginx: # nginx container_name: "amazonlinux2-nginx" build: "./data/nginx" volumes: - ./htdocs/:/var/www/html/ - ./data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf - ./log/nginx:/var/log/nginx/ ports: - 80:80 depends_on: - phpfpm phpfpm: container_name: "amazonlinux2-phpfpm" build: "./data/php-fpm/" environment: # タイムゾーンを日本に TZ: "Asia/Tokyo" volumes: - ./htdocs/:/var/www/html/ - ./log/php-fpm:/var/log/php-fpm - ./data/php-fpm/php-fpm/:/etc/php-fpm.d/ # # depends_on: # # - db ports: - 9000:80
nginxのDockerfile
docker
FROM amazonlinux:2.0.20180622.1 # システムのアップデート RUN yum update -y # システムの言語を日本語に対応させる RUN yum install -y glibc-langpack-ja \ unlink /etc/localtime \ ln -s /usr/share/zoneinfo/Japan /etc/localtime \ echo "LANG=ja_JP.UTF-8" | tee /etc/sysconfig/i18n # タイムゾーンを日本に変更 RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \ echo -e 'ZONE="Asia/Tokyo"\nUTC=true' | tee /etc/sysconfig/clock # サイトのデータを置くフォルダを作成し、実行権限を変更 RUN mkdir -p /var/www/html/ # nginxを入れる RUN amazon-linux-extras install -y nginx1.12 # nginxをフォアグラウンドで立ち上げる ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
php-fpmのDockerfile
docker
FROM amazonlinux:2.0.20180622.1 # システムのアップデート RUN yum update -y # システムの言語を日本語に対応させる RUN yum install -y glibc-langpack-ja \ unlink /etc/localtime \ ln -s /usr/share/zoneinfo/Japan /etc/localtime \ echo "LANG=ja_JP.UTF-8" | tee /etc/sysconfig/i18n # タイムゾーンを日本に変更 RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \ echo -e 'ZONE="Asia/Tokyo"\nUTC=true' | tee /etc/sysconfig/clock # PHPをインストール RUN amazon-linux-extras install -y php7.2 # php-fpmをフォアグラウンドで実行 ENTRYPOINT /usr/sbin/php-fpm -F
nginxのconfファイル
# 実行ユーザ user nginx; # Nginx本体のプロセス数、autoにしてnginx内部判定に任せるのは賢明 worker_processes auto; # エラーログ error_log /var/log/nginx/error.log; # nginx のプロセス番号保存先 pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; # サーバへの接続時の設定 events { worker_connections 1024; # 一つのworkerプロセグが開ける最大コネクション数 multi_accept on; # できるだけクライアントからのリクエストを受け取る # accept_mutex_delay 100ms; # accept()時のmutexの確保に失敗した際の待機時間を調整 } # サーバ設定 http { # サーバログの出力フォーマット 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; # URLのファイル名省略時のデフォルトページ index index.html index.htm index.php; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; upstream phpserver { server phpfpm:9000; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; # あとで消す(ドメイン設定したら消す) root /var/www/html; # あとで変更(CakePHP導入したら変更) # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; # アップロード可能なファイルサイズ(1MB) client_max_body_size 1m; location / { try_files $uri $uri/ /index.php?$query_string; } # location = /favicon.ico { # try_files favicon.ico /icons/favicon.ico; # } # すべてのアクセスを、ドキュメントルトのindex.phpに転送する location ~ .php$ { fastcgi_pass phpfpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; fastcgi_param CAKE_ENV production; include fastcgi_params; fastcgi_hide_header X-Powered-By; } } }
php-fpmのconfファイル(www.conf)
文字数の関係で、コメント部分を一部削除しています
[www] ;prefix = /path/to/pools/$pool user = nginx group = nginx ; listen = /run/php-fpm/www.sock listen = 127.0.0.1:9000 listen.owner = nginx listen.group = nginx ;listen.mode = 0660 listen.acl_users = apache,nginx ;listen.acl_groups = listen.allowed_clients = 127.0.0.1 ; process.priority = -19 pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 ;pm.process_idle_timeout = 10s; ;pm.max_requests = 500 ;pm.status_path = /status ;ping.path = /ping ;ping.response = pong ;access.log = log/$pool.access.log ;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" slowlog = /var/log/php-fpm/www-slow.log ;request_slowlog_timeout = 0 ;request_terminate_timeout = 0 ;rlimit_files = 1024 ;rlimit_core = 0 ;chroot = ;chdir = /var/www ;catch_workers_output = yes ;clear_env = no ;security.limit_extensions = .php .php3 .php4 .php5 .php7 ; Default Value: clean env ;env[HOSTNAME] = $HOSTNAME ;env[PATH] = /usr/local/bin:/usr/bin:/bin ;env[TMP] = /tmp ;env[TMPDIR] = /tmp ;env[TEMP] = /tmp ; Additional php.ini defines, specific to this pool of workers. These settings ; overwrite the values previously defined in the php.ini. The directives are the ; same as the PHP SAPI: ; php_value/php_flag - you can set classic ini defines which can ; be overwritten from PHP call 'ini_set'. ; php_admin_value/php_admin_flag - these directives won't be overwritten by ; PHP call 'ini_set' ; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. ; Defining 'extension' will load the corresponding shared extension from ; extension_dir. Defining 'disable_functions' or 'disable_classes' will not ; overwrite previously defined php.ini values, but will append the new value ; instead. ; Note: path INI options can be relative and will be expanded with the prefix ; (pool, global or @prefix@) ; Default Value: nothing is defined by default except the values in php.ini and ; specified at startup with the -d argument ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com ;php_flag[display_errors] = off php_admin_value[error_log] = /var/log/php-fpm/www-error.log php_admin_flag[log_errors] = on ;php_admin_value[memory_limit] = 128M ; Set the following data paths to directories owned by the FPM process user. ; ; Do not change the ownership of existing system directories, if the process ; user does not have write permission, create dedicated directories for this ; purpose. ; ; See warning about choosing the location of these directories on your system ; at http://php.net/session.save-path php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache ;php_value[opcache.file_cache] = /var/lib/php/opcache
調べ回った結果
まだ回答がついていません
会員登録して回答してみよう