66056


Docker(CentOS7)でnginxとrailsの構築をしています。

Nginxコンテナとrailsコンテナをそれぞれ起動し、ソケット通信を利用してMacOSのChromeでアクセスしたいのですが、  
ソケット通信がうまくいっていないのか、`localhost:8080`にアクセスすると`502 Bad Gateway`エラーになる状況です。

アクセス後のnginxのエラー（/var/log/nginx/error）

[code]

    2020/04/27 06:45:32 [error] 125#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "localhost:8080"
    2020/04/27 06:45:32 [warn] 125#0: *1 upstream server temporarily disabled while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "localhost:8080"
    2020/04/27 06:45:32 [error] 125#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "localhost:8080"
    2020/04/27 06:45:32 [warn] 125#0: *1 upstream server temporarily disabled while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "localhost:8080"
    2020/04/27 06:45:33 [error] 125#0: *1 no live upstreams while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", upstream: "http://localhost/favicon.ico", host: "localhost:8080", referrer: "http://localhost:8080/"
    2020/04/27 06:47:36 [error] 127#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.25.0.1, server: 127.0.0.1, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "localhost:8080"
    2020/04/27 06:47:38 [error] 127#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.25.0.1, server: 127.0.0.1, request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:8080/favicon.ico", host: "localhost:8080", referrer: "http://localhost:8080/"
    
[/code]

下記にあるnginx.confのソースコードの通り、色々試してみたのですが、うまくいかず、どのように設定すれば正常にアクセスできるのか悩んでいます。  
解決策をご教授いただけると幸いです。

  * pumaを使用しています。
  * `/tmp/sockets/server.pid`のマウント設定もdocker-compose.ymlで設定しています。
  * railsはポート番号5000で起動しています。

# ソースコード

nginx.conf

[code]

    error_log /var/log/nginx/error warn;
    
    worker_processes 2;
    worker_rlimit_nofile 150000;
    
    events {
      worker_connections 1024;
    }
    
    http {
      upstream testdocker {
        server unix:///var/www/testdocker/tmp/pids/server.pid;
        # 試したコード
        # server localhost:5000;
        # server 127.0.0.1:5000;
        # server 0.0.0.0:5000;
      }
    
      server {
        listen 80;
        server_name 127.0.0.1:8000;
        # 試したコード
        # listen 8080;
        # server_name localhost;
        # server_name testdocker;
    
        location / {
          proxy_pass http://127.0.0.1:8080;
          # proxy_pass http://localhost:8080; # 試したコード
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
        }
      }
    }
    
[/code]

docker-compose.yml

[code]

    version: '3'
    
    services:
      rails:
        build: .
        tty: true
        stdin_open: true
        volumes:
         - ./testdocker:/var/www/testdocker
        working_dir: /var/www/testdocker
        command: >
          bash -c "rails s -b 0.0.0.0;
          bash"
        ports:
          - '5000:3000'
    
      nginx:
        build: .
        tty: true
        stdin_open: true
        privileged: true
        restart: always
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
          - ./nginx.repo:/etc/yum.repos.d/nginx.repo
          - ./testdocker/tmp/pids:/var/www/testdocker/tmp/pids # server.pidをマウントする
        command: /sbin/init
        ports:
          - "8080:80"
    
[/code]

Docker

[code]

    FROM centos:7.7.1908
    
    ENV LANG C.UTF-8
    ENV TZ Asia/Tokyo
    ENV LC_ALL=C
    
    # 必要なパッケージをインストール
    RUN yum -y update
    RUN yum install -y git tzdata libxml2-devel.x86_64 libcurl-devel.x86_64 gcc-c++.x86_64 glibc-devel.x86_64 mariadb-devel.x86_64 ImageMagick.x86_64 bzip2 make which epel-release gmp-devel.x86_64
    
    # NodeJSのインストール
    RUN curl -sL https://rpm.nodesource.com/setup_12.x | bash -
    RUN yum install -y nodejs
    
    # rubyとrailsをインストール
    RUN git clone --depth=1 https://github.com/rbenv/ruby-build && PREFIX=/usr/local ./ruby-build/install.sh && rm -rf ruby-build
    RUN ruby-build 2.7.1 /usr/local
    RUN gem install -v 5.2.4 rails --no-document
    
    # Gemfileのインストール
    RUN mkdir -p /var/www/testdocker
    WORKDIR /var/www/testdocker
    COPY /testdocker/Gemfile Gemfile
    COPY /testdocker/Gemfile.lock Gemfile.lock
    RUN bundle install
    
    # Nigixのインストール
    COPY nginx.repo ./etc/yum.repos.d/nginx.repo
    RUN yum install -y nginx
    
[/code]

# バージョン

nginx 1.16.1


CC BY-SA 4.0
2020-04-27T08:44:44.067
66029
2020-04-28T06:27:15.270
25223
question
ruby-on-rails docker nginx
Docker Nginx+Railsでサーバ起動すると502 Bad Gatewayになる


rails コンテナ内部から見ると 3000 番ポートで起動していて、ホストの 5000 番ポートからポートフォワードしているのですよね？

もし、そうならば、nginx コンテナからは、ホストの 5000 番ポートではなく、rails コンテナの 3000
番ポートに接続するよう、`proxy_pass` を設定する必要があります。

[code]

    location / {
        proxy_pass http://rails:3000;
        (略)
    }
    
[/code]

ただし、nginx コンテナから "rails"
で名前解決するには、[links](https://docs.docker.com/compose/compose-file/compose-
file-v2/#links) で設定するか、[networks](https://docs.docker.com/compose/compose-
file/compose-file-v2/#networks) で両コンテナを同じネットワークに配置するか、どちらかになると思います。


CC BY-SA 4.0
2020-04-28T06:27:15.270
66056
2020-04-28T06:27:15.270
4603
66029
answer