質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

解決済

【Docker】nginx + php-fpm環境で502bad gatewayになる

nnahito
nnahito

総合スコア1984

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

2回答

0グッド

2クリップ

13579閲覧

投稿2018/10/20 02:53

編集2018/10/20 03:00

はじめに

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

1version: '3.5' 2services: # 起動するサービス 3 nginx: # nginx 4 container_name: "amazonlinux2-nginx" 5 build: "./data/nginx" 6 volumes: 7 - ./htdocs/:/var/www/html/ 8 - ./data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 9 - ./log/nginx:/var/log/nginx/ 10 ports: 11 - 80:80 12 depends_on: 13 - phpfpm 14 phpfpm: 15 container_name: "amazonlinux2-phpfpm" 16 build: "./data/php-fpm/" 17 environment: # タイムゾーンを日本に 18 TZ: "Asia/Tokyo" 19 volumes: 20 - ./htdocs/:/var/www/html/ 21 - ./log/php-fpm:/var/log/php-fpm 22 - ./data/php-fpm/php-fpm/:/etc/php-fpm.d/ 23 # # depends_on: 24 # # - db 25 ports: 26 - 9000:80

nginxのDockerfile

docker

1FROM amazonlinux:2.0.20180622.1 2 3# システムのアップデート 4RUN yum update -y 5 6# システムの言語を日本語に対応させる 7RUN yum install -y glibc-langpack-ja \ 8 unlink /etc/localtime \ 9 ln -s /usr/share/zoneinfo/Japan /etc/localtime \ 10 echo "LANG=ja_JP.UTF-8" | tee /etc/sysconfig/i18n 11 12# タイムゾーンを日本に変更 13RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \ 14 echo -e 'ZONE="Asia/Tokyo"\nUTC=true' | tee /etc/sysconfig/clock 15 16# サイトのデータを置くフォルダを作成し、実行権限を変更 17RUN mkdir -p /var/www/html/ 18 19# nginxを入れる 20RUN amazon-linux-extras install -y nginx1.12 21 22# nginxをフォアグラウンドで立ち上げる 23ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

php-fpmのDockerfile

docker

1FROM amazonlinux:2.0.20180622.1 2 3# システムのアップデート 4RUN yum update -y 5 6# システムの言語を日本語に対応させる 7RUN yum install -y glibc-langpack-ja \ 8 unlink /etc/localtime \ 9 ln -s /usr/share/zoneinfo/Japan /etc/localtime \ 10 echo "LANG=ja_JP.UTF-8" | tee /etc/sysconfig/i18n 11 12# タイムゾーンを日本に変更 13RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \ 14 echo -e 'ZONE="Asia/Tokyo"\nUTC=true' | tee /etc/sysconfig/clock 15 16# PHPをインストール 17RUN amazon-linux-extras install -y php7.2 18 19# php-fpmをフォアグラウンドで実行 20ENTRYPOINT /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

調べ回った結果

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

listen = 9000 (ポート番号のみ指定) ;listen.allowed_clients (コメントアウト)

投稿2018/10/21 14:16

TaichiYanagiya

総合スコア11946

nnahito👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

nnahito

2018/10/22 01:40

ありがとうございます! こちらの方法で行うとうまくいきました!

1

受付ipが

listen = 127.0.0.1:9000

だからね

一致しない 192.168.48.2:9000 は受付拒否になります

投稿2018/10/20 06:31

asahina1979

総合スコア8154

nnahito👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

nnahito

2018/10/20 07:05

ご回答有り難うございます。 こちらおそらくphp-fpmのwww.confだと思うのですが、 どの様に値を変えれば良いのでしょうか? 試しに、 listen = 192.168.48.2:9000 や、 listen = nginx:9000 とすると、php-fpmのエラーログに 「ERROR: FPM initialization failed」 とでて、nginx、php-fpmのコンテナ両方が起動しなくなってしまいます…

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです