Lỗi Gặp Phải
Bạn chạy nginx -s reload hoặc systemctl reload nginx và nhận được thông báo:
nginx: [error] invalid PID number "" in "/run/nginx.pid"
Hoặc đôi khi:
nginx: [error] invalid PID number "" in "/var/run/nginx.pid"
Dịch vụ có thể vẫn đang chạy, hoặc đã chết hoàn toàn. Dù thế nào, lệnh reload hay stop đều từ chối hoạt động.
Nguyên Nhân Thực Sự
Nginx lưu PID của tiến trình master vào một file (thường là /run/nginx.pid). Khi bạn gửi tín hiệu reload hoặc stop, Nginx đọc file đó để biết tiến trình nào cần nhận tín hiệu. Lỗi này có nghĩa là một trong ba trường hợp sau:
- File PID tồn tại nhưng rỗng (không có nội dung)
- File PID chứa nội dung không hợp lệ thay vì một con số
- File PID bị mất hoàn toàn, nhưng Nginx vẫn đang tìm kiếm nó
Có bốn nguyên nhân phổ biến: tắt máy không sạch, lần khởi động thất bại, khởi động lại hệ thống (xóa sạch thư mục tmpfs /run), hoặc race condition trong quá trình khởi động.
Bước 1: Kiểm Tra Trạng Thái Thực Tế
Trước khi làm bất cứ điều gì, hãy xác nhận xem Nginx có đang chạy không:
ps aux | grep nginx | grep -v grep
Bước tiếp theo phụ thuộc vào kết quả bạn thấy.
Trường hợp A: Nginx ĐANG chạy
Các tiến trình master và worker đều hiển thị — bản thân Nginx vẫn ổn. File PID chỉ bị hỏng hoặc bị xóa. Lấy PID thực và tạo lại file:
# Lấy PID của tiến trình master
ps aux | grep 'nginx: master' | grep -v grep | awk '{print $2}'
# Ghi vào file PID
sudo sh -c 'echo $(ps aux | grep "nginx: master" | grep -v grep | awk "{print \$2}") > /run/nginx.pid'
# Kiểm tra file có đúng không
cat /run/nginx.pid
Sau đó thử reload lại:
sudo nginx -s reload
Trường hợp B: Nginx KHÔNG chạy
File PID là dữ liệu ma. Dọn sạch và khởi động lại từ đầu:
# Xóa file PID cũ
sudo rm -f /run/nginx.pid
# Khởi động Nginx
sudo systemctl start nginx
Bước 2: Cách Xử Lý Đáng Tin Cậy — Dùng systemctl
Đang dùng distro có systemd (Ubuntu 16+, Debian 8+, CentOS 7+)? Bỏ thói quen gọi trực tiếp nginx -s reload cho các dịch vụ được quản lý. Hãy để systemd xử lý:
# Reload cấu hình (graceful, không downtime)
sudo systemctl reload nginx
# Hoặc restart nếu reload không hoạt động
sudo systemctl restart nginx
Khác với cách gửi tín hiệu trực tiếp, systemctl theo dõi trạng thái tiến trình thực tế — không chỉ phụ thuộc vào file PID có đúng không.
Bước 3: Xử Lý Nguyên Nhân Gốc — File PID Bị Xóa Khi Khởi Động Lại
Trên Ubuntu và Debian, /run là tmpfs — nó biến mất sau mỗi lần khởi động lại. Nếu Nginx khởi động thất bại giữa chừng — ví dụ lỗi cấu hình hoặc xung đột cổng — nó có thể ghi file PID rồi thoát, để lại file rỗng và không có tiến trình nào chạy.
Kiểm tra log khởi động:
sudo journalctl -u nginx --since "30 minutes ago" --no-pager
Lỗi cấu hình và xung đột cổng (như khi cổng 80 đã bị chiếm) sẽ hiển thị ở đây. Hãy sửa những lỗi đó trước, rồi kiểm tra lại cấu hình:
sudo nginx -t
Kết quả kiểm tra cấu hình thành công trông như sau:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Đừng tiến hành tiếp cho đến khi lệnh này chạy thành công.
Bước 4: Xác Nhận Đường Dẫn File PID Khớp Với Cấu Hình
Cấu hình Nginx khai báo vị trí lưu file PID. Nếu đường dẫn đó không khớp với những gì systemd mong đợi, lỗi này sẽ tiếp tục xảy ra. Kiểm tra cấu hình của bạn:
grep -i pid /etc/nginx/nginx.conf
Kết quả thường thấy:
pid /run/nginx.pid;
Xác nhận đường dẫn đó tồn tại và có quyền ghi:
# Liệt kê các file liên quan đến nginx trong /run
ls -la /run/ | grep nginx
# Nếu file PID tồn tại, nó phải chứa một số như 12345
cat /run/nginx.pid
Một số cấu hình dùng /var/run/nginx.pid thay vì /run/nginx.pid. Trên các hệ thống hiện đại, hai đường dẫn này thường là cùng một symlink, nhưng hãy xác nhận:
ls -la /var/run | grep nginx
# Thường hiển thị: /var/run -> /run
Bước 5: Nếu Vẫn Tiếp Diễn — Sửa Unit systemd
Trên các gói distro cũ, unit systemd của Nginx đôi khi được đóng gói với chỉ thị PIDFile không khớp. Kiểm tra file unit đang hoạt động:
sudo systemctl cat nginx
Tìm các dòng sau:
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
Nếu PIDFile không khớp với những gì trong nginx.conf, hãy sửa sự không khớp này. Cách sạch nhất là dùng systemd override — cách này tồn tại qua các lần cập nhật gói:
sudo systemctl edit nginx
Thêm đường dẫn đúng:
[Service]
PIDFile=/run/nginx.pid
Sau đó reload systemd và restart:
sudo systemctl daemon-reload
sudo systemctl restart nginx
Xác Nhận Đã Sửa Xong
# File PID phải chứa một số hợp lệ
cat /run/nginx.pid
# Kết quả mong đợi: một số như 1234
# Dịch vụ phải đang hoạt động
sudo systemctl status nginx
# Tìm dòng: Active: active (running)
# Kiểm tra reload hoạt động bình thường
sudo systemctl reload nginx
# Không có output = thành công
# Xác nhận các worker đang chạy
ps aux | grep nginx | grep -v grep
Tóm Tắt Nhanh: Cách Xử Lý Theo Từng Tình Huống
- File PID rỗng, Nginx đang chạy: Tạo lại file PID với PID master thực tế, rồi reload
- File PID rỗng, Nginx không chạy: Xóa file PID, chạy
nginx -t, rồi start - Xảy ra sau mỗi lần reboot: Kiểm tra
journalctlđể tìm lỗi khởi động — có gì đó đang thất bại trong quá trình boot - Đường dẫn cấu hình không khớp: Đồng bộ đường dẫn PID trong
nginx.confvới chỉ thịPIDFiletrong unit systemd
Chạy Với Quyền Non-Root Hoặc Trong Docker?
Tiến trình Nginx có thể không có quyền ghi vào /run/nginx.pid. Hãy chuyển file PID sang nơi tiến trình có thể ghi được:
pid /tmp/nginx.pid;
Cập nhật các script systemd hoặc init để khớp với đường dẫn mới. Lưu ý rằng thay đổi này yêu cầu restart hoàn toàn — không phải reload. Nginx chỉ bắt đầu ghi vào đường dẫn PID mới sau khi restart sạch.

