Kiến thức Hữu ích 😍

Hướng Dẫn Thêm Module Log vào Nginx Trên CentOS 7 Dễ Dàng


Nginx không chỉ là một máy chủ web hiệu suất cao mà còn là một công cụ mạnh mẽ trong việc quản lý và điều phối lưu lượng truy cập Internet. Với khả năng xử lý hàng ngàn kết nối đồng thời một cách nhẹ nhàng, Nginx đã trở thành lựa chọn hàng đầu cho các hệ thống web lớn nhỏ. Tầm quan trọng của nó nằm ở kiến trúc bất đồng bộ, giúp tối ưu hóa việc sử dụng tài nguyên hệ thống và đảm bảo tốc độ phản hồi nhanh chóng. Tuy nhiên, để vận hành một máy chủ hiệu quả, việc giám sát hoạt động của nó là yếu tố không thể thiếu.

Đây chính là lúc các module log phát huy vai trò của mình. Module log trong Nginx có chức năng ghi lại mọi yêu cầu, lỗi, và sự kiện xảy ra trên máy chủ. Những bản ghi này là nguồn thông tin vô giá, giúp quản trị viên theo dõi tình trạng hệ thống, gỡ lỗi khi có sự cố, và phân tích hành vi người dùng. Trên CentOS 7, mặc dù Nginx đã có sẵn các module log cơ bản, việc thêm các module log tùy chỉnh hoặc của bên thứ ba sẽ mở ra nhiều khả năng giám sát chuyên sâu hơn. Bài viết này sẽ hướng dẫn bạn chi tiết từng bước để thêm một module log mới vào Nginx, từ khâu chuẩn bị môi trường đến việc biên dịch và kiểm tra hoạt động.

Hình minh họa

Các yêu cầu và phụ thuộc cần thiết trên CentOS 7

Trước khi bắt đầu quá trình biên dịch Nginx với module mới, việc chuẩn bị một môi trường đầy đủ và cập nhật là bước quan trọng nhất. Điều này đảm bảo quá trình biên dịch diễn ra suôn sẻ, tránh các lỗi không đáng có liên quan đến phiên bản phần mềm hoặc thiếu thư viện.

Kiểm tra và cập nhật hệ thống

Đầu tiên, hãy chắc chắn rằng hệ thống CentOS 7 của bạn đã được cập nhật lên phiên bản mới nhất. Việc này không chỉ giúp vá các lỗ hổng bảo mật mà còn đảm bảo tính tương thích của các gói phần mềm. Bạn có thể thực hiện việc này bằng một lệnh đơn giản.

Mở terminal và chạy lệnh sau với quyền root:
yum update -y

Lệnh này sẽ tự động kiểm tra, tải về và cài đặt tất cả các bản cập nhật có sẵn cho hệ điều hành và các gói phần mềm đã cài đặt. Quá trình này có thể mất vài phút tùy thuộc vào tình trạng hiện tại của hệ thống.

Cài đặt các gói phát triển cần thiết

Để biên dịch Nginx từ mã nguồn, bạn cần cài đặt một bộ công cụ phát triển và các thư viện cần thiết. Đây là những thành phần cung cấp trình biên dịch, tiện ích make, và các thư viện mà Nginx phụ thuộc vào để hoạt động.

Chạy lệnh sau để cài đặt tất cả các gói cần thiết cùng một lúc:
yum groupinstall "Development Tools" -y
yum install pcre-devel zlib-devel openssl-devel -y

Hãy cùng phân tích vai trò của từng gói:

  • Development Tools: Đây là một nhóm gói bao gồm các công cụ cơ bản như gcc (trình biên dịch C/C++), make (tiện ích tự động hóa quá trình biên dịch), và nhiều công cụ khác.
  • pcre-devel: Thư viện PCRE (Perl Compatible Regular Expressions) cần thiết cho Nginx để xử lý các biểu thức chính quy trong cấu hình, đặc biệt là trong các khối location.
  • zlib-devel: Thư viện này cho phép Nginx nén và giải nén các phản hồi HTTP bằng gzip, giúp tiết kiệm băng thông và tăng tốc độ tải trang.
  • openssl-devel: Cung cấp các thư viện cần thiết để Nginx có thể phục vụ nội dung qua HTTPS, một yêu cầu bảo mật cơ bản cho hầu hết các trang web hiện nay.

Sau khi hoàn tất các bước này, hệ thống của bạn đã sẵn sàng để tải và biên dịch mã nguồn Nginx.

Hình minh họa

Hướng dẫn tải mã nguồn Nginx thích hợp

