Cấu hình cơ bản trong Nginx

Trong bài viết này, chúng ta sẽ tìm hiểu các cấu hình cơ bản trong Nginx. Đây là những cấu hình quy định cách thức Nginx hoạt động trên hệ thống của chúng ta, trước khi nó thực hiện các chức năng của nó như web server, proxy server …

1. Kiến trúc tiến trình trong Nginx

Mỗi khi chạy Nginx, 1 tiến trình duy nhất tồn tại trong bộ nhớ – gọi là “Tiến trình chủ” (Master Process). Tiến trình này được chạy với quyền của tài khoản và nhóm tài khoản hiện tại – thường là root/root nếu dịch vụ được chạy tại thời gian khởi động bởi script init. Tiến trình chủ tự nó không xử lý bất kỳ yêu cầu nào từ người dùng, thay vào đó, nó sinh ra các tiến trình thực hiện việc xử lý này – gọi là “Tiến trình công nhân” (Worker Process).

Từ tập tin cấu hình, chúng ta có thể định nghĩa số tiến trình công nhân, số lượng kết nối tối đa cho mỗi tiến trình công nhân, tài khoản và nhóm tài khoản mà các tiến trình công nhân chạy dưới quyền.

nginx_process_arch

 

 2. Các cấu hình cơ bản trong Nginx

Các module cơ bản cung cấp các khai báo cho phép chúng ta định nghĩa các tham số của các chức năng cơ bản của Nginx. Có 3 module cơ bản là:

  • Core module: cung cấp các chức năng như quản lý tiến trình và bảo mật.
  • Events module: cho phép chúng ta cấu hình các cơ chế bên trong của khả năng kết nối mạng trong Nginx.
  • Configuration module: cho phép cơ chế đính kèm các tập tin cấu hình khác vào bên trong tập tin cấu hình chính của Nginx (thể hiện qua khai báo include).

2.1 Core module

  • daemon

Giá trị chấp nhận: on hoặc off

Giá trị mặc định: on

Bật hoặc tắt chế độ daemon. Chỉ nên tắt chế độ daemon cho mục đích debug, khi chúng ta muốn xác định nguyên nhân gì khiến cho Nginx không thể hoạt động.

Cú pháp:

daemon on;

  • env

Cho phép chúng ta định nghĩa hoặc tái định nghĩa các biến môi trường.

Cú pháp:

env MY_VARIABLE;

env MY_VARIABLE=my_value;

  • error_log

Sử dụng trong: main, http, server và location

Cú pháp:

error_log /file/path level;

Giá trị mặc định: logs/error.log error

Với level là 1 trong các giá trị sau: debug, info, notice, warn, error, và crit (các lỗi nghiêm trọng). Bằng việc chuyển hướng đầu ra của log đến /dev/null, chúng ta có thể tắt chức năng ghi nhật ký lỗi. Sử dụng khai báo sau tại đầu của tập tin cấu hình:

error_log /dev/null crit;

  • log_not_found

Sử dụng trong: main, http, server và location.

Bật hoặc tắt chức năng ghi nhật ký các lỗi 404 not found của HTTP.

Các giá trị được chấp nhận: on hoặc off.

Cú pháp:

log_not_found on;

  • master_process

Giá trị chấp nhận: on hoặc off

Giá trị mặc định: on

Nếu được enable, Nginx sẽ chạy nhiều tiến trình; 1 tiến trình chính (master process) và các tiến trình xử lý (worker process). Nếu bị disable, Nginx sẽ làm việc với 1 tiến trình duy nhất. Khai báo này nên được sử dụng cho mục đích kiểm tra chỉ khi nó tắt tiến trình master – client khi đó sẽ không thể kết nối đến server.

Cú pháp:

master_process on;

  • pid

Đường dẫn của tập tin pid của Nginx. Giá trị mặc định có thể được cấu hình trong lúc biên dịch.

Cú pháp:

pid /var/run/nginx/nginx.pid;

  • ssl_engine

Cú pháp:

ssl_engine enginename;

