Sửa lỗi “502 Bad Gateway” của Nginx khi làm Proxy

0
536
(Last Updated On: Th1 2, 2019)

Chào các bạn, 502 Bad Gateway của Nginx là một lỗi thường xuyên xảy ra và cũng cực kỳ khó chịu vì khá nhiều nguyên nhân gây nên lỗi này. Đối với những bạn đã thông thạo khi sử dụng Nginx thì các bạn sẽ biết có nhiều hướng để khắc phục, nhưng đối với những người mới thì quả thực rất khó khăn mà không phải lúc nào cũng có thể khắc phục được. Có lần mình đã thấy một Topic trên Freelancer (thuê làm việc tự do trên mạng) đó là có một cô gái cần một kỹ thuật viên sửa lỗi 502 Bad Gateway trên VPS của cô ấy khi mà sau hơn 4 tiếng đồng hồ mày mò sửa lỗi vẫn không được với giá là 100 đô la Mỹ. Nhưng các bạn biết không, có ngay một anh kỹ thuật nhảy vào và chỉ sau 15 phút đã sửa được lỗi này.

Một thời gian sau khi dạo trên trang của StackOverflow thì mới biết rằng cô ấy bật mí đó là chỉ cần cấu hình lại PHP-FPM lắng nghe thông qua TCP thay vì Unix Socket:

nano /etc/php5/fpm/pool.d/www.conf

Và thay thế listen = /var/run/php5-fpm.sock thành listen = 127.0.0.1:9000

listen = 127.0.0.1:9000

Tiếp tục chỉnh trong tập tin Virtual host:

location ~ \.php$ {
            fastcgi_pass  127.0.0.1:9000;
            #fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
}

Tuy nhiên, lỗi 502 Bad Gateway có thể do nhiều nguyên nhân khác nữa, trường hợp với Nginx làm Proxy, nếu host Origin (máy chủ được Proxy trỏ đến) gặp sự cố thì Proxy cũng sẽ báo lỗi này, hoặc đơn giản như việc giao tiếp giữa Proxy và máy chủ Origin gặp gián đoạn hoặc sự cố nào đó cũng vậy. Có trường hợp không bên nào có lỗi và sự cố nhưng máy chủ hết thời gian chờ (do cấu hình chưa đủ lâu) chẳng hạn như trên Origin còn bận xử lý các Request mà chưa kịp phản hồi lại Proxy,… đều có thể trả về lỗi 502
Bad Gateway hoặc là 504 Gateway time out.

Chính vì thế nên sau đây là một số cấu hình khắc phục:

Trên máy chủ được Proxy trỏ đến, cho phép kết nối từ Proxy bằng cách chỉ định cho SELinux:

setsebool -P httpd_can_network_connect true

Thêm vào tập tin nginx.conf (có tác dụng với toàn bộ máy chủ web kể cả các cấu hình Virtual host):

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
proxy_max_temp_file_size 10000m;
proxy_connect_timeout       6000;
proxy_send_timeout          6000;
proxy_read_timeout          6000;
send_timeout                6000;
client_header_timeout 2400;
client_body_timeout 2400;
client_max_body_size 10000m;

Kiểm tra cấu hình DNS:

Đôi khi Proxy trỏ đến một host name, nhưng host name đó trỏ về một dải IP động, dịch vụ Nginx khi được bật thì liên tục chạy, đôi khi chưa kịp cập nhật IP mới (do host name thì cố định rồi), cũng sẽ trả về lỗi 502 Bad Gateway vì không thể kết nối đến máy chủ được Proxy, trường hợp này bạn cũng chỉ cần khởi động lại nginx là được:

service nginx restart

Nếu không muốn làm bằng tay thì chỉ cần cài đặt Cron Job là được:

crontab -e

Dán dòng sau vào cuối cùng:

0 */6 * * * /etc/init.d/nginx reload >/dev/null 2>&1

Như vậy tập tin trông sẽ như thế này:

Chúc các bạn thành công và không gặp lỗi này nữa.

Tạm biệt lỗi “502 Nginx Gateway”.

Bình luận