Trang chủ / Magento / Sửa lỗi 502 Bad Gateway trên NGINX khi nâng cấp PHP 7
sửa lỗi 502 bad gateway nginx khi update php
Lỗi 502 NGINX Bad Gateway

Sửa lỗi 502 Bad Gateway trên NGINX khi nâng cấp PHP 7

PHP7 mới ra mắt và theo như công bố của Zend thì tốc độ được cải thiện ít nhất là 2 lần và có khá nhiều bạn muốn thử nhưng lại gặp lỗi 502 Bad Gateway khi dùng NGINX webserver. Đây là một lỗi rất phổ biến của NGINX không cứ update PHP mới bị. Và với kinh nghiệm của mình thì lỗi 502 Bad Gateway do 4 nguyên nhân chính, mình sẽ giải thích từng nguyên nhân một trong bài và hướng dẫn bạn cách khắc phục, chắc chắn sẽ khắc phục lỗi này 100% :D

Nếu bạn nào còn chưa nâng cấp lên PHP7 thì cũng nên cân nhắc update càng sớm càng tốt vì blog Crazytut mình đã cài đặt PHP 7, cho tốc độ load rất nhanh, mình đã viết bài hướng dẫn nâng cấp hoặc cài mới PHP7 trên blog, bạn xem tại đây

Lỗi 502 Bad Gateway này có nghĩa là gì?

Một gateway(cổng) giống như một điểm truy cập, là cầu nối giữa một dịch vụ này với một dịch vụ khác. Trong trường hợp này, gateway có thể source WordPress, Magento chạy trên PHP và đang gửi nhận dữ liệu qua NGINX webserver. Do vậy lỗi này có nghĩa là có một vấn đề làm gián đoạn kết nối giữa NGINX và PHP. Vậy cách giải quyết là gì?

Cách 1: PHP có đang chạy không

Như mình đã nói ở trên, giả sử PHP không chạy thì NGINX không thể kết nối và gây ra lỗi 502 Bad Gateway do đó giải pháp đầu tiền là kiểm tra xem PHP có đang chạy không, chạy lệnh sau để kiểm tra

PHP5:

service php5-fpm status

PHP7:

service php7.0-fpm status

Nếu nó có dòng php-fpm7.0 is running  hay php-fpm5 is runningchính tỏ PHP đang chạy chuyển sang cách 2 còn nếu không chạy thì bật nó lên thôi

PHP5:

service php5-fpm start

PHP7:

service php7.0-fpm start

Cách 2: PHP đang có đang được cấu hình đúng Port

Như bạn đã biết, các ứng dụng trong Linux khi chạy thường kết nối đến một cổng nhất định, PHP cũng vậy và thường là cổng 9000. Nếu nó bạn cấu hình không đúng cổng PHP cho NGINX thì nó cũng gây ra lỗi 502 Bad Gateway502 Bad Gateway. Bạn có kiểm tra trong /etc/php5/fpm/pool.d/www.conf (php5) hoặc /etc/php/7.0/fpm/pool.d/www.conf (php7)

The address on which to accept FastCGI requests. 
; Valid syntaxes are: 
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on 
; a specific port
; 
; 'port' - to listen on a TCP socket to all addresses on a 
; specific port
; 
; '/path/to/unix/socket' - to listen on a unix socket. 
; Note: This value is mandatory. listen = 127.0.0.1:9000

Sau đó bạn kiểm tra lại file cấu hình domain của NGINX xem có đúng là mình đang cấu hình đúng cổng cho PHP không

location ~ \.php$ {
	try_files $uri =404;
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_index index.php;
	include fastcgi_params;       
}

Như đoạn code bên trên là bạn là cấu hình đúng Port NGINX giống với Port trong PHP, sau đó lưu lại, khởi động lại NGINX và PHP xem có được không, nếu không được bạn có thể thay dòng fastcgi_pass 127.0.0.1:9000; bằng fastcgi_pass unix:/var/run/php5-fpm.sock; (php5) hoặc fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; (php7) sau đó cũng khởi động lại PHP và NGINX, chắc chắn được nếu lỗi do sai Port, lệnh khởi động lại là

server nginx restart

service php5-fpm restart(php5)

service php7.0-fpm restart (php7)

Vẫn không được thì sang cách 3

Cách 3: Sửa file cấu hình của NGINX

Đôi khi lỗi này gây ra do chính NGINX vì nó không thể load nổi PHP do một lí do nào đó như server yếu, nhiều người truy cập, … do đó bạn thử tăng giá trị của NGINX lên, thường thì lỗi này mình hay bị khi cài mới NGINX và sa khi tăng là chạy bình thường, bạn mở file /etc/nginx/nginx.conf và thêm giá trị sau vào trong cặp http{}, chú ý nếu tồn tại các giá trị này rồi thì sửa lại cho giống với của mình nếu khoogn sẽ bị lỗi trùng lặp, đặt như thế này

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

Vẫn không được thì cách 4 sẽ phải được, lỗi này khá phổ biến nhưng ít người nghĩ ra, đó là do vấn đề phân quyền. Chắc bạn cũng biết trong Linux nó có phân quyền user, group cho các tập tin thư mục, nếu thư mục code của bạn mà PHP hay NGINX nó không có quyền thì cũng sẽ gây ra lỗi 502 Bad Gateway

Cách 4: Chỉnh lại quyền cho tập tin

Để chỉnh được quyền đúng thì bạn mở file /etc/php/7.0/fpm/pool.d và tìm đến dòng:

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = www-data
group = www-data

Bạn nhìn thấy giá trị www-data, đó là giá trị mặc định của PHP, nếu không giống thì cũng sửa lại thành www-data và tiếp tục mở file /etc/nginx/nginx.conf nhìn ngay dòng đầu tiên, chữ user sửa lại cho nó giống với PHP là www-data

user www-data;
worker_processes auto;

Sau đó lưu và khởi động lại NGINX và PHP,  câu lệnh khởi động lại mình nói bên trên rồi

Còn nữa, quay ra SSH và chạy lệnh sau, thay /var/www/public_html bằng đường dẫn tới thư mục code của bạn

chown -R www-data:www-data /var/www/public_html/*

Như vậy là mình là hướng dẫn bạn 4 cách khắc phục lỗi 502 Bad Gateway trên NGINX, mình chắc chắn là làm theo 4 cách trên sẽ khắc phục được lỗi, có vấn đề gì comment bên dưới mình giúp!

Nếu bạn thấy có ích, hãy subcribe blog của tôi để nhận thêm nhiều tút hay qua email nữa nhé!