Với enginename là tên của bộ tăng tốc SSL phần cứng có sẵn trong hệ thống. Để kiểm tra các bộ tăng tốc SSL phần cứng có trong hệ thống, dùng lệnh sau:

# openssl engine -t

  • timer_resolution

Điều khiển khoảng thời gian giữa các lời gọi hệ thống đến gettimeofday() để đồng bộ đồng hồ nội bộ. Nếu giá trị này không được chỉ rõ, đồng hồ được làm mới sau mỗi thông báo sự kiện của nhân hệ điều hành.

Cú pháp:

timer_resolution 100ms;

  • user

Định nghĩa tài khoản người dùng, và nhóm người dùng được dùng để bắt đầu các tiến trình worker của Nginx.

Cú pháp:

user username groupname;

user username;

  • worker_priority

Định nghĩa độ ưu tiên cho các tiến trình worker, từ -20 (cao nhất) đến 19 (thấp nhất).

Giá trị mặc định là 0.

Lưu ý rằng, các tiến trình của nhân hệ điều hành chạy với độ ưu tiên là -5, chúng ta không nên thiết lập độ ưu tiên của các tiến trình worker là -5 hoặc thấp hơn.

Cú pháp:

worker_priority 0;

  • worker_processes

Định nghĩa số lượng worker process. Giá trị của khai báo này thường bằng với số lượng core của CPU trong hệ thống. Chúng ta có thể khai báo giá trị của khai báo này là auto, khi đó Nginx sẽ quyết định giá trị phù hợp cho khai báo này.

Cú pháp:

worker_processes 1;

worker_processes auto;

  • worker_rlimit_core

Định nghĩa kích thước của các tập tin cốt lõi  cho mỗi tiến trình worker.

Cú pháp:

worker_rlimit_core 100m;

  • worker_rlimit_nofile

Định nghĩa số lượng tập tin 1 tiến trình worker có thể sử dụng đồng thời.

Cú pháp:

worker_rlimit_nofile 10000;

  • worker_rlimit_sigpending

Định nghĩa số lượng tín hiệu có thể được đưa vào hàng đợi cho mỗi user (user ID của tiến trình gọi). Nếu hàng đợi đầy, các tín hiệu được bỏ qua khi vượt qua giới hạn này.

Cú pháp:

worker_rlimit_sigpending 10000;

  • working_directory

Thư mục làm việc được dùng cho các tiến trình worker, nó chỉ được sử dụng để định nghĩa vị trí của các tập tin cốt lõi. Tiến trình worker (chạy dưới quyền của tài khoản trong khai báo user) phải có quyền ghi trên thư mục này để có thể ghi các tập tin bên trong.

Cú pháp:

working_directory /usr/local/nginx;

  • worker_aio_requests

Nếu chúng ta sử dụng aio với phương thức xử lý kết nối epoll, khai báo này sẽ thiết lập số lượng tối đa các tác vụ I/O bất đồng bộ còn tồn tại cho 1 tiến trình worker.

Cú pháp:

worker_aio_requests 10000;

2.2.  Events module

Các khai báo của module Events được sử dụng bên trong khối events {} của tập tin cấu hình.

vd:

user nginx nginx;
master_process on;
worker_processes 4;
events {
        worker_connections 1024;
        use epoll;
}
[…]

Các khai báo của module Events gồm:

  • accept_mutex

Giá trị chấp nhận: on hoặc off

Giá trị mặc định: on

 Cho phép hoặc vô hiệu hóa việc sử dụng 1 mutex (mutual exclusion) để mở các socket nhận các kết nối.

Trong khoa học máy tính, Mutual Exclusion liên quan đến yêu cầu đảm bảo rằng không có 2 tiến trình đồng thời trong các khu vực then chốt tại cùng 1 thời điểm.

Cú pháp:

accept_mutex on;

  • accept_mutex_delay

 Giá trị mặc định: 500 milli giây.