Để thêm một module mới, chúng ta không thể thao tác trên phiên bản Nginx đã được cài đặt sẵn từ kho lưu trữ yum. Thay vào đó, chúng ta cần tải mã nguồn của chính phiên bản đó, thêm module và biên dịch lại.

Xác định phiên bản Nginx tương thích với module log

Bước đầu tiên và quan trọng nhất là xác định chính xác phiên bản Nginx bạn đang sử dụng. Việc biên dịch lại từ mã nguồn của cùng một phiên bản sẽ đảm bảo tính ổn định và tương thích, tránh gây ra lỗi không mong muốn.

Bạn có thể kiểm tra phiên bản Nginx hiện tại bằng lệnh:
nginx -v
Kết quả trả về sẽ có dạng như nginx version: nginx/1.16.1. Hãy ghi lại số phiên bản này (trong ví dụ là 1.16.1). Tiếp theo, truy cập vào trang tải xuống chính thức của Nginx (nginx.org/en/download.html) để tìm và tải về tệp mã nguồn .tar.gz tương ứng.

Tải và giải nén mã nguồn

Sau khi đã xác định được phiên bản cần thiết, hãy sử dụng lệnh wget để tải tệp mã nguồn về máy chủ của bạn. Giả sử chúng ta cần tải phiên bản 1.16.1.

Thực hiện lệnh sau trong terminal:
cd /usr/src/
wget http://nginx.org/download/nginx-1.16.1.tar.gz

Lệnh này sẽ tải tệp mã nguồn vào thư mục /usr/src/, một nơi phổ biến để lưu trữ mã nguồn trên các hệ thống Linux.

Khi quá trình tải về hoàn tất, bạn cần giải nén tệp vừa tải. Sử dụng lệnh tar để thực hiện việc này:
tar -zxvf nginx-1.16.1.tar.gz

Sau khi giải nén, một thư mục mới có tên nginx-1.16.1 sẽ được tạo ra. Đây chính là nơi chứa toàn bộ mã nguồn của Nginx và là nơi chúng ta sẽ thực hiện các bước cấu hình và biên dịch tiếp theo.

Hình minh họa

Cách cấu hình để thêm module log vào Nginx

Đây là bước cốt lõi của toàn bộ quy trình: thêm module log vào cấu hình biên dịch của Nginx. Quá trình này đòi hỏi sự chính xác để đảm bảo Nginx nhận diện và tích hợp module mới một cách chính xác.

Chuẩn bị mã nguồn module log (nếu là module bên ngoài)

Nếu bạn đang sử dụng một module log của bên thứ ba (không đi kèm sẵn với Nginx), bạn cần tải mã nguồn của module đó về trước. Thông thường, các module này được lưu trữ trên các nền tảng như GitHub.

Giả sử bạn cần thêm module ngx_http_json_log_module. Bạn sẽ tải nó về và giải nén.
cd /usr/src/
git clone https://github.com/blah/ngx_http_json_log_module.git

Sau khi tải về, bạn sẽ có một thư mục chứa mã nguồn của module. Hãy ghi nhớ đường dẫn đến thư mục này, ví dụ: /usr/src/ngx_http_json_log_module.

Chạy lệnh configure với tham số thêm module log

Trước khi chạy lệnh cấu hình mới, chúng ta cần biết Nginx hiện tại đã được biên dịch với những tham số nào. Điều này rất quan trọng để giữ lại tất cả các module và tính năng hiện có.

Chạy lệnh nginx -V (chữ V viết hoa) để xem các tham số cấu hình cũ. Bạn sẽ thấy một đoạn output dài, bắt đầu bằng configure arguments:. Hãy sao chép toàn bộ phần này.

Bây giờ, hãy di chuyển vào thư mục mã nguồn Nginx đã giải nén:
cd /usr/src/nginx-1.16.1

Tiếp theo, bạn sẽ chạy lệnh ./configure bằng cách dán lại các tham số đã sao chép và thêm tham số --add-module để chỉ định đường dẫn đến module log mới.

Ví dụ:
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx ... (các tham số cũ khác) ... --add-module=/usr/src/ngx_http_json_log_module

Giải thích các tùy chọn cấu hình:

  • ./configure: Là một script tự động kiểm tra các phụ thuộc trên hệ thống và tạo ra Makefile cần thiết cho quá trình biên dịch.
  • --prefix=/etc/nginx, --sbin-path=/usr/sbin/nginx, …: Đây là các tham số cũ giúp Nginx mới được cài đặt vào đúng các thư mục như phiên bản trước, đảm bảo tính nhất quán của hệ thống.
  • --add-module=path/to/log-module: Đây là tham số quan trọng nhất, nó yêu cầu trình biên dịch thêm mã nguồn từ đường dẫn được chỉ định vào quá trình build Nginx.

