Tối ưu hóa hiệu năng và bảo mật cho Nginx Server

1. Ẩn thông tin phiên bản Nginx

Việc ẩn số phiên bản giúp ngăn chặn hacker thu thập thông tin để khai thác các lỗ hổng đã biết trên các bản Nginx cụ thể. Thay vì sử dụng các chỉ thị cấu hình thông thường, chúng ta có thể can thiệp trực tiếp vào mã nguồn trước khi biên dịch để thay đổi hoàn toàn định danh server.

Truy cập vào thư mục mã nguồn Nginx đã giải nén và chỉnh sửa các file sau:

# Chỉnh sửa định nghĩa phiên bản phần mềm
# File: src/core/nginx.h
#define NGINX_VERSION      "1.1.0" 
#define NGINX_VER          "WebSvr/" NGINX_VERSION

# Chỉnh sửa thông tin Header phản hồi
# File: src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: WebSvr" CRLF;

# Chỉnh sửa thông tin hiển thị trên trang lỗi mặc định (ví dụ 404)
# File: src/http/ngx_http_special_response.c
"<hr><center>WebSvr</center>" CRLF

Sau khi chỉnh sửa, thực hiện biên dịch và cài đặt với các tùy chọn bảo mật và tối ưu:

# Cài đặt các thư viện phụ thuộc
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

# Tạo người dùng riêng để chạy service
useradd -s /sbin/nologin -M webuser

# Cấu hình biên dịch
./configure --prefix=/usr/local/nginx \
--user=webuser --group=webuser \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-pcre

make && make install

2. Cấu hình định danh người dùng vận hành

Nếu trong quá trình biên dịch chưa chỉ định người dùng, bạn cần khai báo trong file cấu hình để đảm bảo Nginx không chạy dưới quyền root, giúp giảm thiểu rủi ro khi bị tấn công chiếm quyền kiểm soát.

# File: /usr/local/nginx/conf/nginx.conf
user webuser webuser;

3. Tối ưu hóa số lượng Worker Processes

Số lượng worker_processes nên được thiết lập dựa trên số lượng lõi CPU của hệ thống. Bạn có thể đặt giá trị cụ thể hoặc sử dụng auto để Nginx tự động nhận diện.

# Tự động điều chỉnh theo số lõi CPU
worker_processes auto;

Để kiểm tra số lõi CPU hiện có, sử dụng lệnh grep -c ^processor /proc/cpuinfo.

4. Thiết lập CPU Affinity (Gắn kết CPU)

Kỹ thuật này giúp cố định các tiến trình worker vào các nhân CPU cụ thể, giảm thiểu việc chuyển đổi ngữ cảnh (context switching) giữa các nhân, từ đó tăng hiệu suất xử lý.

# Ví dụ cho hệ thống có 4 nhân CPU
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;

5. Giới hạn số lượng file mở (File Descriptors)

Mặc định, hệ thống giới hạn số lượng file mà một tiến trình có thể mở. Đối với các hệ thống chịu tải cao, cần tăng giá trị này để tránh lỗi "Too many open files".

# Đặt giới hạn file mở cho mỗi worker
worker_rlimit_nofile 65535;

6. Sử dụng mô hình xử lý sự kiện Epoll

Trên các hệ điều hành Linux hiện đại, epoll là cơ chế I/O multiplexing hiệu quả nhất, cho phép xử lý hàng vạn kết nối đồng thời với mức tiêu thụ tài nguyên thấp.

events {
    use epoll;
    # Số lượng kết nối tối đa trên mỗi worker
    worker_connections 10240;
}

Tổng khả năng chịu tải tối đa của hệ thống sẽ bằng: worker_processes * worker_connections.

7. Quy tắc ưu tiên trong Server Name

Khi có nhiều khối server, Nginx sẽ tìm kiếm server_name phù hợp theo thứ tự ưu tiên sau:

  1. Khớp chính xác (Ví dụ: www.example.com)
  2. Khớp bằng ký tự đại diện ở đầu (Ví dụ: *.example.com)
  3. Khớp bằng ký tự đại diện ở cuối (Ví dụ: www.example.*)
  4. Khớp bằng biểu thức chính quy (Regex)
  5. Cấu hình mặc định (default_server)

8. Điều hướng với Location

Sử dụng Location để xử lý các yêu cầu URI cụ thể. Thứ tự ưu tiên của các ký hiệu:

  • = : Khớp chính xác hoàn toàn.
  • ^~ : Khớp tiền tố, nếu khớp sẽ dừng tìm kiếm regex.
  • ~ : Khớp regex có phân biệt hoa thường.
  • ~* : Khớp regex không phân biệt hoa thường.
  • / : Khớp mọi yêu cầu (mặc định).

9. Kích hoạt chế độ truyền tải file hiệu quả

Sử dụng sendfile để chuyển dữ liệu trực tiếp từ kernel space sang socket buffer mà không cần thông qua user space, giúp tăng tốc độ truyền tải file tĩnh.

http {
    sendfile on;
    tcp_nopush on; # Gửi gói tin lớn hơn, giảm số lượng gói tin trên mạng
    tcp_nodelay on; # Giảm độ trễ cho các gói tin nhỏ
}

10. Cấu hình Timeout cho kết nối

Thiết lập thời gian chờ hợp lý giúp giải phóng tài nguyên từ các kết nối treo hoặc kết nối không còn hoạt động.

# Thời gian giữ kết nối Keep-alive
keepalive_timeout 60;

# Thời gian chờ đọc header và body từ client
client_header_timeout 10;
client_body_timeout 10;

# Thời gian chờ khi gửi phản hồi cho client
send_timeout 10;

11. Giới hạn dung lượng tải lên

Để ngăn chặn các cuộc tấn công từ chối dịch vụ thông qua việc tải lên các file dung lượng lớn, hãy giới hạn client_max_body_size.

http {
    # Giới hạn file upload tối đa là 20MB
    client_max_body_size 20m;
}

Thẻ: nginx Performance tuning Web Server Security linux

Đăng vào ngày 31 tháng 5 lúc 01:07