502 bad gateway using Nginx

Many times we can browse the web and find a 502 bad gateway error at Nginx.   There are a few reasons why you will find this message in  your webserver log, and here we will teach you how to fix it.

When you will find 502 bad gateway error:

  1. Nginx running as proxy for Apache web server.
  2. Nginx running with PHP-FPM daemon.
  3. Nginx running with other services as gateway.
  4. Bad buffering/timeout configuration.

Before getting deep into all of this options, you must understand what does the error message means. So, the error it’s a 502 number and it’s happening at the gateway. What the hell is a gateway? In simple words, a gateway, is like an access point, a bridge that communicate one service with another, in this case the gateway can be a service/application that is working and recieving requests from Nginx web server.

Now, let’s explore each one of this reasons to understand the 502 bad gateway message:

  1. Nginx as Proxy for Apache: in this case, the gateway is Apache. When you use Nginx as proxy for Apache, if apache dies or it’s not well configured, it can cause this 502 error. How to fix it? Most of the times, restarting apache web server will get rid of this, but you must check the log files to know why exactly this was caused.
  2. Nginx with PHP-FPM: same as Apache example, let’s imagine your php daemon stop working, or get’s overloaded by requests, it will not work properly and the all the php requests from nginx would not be served, so, an error will appear. How to fix it? Restart php-fpm daemon and check the logs.
  3. Nginx with other services/apps: try restarting the other service behind nginx and explore the logs to find the reason why it happened.

Other quick solutions:

1) Increase buffer and timeouts inside http block:

http {
...
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
...
}

2) Ensure your php-fpm service is listening according to what you’ve configured in nginx, it can be either this two options:

Edit www.conf file (in CentOS it is located at /etc/php-fpm.d/www.conf and try with one of this two options:

listen = /var/run/php5-fpm.sock

or

listen = 127.0.0.1:9000

After that, just restart the php-fpm service.

3) Disable APC Cache if used, instead try Xcache, apc can cause this kind of issues under particular enviroments causing segmentation faults.

4)  I recently found another cause of 502 bad gateway error, check it out here: php5-fpm.sock failed (13: Permission denied) error

Popular search terms:

9 Comments

  1. In regards to the issues between PHP-FPM and APC, what I found is that after a server reboot, PHP-FPM wouldn’t start any longer.

    I went and tried executing it manually from /usr/sbin/php-fpm <- this is where I saw there was an issue with APC, and after looking a bit online, I saw that by simply removing the "M" in /etc/php5/conf.d/apc.ini for the property: apc.shm_size=128 solved the issue.

    Hope this helps anyone.

    • I am pretty sure that this is a bad idea. In the php.ini file this is the rulesThe available options are K (for Kilobytes), M (for Megabytes) and G (for Gigabytes; available since PHP 5.1.0), these are case insensitive. Anything else assumes bytes.. I am getting this from the php website here. It does say this only pertains to the php.ini file but I bet this changes the value completely. It may have been that your was set too high. Maybe setting it to `48M` or lower would have been a good idea.

  2. What a brilliant site.
    I actually put into the location bar in Firefox for a google search: nginx “502 bad gateway” and instead of search results I got your page which fixed my problem in 5 min. I disabled apc and all my problems went away.
    Thank you.
    (How did you get google to treat you specially?)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>