Sửa lỗi Nginx: 24: Too Many Open Files Error
Tháng Tư 26, 2012 Bình luận về bài viết này
Tuần vừa rồi, Khi máy chủ chạy Ngix bị lỗi do máy chủ của tôi hosting quá nhiều website( vài trăm site).
Nginx bị lỗi, các website không truy cập được. Khi vào xem log thì thấy thông báo sau:
2010/04/16 13:24:16 [crit] 21974#0: *3188937 open() “/usr/local/nginx/html/50x.html” failed (24: Too many open files), client: 88.x.y.z, server: example.com, request: “GET /file/images/background.jpg HTTP/1.1”, upstream: “http://10.8.4.227:81//file/images/background.jpg”, host: “example.com”
Nguyên nhân là do Ngix mở quá nhiều file khi chạy.
Trong Linxux, cần phải tăng số file giới hạn được mở cho hệ điều hành.
Bạn có thể làm như sau:
su – nginx
Để xem số softfile và hard file hệ điều hành cho phép mở, bạn gõ lệnh sau:
ulimit -Hn
ulimit -Sn
Có 2 cách sau để chỉnh sửa lỗi:
Cách 1 Tăng số file giới hạn ở mức hệ điều hành
Your operating system set limits on how many files can be opened by nginx server. You can easily fix this problem by setting or increasing system open file limits under Linux. Edit file /etc/sysctl.conf, enter:
Hệ điều hành thường thiết đặt số file được mở bởi nginx. Bạn có thể tăng con số này lên bằng cách:
# vi /etc/sysctl.conf
Thêm vào dòng sau:
fs.file-max = 70000
Lưu file lại. Sửa file /etc/security/limits.conf:
# vi /etc/security/limits.conf
Đặt lại soft và hard limt cho người dùng chạy nginx server:
nginx soft nofile 10000
nginx hard nofile 30000
Lưu file. Sau đó chạy lệnh sau để thay đổi:
# sysctl -p
Cách 2 Thay đổi tham số trong Nginx config
Nginx có tham số là worker_rlimit_nofile cho phép tự thay đổi số file cần mở trong ở mức tiến trình. Để cấu hình số lượng file tối đa được mở. Biên tập file nginx.conf:
# vi /usr/local/nginx/conf/nginx.conf
Thêm dòng sau:
# set open fd limit to 30000
worker_rlimit_nofile 30000;
Lưu file, reload lại nginx webserver
# /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload
# su – nginx
Kiểm tra các thông số
$ ulimit -Hn
$ ulimit -Sn
:
30000
10000
Nếu các cách trên vẫn không được. Bạn vào file khởi động: /etc/init.d/nginx
thêm vào các dòng sau:
ulimit -Hn 30000
ulimit -Sn 10000
Chúc may mắn.