title: Nginx connection refused while connecting to Node.js upstream inside a Docker container
body: <p>I have the following setup:</p>
  
  <p>Docker container which has supervisord as the entry point,
  supervisord runs a Node.js process and Nginx proxy.
  the Nginx port is exposed outside.</p>
  
  <p>on the host machine, another Nginx is used for SSL termination and vhost routing / load balancing, its used as a proxy for the Docker containers.</p>
  
  <p>I'm experiencing some strange issues, where sometimes the Nginx server inside the Docker containers is reporting errors with connecting to the upstream Node.js servers. seems like the HTTP requests are 200 so maybe it auto retries even if there's only one upstream?!</p>
  
  <p>also, no sign of errors or crashes in the Node.js process stdout/stderr..</p>
  
  <p>This are the errors that I see:</p>
  
  <pre><code>2014/07/31 12:48:54 [error] 15#0: *10 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.42.1, server: f074d2f4389f, request: "GET /users/me HTTP/1.1", upstream: "http://[::1]:3000/users/me", host: "xxx.xxx.com", referrer: "https://xxx.xxx.com/"
  </code></pre>
  
  <p>what can be the problem?</p>
  
  <p>This is the supervisord config files:</p>
  
  <pre><code>[supervisord]
  nodaemon=true
  logfile=/var/log/supervisor/supervisord.log    ; supervisord log file
  logfile_maxbytes=50MB                           ; maximum size of logfile before rotation
  logfile_backups=10                              ; number of backed up logfiles
  loglevel=info                                  ; info, debug, warn, trace
  pidfile=/var/run/supervisord.pid                ; pidfile location
  childlogdir=/var/log/supervisor/               ; where child log files will live"
  </code></pre>
  
  <p>and this file is included in other files:</p>
  
  <pre><code>[include]
  files = /etc/supervisor/conf.d/supervisord.conf
  
  [program:api]
  command=node api-cluster.js
  directory=/src
  autorestart=true
  startretries=100000000
  stdout_logfile=/var/log/supervisor/api_stdout.log
  stderr_logfile=/var/log/supervisor/api_stderr.log
  
  [program:nginx]
  command=/usr/sbin/nginx
  autorestart=true
  startretries=100000000
  stdout_logfile=/var/log/supervisor/nginx_stdout.log
  stderr_logfile=/var/log/supervisor/nginx_stderr.log"
  </code></pre>
  
  <p>and this is the Nginx conf file inside the Docker container:</p>
  
  <pre><code># -------------------------------------------------------------------
  #                         Nginx configuraiton
  # -------------------------------------------------------------------
  
  worker_processes 4;
  daemon off;
  
  error_log   stderr  info;
  pid         /var/run/nginx.pid;
  
  events {
      #use epoll;
      worker_connections 768;
  }
  
  http {
      ##
      # Basic Settings
      ##
  
      sendfile on;
      tcp_nopush on;
      tcp_nodelay on;
      keepalive_timeout 65;
      types_hash_max_size 2048;
  
      include     /etc/nginx/mime.types;
      default_type application/octet-stream;
  
      log_format main 'ip=\$http_x_real_ip [\$time_local] '
      '"\$request" \$status \$body_bytes_sent "\$http_referer" '
      '"\$http_user_agent"' ;
  
      ##
      # Gzip Settings
      ##
  
      gzip on;
      gzip_disable "msie6";
  
      upstream app_proxy {
          server localhost:3000;      # nodejs server
      }
  
      server {
          listen          80 deferred;
          server_name     \$hostname;
          access_log      /dev/stdout main;
  
          location ~ ^/(images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|scripts/|views/|styles/|bower_components/|robots.txt|humans.txt|favicon.ico|home/|html|xml) {
              root /src/web/public;
              access_log off;
              expires max;
          }
  
          location / {
              proxy_redirect off;
              #proxy_set_header X-Real-IP \$remote_addr;
              #proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto \$scheme;
              proxy_set_header Host \$http_host;
              proxy_set_header X-NginX-Proxy true;
              proxy_intercept_errors off;
              proxy_pass       http://app_proxy/;
          }
      }
  }
  </code></pre>