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

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

ただいまの
回答率

90.23%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,135

nnahito

score 1818

 はじめに

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

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

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

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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/22 10:40

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

    キャンセル

+1

受付ipが

listen = 127.0.0.1:9000

だからね

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/20 16: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で質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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