Sau khi chạy lệnh này, script sẽ kiểm tra môi trường. Nếu không có lỗi nào xảy ra, bạn đã sẵn sàng cho bước biên dịch.

Hình minh họa

Quy trình biên dịch và build lại Nginx với module log mới

Sau khi đã cấu hình thành công mã nguồn với module mới, bước tiếp theo là biên dịch và cài đặt phiên bản Nginx mới này để thay thế cho phiên bản cũ. Quá trình này cần được thực hiện cẩn thận để tránh làm gián đoạn dịch vụ.

Biên dịch Nginx với make và make install

Bây giờ, bạn vẫn đang ở trong thư mục mã nguồn của Nginx (/usr/src/nginx-1.16.1). Hãy chạy lệnh make để bắt đầu quá trình biên dịch.

make

Lệnh này sẽ đọc file Makefile được tạo ra từ bước ./configure và tiến hành biên dịch toàn bộ mã nguồn thành một tệp thực thi. Quá trình này có thể mất một vài phút.

Sau khi make hoàn tất mà không có lỗi, bạn cần cài đặt Nginx mới. Lưu ý quan trọng: Không nên chạy make install ngay lập tức, vì nó có thể ghi đè lên các tệp cấu hình hiện có của bạn. Thay vào đó, chúng ta chỉ cần thay thế tệp thực thi Nginx cũ.

Đầu tiên, hãy sao lưu tệp thực thi cũ để phòng trường hợp cần khôi phục:
mv /usr/sbin/nginx /usr/sbin/nginx.bak

Tiếp theo, sao chép tệp thực thi Nginx mới được tạo ra (nằm trong thư mục objs) vào vị trí của tệp cũ:
cp objs/nginx /usr/sbin/nginx

Khởi động lại dịch vụ Nginx với phiên bản đã được dựng mới

Trước khi khởi động lại Nginx, hãy kiểm tra xem cấu hình của bạn có hợp lệ không với tệp thực thi mới.
nginx -t

Nếu bạn nhận được thông báo “syntax is ok” và “test is successful”, mọi thứ đã sẵn sàng.

Bây giờ, hãy khởi động lại dịch vụ Nginx để áp dụng các thay đổi:
systemctl restart nginx

Cuối cùng, hãy kiểm tra lại phiên bản Nginx và các module đã được tải. Chạy lại lệnh nginx -V. Trong danh sách các configure arguments, bạn sẽ thấy tham số --add-module mà bạn đã thêm vào. Điều này xác nhận rằng Nginx đã được biên dịch thành công với module mới.

Hình minh họa

Kiểm tra và xác nhận module log hoạt động hiệu quả

Biên dịch thành công chỉ là một nửa chặng đường. Bước quan trọng tiếp theo là cấu hình và kiểm tra để đảm bảo module log mới thực sự hoạt động và ghi lại dữ liệu như mong đợi.

Cấu hình file log để kích hoạt module

Bây giờ, bạn cần chỉnh sửa tệp cấu hình chính của Nginx, thường là /etc/nginx/nginx.conf hoặc một tệp trong thư mục /etc/nginx/conf.d/, để sử dụng các chỉ thị (directives) mà module mới cung cấp.

Mỗi module log sẽ có cú pháp cấu hình riêng. Bạn cần tham khảo tài liệu của module đó để biết cách sử dụng. Ví dụ, với module ngx_http_json_log_module, bạn có thể cấu hình như sau trong khối http hoặc server:

log_format json_log '{ "timestamp": "$time_iso8601", '
                     '"client_ip": "$remote_addr", '
                     '"request": "$request", '
                     '"status": $status, '
                     '"body_bytes_sent": $body_bytes_sent, '
                     '"http_referer": "$http_referer", '
                     '"http_user_agent": "$http_user_agent" }';

access_log /var/log/nginx/access.json.log json_log;

Đoạn cấu hình này định nghĩa một định dạng log mới tên là json_log và yêu cầu Nginx ghi access_log vào tệp /var/log/nginx/access.json.log theo định dạng đó.

Theo dõi file log và kiểm tra dữ liệu ghi nhận

Sau khi lưu tệp cấu hình, hãy kiểm tra lại cú pháp một lần nữa và tải lại Nginx để áp dụng cấu hình mới.
nginx -t
systemctl reload nginx

Bây giờ, để kiểm tra xem log có được ghi hay không, bạn có thể sử dụng lệnh tail. Lệnh này cho phép bạn xem những dòng cuối cùng của một tệp và theo dõi các thay đổi trong thời gian thực.

