title: PHP-FPM and Nginx: 502 Bad Gateway
body: <p><strong>Configuration</strong></p>
  
  <ul>
  <li>Ubuntu Server 11.10 64 bit</li>
  <li>Amazon AWS, Ec2, hosted on the cloud</li>
  <li>t1.micro instance</li>
  </ul>
  
  <p>Before I write anything else, I'd like to state that I've checked both <a href="https://stackoverflow.com/questions/4252368/nginx-502-bad-gateway">nginx 502 bad gateway</a> and <a href="https://stackoverflow.com/questions/3616191/nginx-php-fpm-502-bad-gateway">Nginx + PHP-FPM 502 Bad Gateway</a> threads, which unfortunately haven't helped me in this regard.</p>
  
  <p>The issue appears to be rather common: a misconfiguration of nginx or php-fpm can lead to a <code>502 Bad Gateway</code> error, which is something that I haven't been able to get rid of. Note that this appears <em>even when I go to my domain root</em>, without specifying any particular directory. </p>
  
  <p>I'm running an Amazon EC2 webserver, with port 9000 enabled, port 80 open, etc.</p>
  
  <p>The question in particular is, how can I get rid of this nasty error? Or, better yet, how can I get <code>php5-fpm</code> to <em>actually work</em>.</p>
  
  <p><strong>What I Have Attempted so Far</strong></p>
  
  <p>Mostly consistent editing of configuration files, notably <code>php-fpm.conf</code> and <code>nginx.conf</code>.</p>
  
  <p><strong>i.</strong> <em>php-fpm.conf</em></p>
  
  <p>I've added the following, which hasn't quite helped much:</p>
  
  <pre><code>;;;;;;;;;;;;;
  ; Fpm Start ;
  ;;;;;;;;;;;;;
  
  ;pm.start_servers = 20
  ;pm.min_spare_servers = 5
  ;pm.max_spare_servers = 35
  </code></pre>
  
  <p>Now, afterward I tried including my configuration files:</p>
  
  <p><code>include=/etc/php5/fpm/*.conf</code></p>
  
  <p>Which only screwed me even further.</p>
  
  <p><strong><em>Full Configuration</em></strong></p>
  
  <pre><code>;;;;;;;;;;;;;;;;;;;;;
  ; FPM Configuration ;
  ;;;;;;;;;;;;;;;;;;;;;
  
  ; All relative paths in this configuration file are relative to PHP's install
  ; prefix (/usr). This prefix can be dynamicaly changed by using the
  ; '-p' argument from the command line.
  
  ; Include one or more files. If glob(3) exists, it is used to include a bunch of
  ; files from a glob(3) pattern. This directive can be used everywhere in the
  ; file.
  ; Relative path can also be used. They will be prefixed by:
  ;  - the global prefix if it's been set (-p arguement)
  ;  - /usr otherwise
  ;include=/etc/php5/fpm/*.conf
  
  ;;;;;;;;;;;;;;;;;;
  ; Global Options ;
  ;;;;;;;;;;;;;;;;;;
  
  [global]
  ; Pid file
  ; Note: the default prefix is /var
  ; Default Value: none
  pid = /var/run/php5-fpm.pid
  
  ; Error log file
  ; Note: the default prefix is /var
  ; Default Value: log/php-fpm.log
  error_log = /var/log/php5-fpm.log
  
  ; Log level
  ; Possible Values: alert, error, warning, notice, debug
  ; Default Value: notice
  log_level = notice
  
  ; If this number of child processes exit with SIGSEGV or SIGBUS within the time
  ; interval set by emergency_restart_interval then FPM will restart. A value
  ; of '0' means 'Off'.
  ; Default Value: 0
  ;emergency_restart_threshold = 0
  
  ; Interval of time used by emergency_restart_interval to determine when 
  ; a graceful restart will be initiated.  This can be useful to work around
  ; accidental corruptions in an accelerator's shared memory.
  ; Available Units: s(econds), m(inutes), h(ours), or d(ays)
  ; Default Unit: seconds
  ; Default Value: 0
  emergency_restart_interval = 0
  
  ; Time limit for child processes to wait for a reaction on signals from master.
  ; Available units: s(econds), m(inutes), h(ours), or d(ays)
  ; Default Unit: seconds
  ; Default Value: 0
  ;process_control_timeout = 0
  
  ; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
  ; Default Value: yes
  daemonize = no
  
  ;;;;;;;;;;;;;
  ; Fpm Start ;
  ;;;;;;;;;;;;;
  
  ;pm.start_servers = 20
  ;pm.min_spare_servers = 5
  ;pm.max_spare_servers = 35
  
  ;;;;;;;;;;;;;;;;;;;;
  ; Pool Definitions ; 
  ;;;;;;;;;;;;;;;;;;;;
  
  ; Multiple pools of child processes may be started with different listening
  ; ports and different management options.  The name of the pool will be
  ; used in logs and stats. There is no limitation on the number of pools which
  ; FPM can handle. Your system will tell you anyway :)
  
  ; To configure the pools it is recommended to have one .conf file per
  ; pool in the following directory:
  include=/etc/php5/fpm/pool.d/*.conf
  </code></pre>
  
  <p><strong>ii</strong>. <em>nginx.conf</em></p>
  
  <p>In all honesty this configuration is a smattering of a few websites I've visited, but I can tell you that before this 502 Bad Gateway business, the server was running fine (without PHP working. Period.).</p>
  
  <p>The issue primarily lies in the fact that something is terribly, terribly wrong. And now, when I try to do a <code>service php5-fpm restart</code>, it hangs in what I'm guessing is an infinite loop or something, which I can't even <kbd>CTRL</kbd>-<kbd>C</kbd> out of.</p>
  
  <p><strong><em>Full Configuration</em></strong></p>
  
  <pre><code>user www-data;
  worker_processes 1;
  pid /var/run/nginx.pid;
  
  events {
      worker_connections 64;
      # multi_accept on;
  }
  
  http {
  
      ##
      # Basic Settings
      ##
  
      sendfile on;
      tcp_nopush off;
      tcp_nodelay on;
      keepalive_timeout 65;
      types_hash_max_size 2048;
      # server_tokens off;
  
      # server_names_hash_bucket_size 64;
      # server_name_in_redirect off;
  
      include /etc/nginx/mime.types;
      default_type application/octet-stream;
  
      ##
      # Logging Settings
      ##
  
      access_log /var/log/nginx/access.log;
      error_log /var/log/nginx/error.log;
  
      ##
      # Gzip Settings
      ##
  
      gzip on;
      gzip_disable "msie6";
  
      # gzip_vary on;
      # gzip_proxied any;
      # gzip_comp_level 6;
      # gzip_buffers 16 8k;
      # gzip_http_version 1.1;
      # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  
      ##
      # Virtual Host Configs
      ##
  
      include /etc/nginx/conf.d/*.conf;
      include /etc/nginx/sites-enabled/*;
  
      server {
          listen 80;
          server_name ec2-xx-xx-xx-xx.compute-x.amazonaws.com;
  
          location ~ ^(.+\.php)(.*)$ {
              root   /home/wayvac/public;
              fastcgi_pass   unix:/var/run/php5-fpm.pid;  
              #fastcgi_pass   127.0.0.1:9000; #Un-comment this and comment "fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;" if you are not using php-fpm.
              fastcgi_index  index.php;
              set $document_root2 $document_root;
              if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
              if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
              if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
              if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
              if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
              fastcgi_split_path_info ^(.+\.php)(.*)$;
              fastcgi_param   SCRIPT_FILENAME $document_root2$fastcgi_script_name;
              fastcgi_param   PATH_INFO   $fastcgi_path_info;
              fastcgi_param   PATH_TRANSLATED $document_root2$fastcgi_path_info;
              include fastcgi_params;
              fastcgi_param  DOCUMENT_ROOT      $document_root2;
          }       
  
          access_log /var/log/nginx/access.log;
          error_log /var/log/nginx/error.log;
  
          location / {
              root /home/wayvac/public;   
              index index.html index.htm index.php;
          }
  
          location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
              # Some basic cache-control for static files to be sent to the browser
              expires max;
              add_header Pragma public;
              add_header Cache-Control "public, must-revalidate, proxy-revalidate";
          }
  
          #include drop.conf;
          #include php.conf;
      }
  }
  </code></pre>