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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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

総合スコア1980

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クリップ

12004閲覧

投稿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

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

調べ回った結果

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

nginx

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

PHP

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

Docker

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