Mở một terminal khác và chạy lệnh:
tail -f /var/log/nginx/access.json.log

Sau đó, hãy thử truy cập vào trang web của bạn từ trình duyệt hoặc sử dụng curl. Bạn sẽ thấy các dòng log mới xuất hiện ngay lập tức trong terminal với định dạng JSON mà bạn đã định nghĩa. Nếu dữ liệu được ghi nhận chính xác, bạn đã thành công trong việc tích hợp và kích hoạt module log mới.

Hình minh họa

Các lưu ý và mẹo khi sử dụng module log trên Nginx

Việc tích hợp và sử dụng module log mới mang lại nhiều lợi ích, nhưng cũng cần được quản lý một cách thông minh để không ảnh hưởng đến hiệu suất và sự ổn định của máy chủ. Dưới đây là một số lưu ý và mẹo quan trọng.

  • Đặt mức độ log phù hợp: Ghi log quá chi tiết (ví dụ: log debug) có thể tiêu tốn rất nhiều tài nguyên CPU và I/O của đĩa cứng. Chỉ nên bật các mức log chi tiết khi bạn đang trong quá trình gỡ lỗi. Đối với môi trường sản phẩm (production), hãy sử dụng mức log mặc định hoặc chỉ ghi những thông tin thực sự cần thiết.
  • Backup cấu hình trước khi chỉnh sửa: Đây là một quy tắc vàng. Trước khi thực hiện bất kỳ thay đổi nào đối với tệp nginx.conf hoặc quá trình biên dịch lại, hãy tạo một bản sao lưu. Một lệnh đơn giản như cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak có thể cứu bạn khỏi nhiều giờ khắc phục sự cố.
  • Theo dõi dung lượng file log và thiết lập log rotation: File log có thể phát triển rất nhanh, đặc biệt trên các trang web có lưu lượng truy cập cao, và có thể chiếm hết dung lượng đĩa. Hãy sử dụng các công cụ như logrotate để tự động nén, xoay vòng và xóa các tệp log cũ. Điều này giúp quản lý không gian lưu trữ một cách hiệu quả.
  • Khắc phục xung đột module và lỗi biên dịch: Khi thêm các module của bên thứ ba, có thể xảy ra xung đột với các module hiện có hoặc lỗi do không tương thích phiên bản. Hãy luôn đọc kỹ tài liệu của module và kiểm tra các báo cáo lỗi trên trang dự án. Nếu gặp lỗi biên dịch, thông báo lỗi thường sẽ chỉ ra thư viện hoặc phụ thuộc nào đang bị thiếu.

Hình minh họa

Các vấn đề thường gặp và cách khắc phục

Quá trình biên dịch và cấu hình Nginx có thể gặp một số trở ngại. Dưới đây là các vấn đề phổ biến và hướng dẫn cách xử lý chúng một cách hiệu quả.

Lỗi thiếu thư viện hoặc gói phụ thuộc khi build Nginx

Đây là lỗi phổ biến nhất khi chạy lệnh ./configure hoặc make. Thông báo lỗi thường rất rõ ràng, ví dụ như ./configure: error: the HTTP rewrite module requires the PCRE library. hoặc make: *** No rule to make target 'build', needed by 'default'. Stop..

Cách khắc phục:

  1. Đọc kỹ thông báo lỗi: Lỗi sẽ cho bạn biết chính xác thư viện nào đang bị thiếu. Ví dụ, “requires the PCRE library” có nghĩa là bạn cần pcre-devel.
  2. Sử dụng yum để tìm và cài đặt gói: Dùng lệnh yum search <tên thư viện> để tìm tên gói -devel tương ứng.
  3. Cài đặt gói cần thiết: Ví dụ, nếu thiếu PCRE, bạn chạy yum install pcre-devel -y. Sau khi cài đặt, hãy xóa thư mục mã nguồn cũ, giải nén lại và chạy lại ./configuremake.

Module log không hoạt động hoặc không ghi nhận dữ liệu

Sau khi đã biên dịch và khởi động lại Nginx, bạn thấy tệp log không được tạo ra hoặc không có dữ liệu mới.

