Sửa lỗi Nginx 'connect() to unix socket failed' cho PHP-FPM

beginner Nginx2026-06-24| Ubuntu 20.04/22.04, Debian, CentOS, Nginx 1.18+, PHP-FPM 7.4/8.0/8.1/8.2/8.3

Error Message

connect() to unix:/var/run/php/php8.1-fpm.sock failed (2: No such file or directory) while connecting to upstream
#nginx#php-fpm#quan-tri-linux#fastcgi#devops

Tình huống lỗi

Bạn vừa triển khai một trang web hoặc cập nhật máy chủ, và đột nhiên bạn gặp lỗi 502 Bad Gateway. Khi kiểm tra nhật ký lỗi (error logs) của Nginx tại /var/log/nginx/error.log, bạn thấy một thông báo cụ thể:

2023/10/15 10:30:05 [error] 1234#0: *1 connect() to unix:/var/run/php/php8.1-fpm.sock failed (2: No such file or directory) while connecting to upstream...

Thông báo này khá rõ ràng. Nginx đang cố gắng chuyển tiếp một yêu cầu đến PHP-FPM thông qua một tệp Unix socket, nhưng tệp đó đơn giản là không tồn tại. Không có kết nối đó, Nginx không thể xử lý mã PHP của bạn.

Tại sao Socket lại bị thiếu?

Ba nguyên nhân chính thường gây ra sự cố mất kết nối này:

  • Dịch vụ PHP-FPM đã dừng: Nếu dịch vụ không chạy, nó sẽ không tạo tệp .sock.
  • Sai lệch đường dẫn: Nginx đang tìm trong một thư mục (như /var/run/php/), nhưng PHP-FPM lại tạo socket ở nơi khác.
  • Nhầm lẫn phiên bản: Bạn vừa nâng cấp từ PHP 8.1 lên 8.2, nhưng cấu hình Nginx vẫn đang tìm socket cũ của 8.1.

Cách khắc phục

1. Kiểm tra PHP-FPM có đang chạy không

Bắt đầu với cách sửa lỗi hiển nhiên nhất. Nếu dịch vụ bị dừng, tệp socket sẽ biến mất. Chạy lệnh này, thay thế 8.1 bằng phiên bản cụ thể của bạn:

sudo systemctl status php8.1-fpm

Nếu kết quả hiển thị inactive (dead) hoặc failed, hãy khởi động lại nó:

sudo systemctl start php8.1-fpm

2. Tìm đường dẫn Socket thực tế

Đừng đoán vị trí của socket. Thay vào đó, hãy kiểm tra trực tiếp trong cấu hình PHP-FPM. Bạn có thể tìm thấy điều này trong tệp cấu hình pool, thường nằm tại /etc/php/[VERSION]/fpm/pool.d/www.conf.

Chạy lệnh grep này để tìm đường dẫn chính xác:

grep -E "^listen =" /etc/php/8.1/fpm/pool.d/www.conf

Bạn có thể sẽ thấy kết quả như listen = /run/php/php8.1-fpm.sock. Hãy ghi lại chuỗi ký tự chính xác này. Trên nhiều hệ thống, /var/run chỉ là một lối tắt đến /run, nhưng Nginx cần đường dẫn phải chính xác 100%.

3. Cập nhật cấu hình Nginx

Bây giờ, hãy đảm bảo Nginx cũng sử dụng thông tin tương tự. Mở tệp cấu hình trang web của bạn, thường nằm trong /etc/nginx/sites-available/.

sudo nano /etc/nginx/sites-available/example.com

Tìm khối location ~ \.php$. Đảm bảo dòng fastcgi_pass khớp với đường dẫn bạn đã tìm thấy ở Bước 2:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    # Đường dẫn này PHẢI khớp với chỉ thị 'listen' trong tệp www.conf của bạn
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

4. Xác minh phân quyền thư mục

Đôi khi tệp tin tồn tại, nhưng Nginx bị cấm truy cập vào nó. Thư mục chứa socket (thường là /var/run/php/) cần có quyền cho phép người dùng www-data truy cập. Thông thường, yêu cầu quyền 755 hoặc 775.

Kiểm tra quyền sở hữu thư mục:

ls -ld /var/run/php/

Nếu thư mục thuộc sở hữu của root và có quyền hạn chế (như 700), Nginx sẽ không thể kết nối ngay cả khi đường dẫn chính xác.

5. Áp dụng và Kiểm tra

Các thay đổi cấu hình sẽ không có hiệu lực cho đến khi bạn tải lại các dịch vụ. Luôn kiểm tra cú pháp Nginx trước khi khởi động lại để tránh làm sập trang web.

sudo nginx -t
sudo systemctl restart php8.1-fpm
sudo systemctl restart nginx

Cạm bẫy đa phiên bản

Nếu bạn cài đặt nhiều phiên bản PHP (ví dụ: 7.4, 8.1 và 8.3), rất dễ bị nhầm lẫn giữa chúng. Chạy ls -la /var/run/php/ để xem mọi socket đang hoạt động trên hệ thống. Nếu bạn thấy php8.3-fpm.sock nhưng cấu hình Nginx của bạn lại trỏ đến 8.1, bạn đã tìm ra nguyên nhân. Hãy cập nhật cấu hình Nginx để trỏ đến phiên bản thực sự đang chạy.

Xác minh cuối cùng

Để hoàn toàn chắc chắn socket đang hoạt động tốt, hãy chạy:

file /var/run/php/php8.1-fpm.sock

Hệ thống sẽ trả về: socket. Nếu thông báo trả về "No such file," hãy quay lại Bước 1. Nếu tệp đã có ở đó, hãy làm mới trình duyệt. Lỗi 502 của bạn sẽ biến mất và ứng dụng sẽ hoạt động trở lại.

Related Error Notes