Định nghĩa quãng thời gian 1 tiến trình worker sẽ đợi trước khi cố gắng yêu cầu tài nguyên 1 lần nữa. Giá trị này không được sử dụng nếu khai báo accept_mutex có giá trị là off.

Cú pháp:

accept_mutex_delay 500ms;

  • debug_connection

 Viết nhật ký chi tiết cho các client khớp với địa chỉ IP được khai báo. Thông tin debug được lưu trong tập tin được chỉ rõ trong khai báo error_log, cấu hình khai báo này với level là debug.

Lưu ý, Nginx phải được biên dịch với tùy chọn –debug để có thể sử dụng tính năng này.

Cú pháp:

debug_connection 172.63.155.21;

debug_connection 172.63.155.0/24;

  • multi_accept

Giá trị chấp nhận: on hoặc off

Giá trị mặc định: off

Định nghĩa Nginx chấp nhận hoặc không chấp nhận tất cả các kết nối đang đến cùng 1 lúc từ hàng đợi.

Cú pháp:

multi_accept off;

  • use

Các giá trị chấp nhận: /dev/poll, epoll, eventport, kqueue, rtsig hoặc select.

Chọn 1 mô hình sự kiện trong các giá trị có sẵn ở trên, hoặc Nginx sẽ tự động chọn 1 mô hình phù hợp nhất cho hệ thống.

Các mô hình được hỗ trợ là:

      • select: Mô hình chuẩn và mặc định, được sử dụng nếu hệ điều hành không hỗ trợ 1 mô hình khác hiệu quả hơn (đây là mô hình duy nhất có trên Windows). Phương thức này không được đề nghị cho các server chạy cao tải.
      • poll: được ưa thích hơn select, nhưng không có sẵn trên tất cả các hệ thống.
      • kqueue: 1 phương thức hiệu quả hơn select, được sử dụng cho các hệ điều hành FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 và MacOS X.  
      • epoll: 1 phương thức hiệu quả hơn select, được sử dụng cho các hệ điều hành dựa trên Linux 2.6+
      • rtsig: Real-time signals, có trên Linux 2.2.19, nhưng không phù hợp cho các server có traffic cao khi cấu hình hệ thống mặc định chỉ cho phép 1024 tín hiệu trong hàng đợi.
      • /dev/poll1 phương thức hiệu quả hơn select, được sử dụng cho các hệ điều hành Solaris 7 11/99+, HP/UX 11.22+, IRIX 6.5.15+, và Tru64 UNIX 5.1A+.
      • eventport: 1 phương thức hiệu quả cho Solaris 10, nhưng đòi hỏi 1 bản vá bảo mật.

Cú pháp:

use epoll;

  • worker_connections

Định nghĩa số lượng kết nối mà 1 tiến trình worker có thể xử lý đồng thời.

Cú pháp:

worker_connections 1024;

2.3. Configuration module

Module này cho phép chúng ta đính kèm tập tin với khai báo include.

Khai báo này có thể được đặt ở bất kỳ đâu trong tập tin cấu hình.

Cú pháp:

include /file/path.conf;

include sites/*.conf;

3. Các ví dụ cấu hình cụ thể của Nginx

–       Các cấu hình phần cứng

[table “” not found /]

–       Các khai báo chung:

user nginx nginx;

error_log /var/log/nginx/error.log error;

log_not_found on;

event {

     accept_mutex on;

     accept_mutex_delay 500ms;

     use epoll;

}

–       Các giá trị khai báo được đề nghị cho từng cấu hình.

[table “” not found /]

Lưu ý:

Đơn vị bộ nhớ trong Nginx:

  • k hoặc K: Kilobytes
  • m hoặc M: Megabytes

Giá trị thời gian trong Nginx

  • ms: Milli giây
  • s: Giây
  • m: Phút
  • h: Giờ
  • d: Ngày
  • w: Tuần
  • M: Tháng (30 ngày)
  • y: Năm (365 ngày).

Đơn vị thời gian mặc định trong Nginx là giây (second).

Đơn vị bộ nhớ mặc định trong Nginx là byte.