title: Nginx+PHP-FPM: connection refused while connecting to upstream (502)
body: <p>I know there's a ton of posts regarding 502 Bad Gateway, but I haven't been able to solve this problem. I'm using Docker Compose to create separate containers for Nginx and PHP-FPM. </p>
  
  <p>Error I get loading PHP files in the browser (HTML files render fine):</p>
  
  <pre><code>tc-web     | 2018/01/22 19:22:46 [error] 5#5: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: localhost, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://172.18.0.2:9000", host: "localhost:8080"
  tc-web     | 172.18.0.1 - - [22/Jan/2018:19:22:46 +0000] "GET /info.php HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
  </code></pre>
  
  <p>I've tried tweaking the various configs, using Unix socket, etc., for hours, and I still get 502 errors with PHP files. Can you spot what's wrong?</p>
  
  <p>Here are all required files..</p>
  
  <p><strong>docker-composer.yml:</strong></p>
  
  <pre><code>version: '3'
  services:
    web:
      build:
        context: ./docker/nginx
      image: tc-web:0.1.0
      container_name: tc-web
      volumes:
        # test files
        - ./temp.html:/var/www/html/index.html
        - ./temp.php:/var/www/html/info.php
      ports:
        - 8080:80
      depends_on:
        - php-fpm
  
    php-fpm:
      build:
        context: ./docker/php-fpm
      image: tc-php:0.1.0
      container_name: tc-php
      volumes:
        - ./temp.html:/var/www/html/index.html
        - ./temp.php:/var/www/html/info.php
  </code></pre>
  
  <p><strong>docker/nginx/Dockerfile:</strong></p>
  
  <pre><code>FROM nginx:1.13.8
  
  # Install programs
  RUN apt-get update
  RUN apt-get install -y nano &amp;&amp; \
      apt-get install -y git &amp;&amp; \
      apt-get install -y procps
  
  RUN mkdir -p /var/www/html
  
  COPY nginx.conf /etc/nginx/nginx.conf
  COPY default.conf /etc/nginx/conf.d/default.conf
  </code></pre>
  
  <p><strong>docker/nginx/nginx.conf:</strong></p>
  
  <pre><code>user www-data;
  worker_processes 1;
  
  # error_log  /var/log/nginx/error.log warn;
  pid        /var/run/nginx.pid;
  
  events {
      worker_connections 1024;
  }
  
  http {
      include       /etc/nginx/mime.types;
      default_type  application/octet-stream;
  
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
  
      sendfile        on;
      #tcp_nopush     on;
      keepalive_timeout  65;
      #gzip  on;
  
      include /etc/nginx/conf.d/default.conf;
  }
  </code></pre>
  
  <p><strong>docker/nginx/default.conf:</strong></p>
  
  <pre><code>server {
      listen       80;
      server_name  localhost;
      root   /var/www/html;
  
      location / {
          try_files $uri $uri/ /index.php?$query_string;
      }
  
      location ~* \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass php-fpm:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
      }
  }
  </code></pre>
  
  <p><strong>docker/php-fpm/Dockerfile:</strong></p>
  
  <pre><code>FROM php:7.0-fpm
  
  # Install programs
  RUN apt-get update
  RUN apt-get install -y nano &amp;&amp; \
      apt-get install -y procps
  
  RUN mkdir -p /var/www/html
  
  COPY php-fpm.conf /usr/local/etc/php-fpm.conf
  COPY www.conf /usr/local/etc/php-fpm.d/www.conf
  </code></pre>
  
  <p><strong>docker/php-fpm/php-fpm.conf:</strong></p>
  
  <pre><code>[global]
  
  include=etc/php-fpm.d/www.conf
  </code></pre>
  
  <p><strong>docker/php-fpm/www.conf:</strong></p>
  
  <pre><code>[global]
  ;daemonize = no
  ; if we send this to /proc/self/fd/1, it never appears
  error_log = /proc/self/fd/2
  
  [www]
  user = www-data
  group = www-data
  
  listen = 127.0.0.1:9000
  ;listen = /var/run/php-fpm/php7-fpm.sock
  ;listen.owner = www-data
  ;listen.group = www-data
  ;listen.mode = 0660
  
  access.log = /proc/self/fd/2
  
  pm = dynamic
  pm.max_children = 5
  pm.start_servers = 2
  pm.min_spare_servers = 1
  pm.max_spare_servers = 3
  
  ; Ensure worker stdout and stderr are sent to the main error log.
  catch_workers_output = yes
  </code></pre>