Sửa lỗi Nginx: 24: Too Many Open Files Error

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.

Cấu hình Vhost, SSl trên Nginx

With Nginx, it is very easy to configure your virtual host to use a secure connection.
Với Nginx, khá dễ dàng cấu hình virtual host để sử dụng HTTPS

Chế độ mặc định

Enabling SSL support for your site is very simple and involves the addition of just a few lines to the virtual host file.
Để bật SSL cho website của bạn thật đơn giản bằng cách bạn chỉ cần thêm vào một vài dòng ở trong Virtualhost file.

Mở virutal host file:

sudo nano /etc/nginx/sites-available/bantron.vn

Ví dụ file virutal host của tôi sẽ được cấu hình như sau:

server {

listen 80;
server_name http://www.bantron.vn;
rewrite ^/(.*) http://www.bantron.vn/$1 permanent;

}

server {

listen 80;
server_name http://www.bantron.vn;

access_log /home/demo/public_html/www.bantron.vn/logs/access.log;
error_log /home/demo/public_html/www.bantron.vn/logs/error.log;

location / {

root /home/demo/public_html/www.bantron.vn/public/;
index index.html;

}

}

Port 443

Để sử dụng HTTPS webserver cần lắng nghe từ cổng 443:
Bạn cần chuyển từ cổng 80 sang cổng 443

server {

listen 80;
server_name http://www.bantron.vn;
rewrite ^/(.*) http://bantron.vn/$1 permanent;

}

server {

listen 80;
server_name bantron.vn;

access_log /home/demo/public_html/bantron.vn/logs/access.log;
error_log /home/demo/public_html/bantron.vn/logs/error.log;

location / {

root /home/demo/public_html/bantron.vn/public/;
index index.html;

}

}

server {

listen 443;
server_name http://www.bantron.vn;
rewrite ^/(.*) http://www.bantron.vn/$1 permanent;

}

server {

listen 443;
server_name http://www.bantron.vn;

access_log /home/demo/public_html/www.bantron.vn/logs/access.log;
error_log /home/demo/public_html/www.bantron.vn/logs/error.log;

location / {

root /home/demo/public_html/www.bantron.vn/public/;
index index.html;

}

}

Bạn đã xong bước 1

Certificate Location

Tiếp theo, bạn cần chỉ rõ đường dẫn của các file certificate. Như vậy bạn cần thêm những dòng sau vào trong virtualhost:

ssl on;
ssl_certificate /etc/ssl/certs/myssl.crt;
ssl_certificate_key /etc/ssl/private/myssl.key;

Sau khi thêm:

server {

listen 443;

ssl on;
ssl_certificate /etc/ssl/certs/myssl.crt;
ssl_certificate_key /etc/ssl/private/myssl.key;

server_name http://www.bantron.vn;
....
}

Khởi động lại Nginx:

sudo /etc/init.d/nginx restart

SSL certificates sử dụng với Nginx

Thư mục cài đặt mặc định
Trong Debian và Ubutu thư mục mặc định đặt certificates là /etc/ssl. Trong đó có 2 thư mục con là “cert” và “private”.
Trong bài viết này, tôi để các file tạo ra trong thư mục mặc định trên.
Home

Trước hết, bạn tạo thư mục tạm để lưu các file được sinh ra:

mkdir /home/demo/temp
...
cd /home/demo/temp

Sinh Mã
Đầu tiên, ta cần tạo khóa riêng( private key). Ở bước này, đòi hỏi bạn gõ 1 đoạn mã vào. Nhưng ta sẽ xóa nó ở bước sau:
openssl genrsa -des3 -out myssl.key 1024

Trong quá trình, bạn sẽ được yêu cầu gõ một đoạn mã tùy ý vào.

CSR

Bây giờ ta cần tạo ra một CSR (Certificate Signing Request):

openssl req -new -key myssl.key -out myssl.csr

Quá trình này yêu cầu bạn nhập một số thông tin:

Country Name: VN

State or Province Name: HaNoi

Locality Name: HaDong

Organization Name: Egos Ltd

Organizational Unit Name: Web Development

Common Name: http://www.bantron.vn

Email Address: webadmin@bantron.vn

Với các thuộc tính “extra” bạn có thể để trống.

Xóa đoạn mã (passphrase)

Khi sinh ra file myssl.key , bạn đã phải gõ vào một đoạn mã. Như vậy sẽ không thuận tiện, nếu như webserver khởi động lại, bạn sẽ phải nhập đoạn mã đó vào.Vấn đề sẽ trở nên nghiêm trọng nếu máy của bạn bị khởi động lại.

Cách đơn giản là ta bỏ đoạn mã đó đi.

cp myssl.key myssl.key.org
openssl rsa -in myssl.key.org -out myssl.key

Bạn sẽ được yêu cầu nhập đoạn mã vừa xong vào một lần nữa.

Bây giờ ta có các file sau:

ls
...
myssl.csr myssl.key myssl.key.org

CRT

Cuối cùng ta cần tạo file ssl certificate:

openssl x509 -req -days 365 -in myssl.csr -signkey myssl.key -out myssl.crt

Xong. Bây giờ bạn copy các file tương ứng vào thư mục /etc/ssl/

sudo cp myssl.crt /etc/ssl/certs/
sudo cp myssl.key /etc/ssl/private/

Clean up

Bạn kiểm tra ssl certificate và có thể xóa các file tạm đi.
Summary
Sau khi copy các file vào thư mục cần /etc/ssl/ , bạn đã có thể cấu hình Nginx để serve dịch vụ HTTPS.