Nginx là một web server có thể xử lý một lượng lớn các kết nối cùng lúc với hiệu suất cao. Nó thường được sử dụng để phục vụ nội dung tĩnh, reverse proxy và cân bằng việc tải yêu cầu từ HTTP. Tuy nhiên, để quản lý lưu lượng web một cách hiệu quả, việc log sự kiện của server để phân tích và sửa lỗi là rất quan trọng. Trong bài viết này, Vietnix sẽ hướng dẫn bạn cách thêm log module vào Nginx trên CentOS 7.
Giới thiệu về cách thêm log module vào Nginx trên CentOS 7 đơn giản
Quản trị máy chủ không chỉ liên quan đến cấu hình ban đầu của các dịch vụ. Nó còn bao gồm giám sát các dịch vụ đó và đảm bảo chúng hoạt động một cách mượt mà nhất có thể. Một trong những kiến thức quan trọng nhất đối với các quản trị viên là các log files, thứ chứa thông tin về các sự kiện của hệ thống.
Trong trường hợp sử dụng Nginx, các logs sẽ chứa thông tin giá trị về những lần truy cập vào tài nguyên thông qua web server. Những khách truy cập trang web, những hình ảnh và file được tải xuống, tất cả những thứ này sẽ được đăng ký trong các logs. Khi xảy ra lỗi, chúng sẽ được lưu trữ trong các logs. Khi làm việc với các log files có cấu trúc tốt sẽ giúp cho công việc thuận tiện hơn nhiều.
Trong bài viết này, Vietnix sẽ hướng dẫn cách sử dụng logging module của Nginx, thiết lập các log files riêng cho các server blocks khác nhau, sau đó tùy chỉnh logging output. Ngoài những yêu cầu mặc định đã có sẵn trong Nginx, bạn cũng sẽ thêm thông tin bổ sung về các yêu cầu (ví dụ trong hướng dẫn này là thời gian để phục vụ một yêu cầu) vào access log.
Điều kiện cần có để cách thêm log module vào Nginx trên CentOS 7 được triển khai
Để làm theo hướng dẫn, bạn cần có:
- Một server CentOS 7, một tài khoản sudo non-root.
- Nginx đã cài sẵn trên server này. (Hướng dẫn chi tiết về cách cài đặt Nginx trên CentOS 7 tại đây)
Bước 1: Tạo các file test
Bạn sẽ tạo một vài test file trong thư mục website mặc định của Nginx. Bạn sẽ sử dụng chúng để kiểm tra cấu hình logging của mình.
Khi Nginx (hoặc bất kỳ web server nào khác) nhận được yêu cầu HTTP cho một file, nó sẽ mở file đó và chuyển nội dung của nó qua mạng. File càng nhỏ, tốc độ truyền tải càng nhanh. Khi file được truyền tải hoàn toàn, yêu cầu đó được xem là hoàn tất. Sau đó quá trình truyền sẽ được ghi lại.
Về sau, bạn sẽ sửa đổi cấu hình logging để tổng hợp thông tin về thời gian mỗi yêu cầu mất bao lâu. Cách đơn giản nhất để kiểm tra cấu hình được sửa đổi và nhận thấy sự khác biệt giữa các yêu cầu khác nhau là tạo một vài test files có kích thước khác nhau. Nó sẽ được truyền tải trong từng khoảng thời gian khác nhau.
Hãy tạo một file có kích thước 1 megabyte có tên là 1mb.test
trong thư mục mặc định của Nginx bằng cách sử dụng lệnh truncate
.
sudo truncate -s 1M /usr/share/nginx/html/1mb.test
Tương tự, hãy tạo thêm hai file có kích thước khác nhau là 10 megabyte và 100 megabyte, đặt tên cho từng file tương ứng.
sudo truncate -s 10M /usr/share/nginx/html/10mb.test
sudo truncate -s 100M /usr/share/nginx/html/100mb.test
Tạo một file trống:
sudo touch /usr/share/nginx/html/empty.test
Bạn sẽ sử dụng các file này trong bước tiếp theo, để thêm nó vào log file bằng cấu hình mặc định.
Bước 2: Nắm rõ cấu hình mặc định
Log module là một trong những module cốt lõi của Nginx, điều này có nghĩa là nó không cần phải cài đặt riêng để sử dụng. Tuy nhiên, cấu hình mặc định là điều không thể thiếu. Trong bước này, chúng ta sẽ tìm hiểu cách cấu hình mặc định hoạt động.
Trên một cài đặt mới, Nginx sẽ ghi lại tất cả các yêu cầu vào hai file riêng biệt: access log và error log. Error log sẽ nằm tại /var/log/nginx/error.log
, nó lưu trữ thông tin về các lỗi bất thường của server hoặc lỗi khi xử lý yêu cầu.
Access log nằm tại /var/log/nginx/access.log
thường được sử dụng. Đây là nơi chứa những thông tin về tất cả các yêu cầu đến Nginx đã được lưu trữ. Trong log này, bạn có thể thấy người dùng đang truy cập vào các file nào, trình duyệt web họ đang sử dụng, địa chỉ IP của họ và mã trạng thái HTTP mà Nginx đã phản hồi cho mỗi yêu cầu.
Dưới đây là ví dụ về một dòng trong access log file. Đầu tiên, bạn sẽ sử dụng file trống mà bạn đã tạo từ Nginx ở Bước 1.
curl -i http://localhost/empty.test
Trong phần phản hồi, bạn sẽ thấy một vài phản hồi từ tiêu đề HTTP:
HTTP/1.1 200 OK
Server: nginx/1.6.3
Date: Fri, 05 Aug 2016 22:05:03 GMT
Content-Type: application/octet-stream
Content-Length: 0
Last-Modified: Fri, 05 Aug 2016 22:04:55 GMT
Connection: keep-alive
ETag: "57a50d87-0"
Accept-Ranges: bytes
Bạn có thể nắm được vài thông số qua phần phản hồi này:
HTTP/1.1 200 OK
cho biết Nginx đã phản hồi với mã trạng thái200 OK
thì không có lỗi xảy ra.Content-Length: 0
có nghĩa là tài liệu trả về có độ dài bằng không.- Yêu cầu đã được xử lý vào
Fri, 05 Aug 2016 22:05:03 GMT
(mốc thời điểm của bài viết).
Hãy xem xét điều này có khớp với những gì Nginx đã lưu trữ trong access log của nó hay không. Các log files chỉ có thể đọc được bằng tài khoản quản trị viên, vì vậy cần sử dụng sudo
để truy cập chúng.
sudo tail /var/log/nginx/access.log
Log sẽ chứa một dòng giống như thế này, tương ứng với yêu cầu kiểm tra mà chúng ta đã gửi trước đó.
::1 - - [05/Aug/2016:22:05:03 +0000] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.29.0" "-"
Nginx sử dụng định dạng Combined Log, đây là định dạng chuẩn của các access logs thường được sử dụng bởi các web servers để đảm bảo khả năng tương tác. Trong định dạng này, mỗi thông tin sẽ được phân tách bằng một khoảng trắng; còn dấu gạch ngang (-) sẽ đại diện cho các thông tin bị thiếu.
Từ trái sang phải, các danh mục là:
- IP of user đã yêu cầu tài nguyên. Bởi vì bạn đã sử dụng
curl
cục bộ nên địa chỉ trỏ đến server cục bộ là::1
. - Remote logging information: Ở đây luôn là dấu gạch ngang vì Nginx không hỗ trợ thông tin này.
- Username of logged user theo xác thực cơ bản HTTP. Đối với tất cả các yêu cầu ẩn danh, thông tin này sẽ trống.
- Request date bạn có thể thấy rằng điều này phù hợp với ngày từ tiêu đề của phần phản hồi.
- Request path bao gồm phương thức yêu cầu (
GET
), đường dẫn đến file được yêu cầu (/empty.text
) cũng như giao thức được sử dụng (HTTP/1.1
). - Response status code ở đây là
200 OK
, có nghĩa là thành công. - Lenght of transferred file ở đây là
0
vì file trống. - HTTP Referer header chứa địa chỉ của tài liệu nơi yêu cầu bắt nguồn. Trong ví dụ này, nó trống nhưng nếu đây là một file hình ảnh, header sẽ trỏ về trang có dùng hình ảnh đó. ( HTTP Referer header vốn viết sai chính tả của từ “referrer”, nên nó sẽ quay trở lại nguồn gốc của HTTP và là một phần của tiêu chuẩn HTTP )
- User agent là
curl
. - Header X-Forwarded-For, ở đây là trống. Nếu yêu cầu ban đầu đã được chuyển tiếp thông qua một proxy thì nó chứa thông tin về địa chỉ IP nguồn.
Ngay cả một log entry sẽ ghi những access log đơn lẻ chứa rất nhiều thông tin có giá trị về một yêu cầu. Tuy nhiên, có một thông tin quan trọng bị thiếu. Trong khi chúng ta đã yêu cầu địa chỉ chính xác của http://localhost/empty.test
, thì chỉ có đường dẫn đến file /empty.test
được hiển thị trong mục log entry và phần thông tin về tên server (ở đây là localhost
) đã bị mất.
Thêm log module vào Nginx trên CentOS 7 là một bước quan trọng trong việc quản lý máy chủ web của bạn. Việc ghi lại các hoạt động và sự kiện trong quá trình hoạt động của Nginx giúp bạn kiểm tra hiệu suất và bảo mật của hệ thống. Nếu bạn đang tìm kiếm một giải pháp VPS tin cậy để chạy Nginx và quản lý các hoạt động trên đó, hãy tham khảo các gói dịch vụ VPS của Vietnix.
Vietnix hiện tại đang cung cấp nhiều gói dịch vụ cho thuê máy chủ ảo (VPS) với cấu hình linh hoạt và giá cả phải chăng như VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp, VPS NVMe. Với VPS của Vietnix, bạn sẽ có một môi trường ổn định, bảo mật và hiệu suất cao để triển khai Nginx và tận dụng tối đa tính năng của log module.
Liên hệ ngay để được tư vấn chi tiết về các gói VPS của Vietnix.
Bước 3: Cấu hình một access log riêng biệt
Bạn sẽ ghi đè lên cấu hình logging mặc định của Nginx (nơi mà Nginx lưu trữ một acess log file cho tất cả các yêu cầu) và thay thế bằng cách lưu trữ các log file riêng biệt cho server block mặc định với Nginx.
Lưu trữ các log files riêng biệt cho mỗi server block, phân tách các logs từ các trang web khác nhau một cách hiệu quả. Không chỉ làm cho các log files nhỏ hơn mà quan trọng hơn là làm cho việc phân tích các logs dễ dàng hơn để phát hiện lỗi và hoạt động đáng ngờ.
Để thay đổi cấu hình Nginx server block mặc định, mở Nginx server block để cấu hình file bằng vi
hoặc trình chỉnh sửa văn bản yêu thích của bạn.
sudo vi /etc/nginx/nginx.conf
Tìm cấu hình server
block, có dạng như sau:
. . .
server {
listen 80 default_server;
listen [::]:80 default_server;
. . .
Và thêm hai dòng dưới vào cấu hình như sau:
. . .
server {
listen 80 default_server;
listen [::]:80 default_server;
access_log /var/log/nginx/default-access.log;
error_log /var/log/nginx/default-error.log;
. . .
Directive access_log
đặt ra đường dẫn để lưu trữ các acess logs, còn error_log
thực hiện điều tương tự cho error logs. Bạn sẽ sử dụng chung một thư mục với các logs Nginx mặc định (/var/log/nginx
), nhưng với các tên tập tin khác nhau. Nếu bạn có nhiều server blocks, nên đặt tên các log files một cách nhất quán và có ý nghĩa, giống như việc sử dụng tên miền trong tên file.
Lưu và đóng file để thoát.
Lưu ý: Để giữ các log files phù hợp cho mỗi server block, bạn phải thay đổi cấu hình ở trên, mỗi khi muốn tạo một server block mới trong cấu hình Nginx.
Để kích hoạt cấu hình mới, khởi động lại Nginx.
sudo systemctl restart nginx
Để kiểm tra cấu hình mới, thực hiện yêu cầu tương tư cho file trống như lúc nãy.
curl -i http://localhost/empty.test
Hãy kiểm tra xem dòng log có tương tự như những dòng đã được thêm vào file riêng đã cấu hình không.
sudo tail /var/log/nginx/default-access.log
Trong bước tiếp theo, bạn sẽ tùy chỉnh định dạng của các log trong file mới và bổ sung thêm thông tin.
Bước 4: Cấu hình Custom Log Format
Bạn sẽ thiết lập một custom logging format để Nginx ghi thêm thông tin (thời gian xử lý yêu cầu) và cấu hình server block mặc định để sử dụng định dạng mới này.
Bạn cần hiểu rõ về định dạng log mới trước khi sử dụng. Trong Nginx, mỗi log format sẽ có một tên duy nhất dùng cho toàn bộ server. Các server riêng lẻ có thể được cấu hình để sử dụng các định dạng đó sau này bằng cách sử dụng tên của các định dạng đó.
Để định nghĩa new logging format, tạo một file cấu hình mới có tên timed-log-format.conf
trong thư mục cấu hình bổ sung của Nginx.
sudo vi /etc/nginx/conf.d/timed-log-format.conf
Thêm những nội dung sau:
log_format timed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http_x_forwarded_for" $request_time';
Lưu và đóng file để thoát.
Directive cấu hình log_format
được xem là định dạng log mới. Phần tiếp theo là định danh độc nhất của định dạng này; ở đây sử dụng “timed“, nhưng bạn có thể chọn bất kỳ tên nào khác.
Định dạng log được chia thành ba dòng để dễ dàng cho việc đọc. Nginx hiển thị thông tin về tất cả các yêu cầu trong các biến hệ thống, có tên được đặt trước bởi ký hiệu $. Những biến này sẽ được thay thế bằng thông tin thực về yêu cầu trong khi ghi chi tiết yêu cầu vào access log (ví dụ, $request_addr
sẽ được thay thế bằng địa chỉ IP của khách truy cập).
Định dạng trên giống với Common Log Format ở trên. Nhưng vẫn có một sự khác biệt là: Thêm biến hệ thống $request_time
vào cuối cùng. Nginx sử dụng biến này để lưu trữ thời gian yêu cầu đã mất và tính thời gian bằng đơn vị mili giây (ms). Người dùng sử dụng biến này trong log format để Nginx hiểu và ghi lại thông tin vào đây.
Bạn đã có một định dạng log tùy chỉnh tên là “timed” được xác định trong cấu hình Nginx, nhưng server block mặc định vẫn chưa sử dụng định dạng này. Tiếp theo, hãy mở file cấu hình server block Nginx.
sudo vi /etc/nginx/nginx.conf
Tìm cấu hình server
block mà bạn đã sửa đổi trước đó và thêm tên định dạng nhật ký là timed
vào cài đặt access_log
như dưới:
. . .
server {
listen 80 default_server;
listen [::]:80 default_server;
access_log /var/log/nginx/default-access.log timed;
error_log /var/log/nginx/default-error.log;
. . .
Lưu và đóng file để thoát.
Để kích hoạt cấu hình mới, khởi động lại Nginx.
sudo systemctl restart nginx
Bước 5: Xác nhận cấu hình mới
Tương tự như trong bước 2, bạn có thể kiểm tra cấu hình mới bằng cách đưa ra một số yêu cầu cho Nginx bằng curl
. Trong lần này, bạn sẽ sử dụng các file mẫu được tạo ra trong bước 1:
curl -i http://localhost/empty.test
curl -i http://localhost/1mb.test
curl -i http://localhost/10mb.test
curl -i http://localhost/100mb.test
Khi các file trở nên lớn hơn điều đó có nghĩa là sẽ mất nhiều thời gian hơn để chuyển chúng.
Sau khi thực hiện các yêu cầu đó hãy dùng lệnh tail
để xem access log.
sudo tail /var/log/nginx/default-access.log
Log sẽ chứa nhiều dòng hơn nhưng bốn dòng cuối cùng sẽ tương ứng với các yêu cầu kiểm tra mà bạn vừa thực hiện.
::1 - - [05/Aug/2016:22:14:04 +0000] "GET /empty.test HTTP/1.1" 200 0 "-" "curl/7.29.0" "-" 0.000
::1 - - [05/Aug/2016:22:14:04 +0000] "GET /1mb.test HTTP/1.1" 200 1048576 "-" "curl/7.29.0" "-" 0.000
::1 - - [05/Aug/2016:22:14:07 +0000] "GET /10mb.test HTTP/1.1" 200 10485760 "-" "curl/7.29.0" "-" 2.063
::1 - - [05/Aug/2016:22:15:10 +0000] "GET /100mb.test HTTP/1.1" 200 104857600 "-" "curl/7.29.0" "-" 47.318
Mỗi lần sẽ hiển thị một đường dẫn khác nhau, việc hiển thị đúng tên file và kích thước yêu cầu sẽ tăng lên sau mỗi lần. Quan trọng là những số cuối cùng của dòng lệnh trong log, đó chính là thời gian xử lý yêu cầu được tính bằng mili giây, mà bạn vừa cấu hình trong định dạng custom log.
$request_time
là một trong số nhiều biến hệ thống Nginx cung cấp để sử dụng trong custom logging configurations. Các biến khác bao gồm giá trị của response headers gửi phản hồi đến máy khách. Thêm các biến khác vào log format rất dễ dàng bằng cách đặt chúng trong chuỗi log format giống như cách mà bạn đã làm với $request_time
. Đây là một công cụ bổ ích giúp bạn có thể sử dụng để tùy chỉnh cấu hình ghi nhật ký cho các trang web của bạn.
Vietnix có 11 năm kinh nghiệm trong lĩnh vực cung cấp dịch vụ hosting, VPS tốc độ cao tại Việt Nam và đồng hành cùng 50.000+ khác hàng cũng như các thương hiệu như iVIVU.com, Vietnamwork, KINGFOOD, UBGroup, GTV,…
Để đảm bảo các gói VPS khi đến tay khách hàng đều đạt tốc độ truy cập nhanh, ổn định và khả năng bảo mật cao, Vietnix đã đầu tư mạnh mẽ về hạ tầng phần cứng và công nghệ hiện đại.
Với tỷ lệ 97% khách hàng đánh giá 5 sao sau khi sử dụng, Vietnix đã khẳng định sự đáng tin cậy và uy tín của mình trong lĩnh vực VPS tại Việt Nam. Việc nhận được giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022 cũng là một minh chứng cho sự nỗ lực không ngừng của Vietnix trong việc mang đến dịch vụ tốt nhất cho khách hàng.
Nếu có vấn đề thắc mắc, liên hệ với Vietnix để được tư vấn:
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
Lời kết
Truyền file dung lượng lớn mất thời gian và không hữu ích, nhưng Nginx hữu ích khi xử lý dynamic web. Nó giúp theo dõi nút nghẽn trong website và tìm các yêu cầu tốn thời gian nhanh hơn. Nếu còn thắc mắc gì về cách thêm log module vào Nginx trên CentOS 7, bạn hãy để lại bình luận bên dưới.