Cách khắc phục:

  1. Kiểm tra lại cấu hình Nginx: Mở tệp nginx.conf và chắc chắn rằng bạn đã đặt đúng chỉ thị access_log hoặc error_log với đường dẫn và định dạng chính xác mà module yêu cầu.
  2. Kiểm tra quyền ghi file log: Nginx cần có quyền để tạo và ghi vào tệp log. Người dùng mà Nginx đang chạy (thường là nginx hoặc apache) phải có quyền ghi vào thư mục chứa tệp log. Ví dụ, nếu tệp log nằm ở /var/log/nginx/, hãy đảm bảo người dùng nginx sở hữu thư mục này: chown -R nginx:nginx /var/log/nginx/.
  3. Kiểm tra cú pháp và khởi động lại dịch vụ: Luôn chạy nginx -t sau mỗi lần thay đổi cấu hình. Nếu cú pháp đúng, hãy thực hiện systemctl restart nginx thay vì reload để đảm bảo tiến trình chính được làm mới hoàn toàn.
  4. Kiểm tra SELinux: Trên CentOS 7, SELinux có thể chặn Nginx ghi vào các vị trí không chuẩn. Kiểm tra log của SELinux tại /var/log/audit/audit.log để xem có cảnh báo nào liên quan đến Nginx không.

Hình minh họa

Best Practices

Để đảm bảo hệ thống Nginx của bạn hoạt động ổn định, hiệu quả và an toàn sau khi thêm module mới, hãy tuân thủ các thực hành tốt nhất sau đây.

  • Luôn sử dụng phiên bản Nginx ổn định và module tương thích: Tránh sử dụng các phiên bản Nginx “mainline” (đang phát triển) cho môi trường production. Hãy chọn phiên bản stable (ổn định) mới nhất. Đồng thời, hãy kiểm tra kỹ xem module bạn định thêm có tương thích hoàn toàn với phiên bản Nginx đó hay không.
  • Sao lưu dữ liệu và cấu hình trước khi thay đổi: Trước khi bắt đầu quá trình biên dịch lại hoặc chỉnh sửa cấu hình quan trọng, hãy tạo một bản sao lưu toàn bộ thư mục /etc/nginx và tệp thực thi /usr/sbin/nginx. Điều này giúp bạn nhanh chóng khôi phục lại trạng thái cũ nếu có sự cố xảy ra.
  • Theo dõi tài nguyên server khi bật logging chi tiết: Việc ghi log, đặc biệt là với các định dạng phức tạp như JSON, sẽ tiêu thụ thêm một phần tài nguyên CPU và I/O. Hãy sử dụng các công cụ giám sát như top, htop, iostat để theo dõi ảnh hưởng của việc ghi log lên hiệu suất hệ thống, đặc biệt là trong giờ cao điểm.
  • Sử dụng log rotation và công cụ quản lý file log tự động: Cấu hình logrotate là bắt buộc để ngăn chặn các tệp log chiếm đầy ổ đĩa. Bạn cũng có thể xem xét việc chuyển log đến một hệ thống quản lý log tập trung như ELK Stack (Elasticsearch, Logstash, Kibana) hoặc Graylog để phân tích và lưu trữ hiệu quả hơn.
  • Hạn chế ghi log quá chi tiết trong môi trường production: Trừ khi bạn đang tích cực gỡ lỗi một vấn đề cụ thể, hãy giữ cấu hình log ở mức tối thiểu cần thiết. Ghi lại mọi chi tiết nhỏ có thể làm giảm hiệu suất và tạo ra một lượng lớn dữ liệu không cần thiết, gây khó khăn cho việc phân tích.

Hình minh họa

Kết luận

Qua bài viết này, chúng ta đã cùng nhau đi qua toàn bộ quy trình chi tiết để thêm một module log mới vào Nginx trên hệ điều hành CentOS 7. Từ việc chuẩn bị môi trường, tải mã nguồn, cấu hình, biên dịch cho đến kiểm tra và khắc phục sự cố, mỗi bước đều đóng vai trò quan trọng trong việc đảm bảo hệ thống hoạt động ổn định và hiệu quả. Việc tùy chỉnh khả năng ghi log không chỉ giúp bạn giám sát máy chủ một cách sâu sắc hơn mà còn là nền tảng cho việc phân tích hiệu suất, phát hiện các vấn đề bảo mật và hiểu rõ hơn về hành vi người dùng.

AZWEB khuyến khích bạn áp dụng những kiến thức này vào thực tế để nâng cao khả năng quản trị máy chủ của mình. Việc làm chủ được quá trình biên dịch Nginx sẽ mở ra vô vàn khả năng tùy biến khác, giúp bạn xây dựng một hệ thống web mạnh mẽ và linh hoạt. Bước tiếp theo, bạn có thể tìm hiểu cách tích hợp các module khác như module bảo mật (ví dụ: ModSecurity) hoặc các module tối ưu hóa hiệu suất để hoàn thiện hơn nữa hạ tầng của mình. Chúc bạn thành công

Đánh giá