Trong môi trường marketing số ngày càng cạnh tranh, việc theo dõi và phân tích traffic quảng cáo một cách chính xác là yếu tố sống còn để tối ưu ngân sách và hiệu quả chiến dịch. Nginx – không chỉ là một web server hiệu suất cao mà còn là một công cụ ghi log cực kỳ linh hoạt – sẽ là nền tảng vững chắc giúp bạn thu thập dữ liệu truy cập từ các chiến dịch quảng cáo.
Đây là bài đầu tiên trong loạt ba bài viết hướng dẫn toàn diện, từ cấu hình cơ bản đến phân tích nâng cao, giúp bạn xây dựng hệ thống theo dõi hiệu quả quảng cáo dựa trên dữ liệu log Nginx. Trong bài này, chúng ta sẽ tập trung vào việc cấu hình Nginx và thiết lập định dạng log tùy chỉnh để đảm bảo thu thập đầy đủ và chính xác thông tin truy cập cần thiết cho bước phân tích sau này.

Thiết lập hệ thống ghi log traffic quảng cáo với Nginx (Phần 1): Cài đặt và cấu hình định dạng log
Phần 1 của Thiết lập hệ thống ghi log traffic quảng cáo với Nginx:
Chuẩn bị: Cài đặt Nginx (Nếu chưa có)
Cài đặt Nginx trên Ubuntu/Debian
Bước 1: Cập nhật danh sách gói phần mềm
Mở Terminal hoặc kết nối SSH đến máy chủ của bạn và chạy lệnh sau để cập nhật thông tin về các gói phần mềm mới nhất:
sudo apt update
Bước 2: Cài đặt Nginx
Thực thi lệnh cài đặt Nginx. Hệ thống sẽ tải về và cài đặt các gói cần thiết:
sudo apt install nginx
Trong quá trình này, bạn có thể sẽ được hỏi xác nhận; gõ Y và nhấn Enter.
Bước 3: Khởi động và kiểm tra trạng thái Nginx
Sau khi cài đặt hoàn tất, dịch vụ Nginx thường sẽ tự động khởi động. Bạn có thể kiểm tra và quản lý trạng thái của nó bằng các lệnh:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
Nếu Nginx đang chạy bình thường, bạn sẽ thấy dòng báo active (running).
Cài đặt Nginx trên CentOS 7
Bước 1: Cài đặt EPEL Repository
Nginx không có sẵn trong kho lưu trữ mặc định của CentOS 7, vì vậy bạn cần thêm EPEL Repository:
sudo yum install epel-release -y
Bước 2: Cài đặt Nginx
Sau khi thêm EPEL Repository, bạn có thể cài đặt Nginx:
sudo yum install nginx -y
Bước 3: Khởi động và kiểm tra trạng thái Nginx
Khởi động dịch vụ Nginx và thiết lập để nó tự động khởi động cùng hệ thống:
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
Nếu Nginx đang chạy bình thường, bạn sẽ thấy dòng báo active (running).
Bước 4: Cấu hình tường lửa (nếu cần)
Nếu bạn đang sử dụng firewalld, hãy mở cổng HTTP và HTTPS để cho phép lưu lượng truy cập:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
Sau khi hoàn tất các bước trên, bạn có thể truy cập địa chỉ IP công khai của máy chủ trên trình duyệt để kiểm tra xem trang chào mặc định của Nginx có hiển thị hay không. Nếu có, điều đó có nghĩa là Nginx đã được cài đặt và hoạt động bình thường.
Hiểu về cơ chế ghi log của Nginx
Nginx là một máy chủ web mạnh mẽ với hệ thống ghi log linh hoạt, cho phép bạn theo dõi và phân tích chi tiết các yêu cầu HTTP đến máy chủ. Việc hiểu rõ cơ chế ghi log của Nginx là bước quan trọng để giám sát hiệu suất, bảo mật và hiệu quả của các chiến dịch quảng cáo. Dưới đây là tổng quan về cách Nginx ghi log và cách bạn có thể tùy chỉnh nó:
Cơ chế ghi log trong Nginx
Nginx sử dụng hai chỉ thị chính để quản lý log:
log_format
Chỉ thị log_format cho phép bạn định nghĩa cấu trúc của từng dòng log bằng cách sử dụng các biến có sẵn của Nginx. Bạn có thể đặt tên cho định dạng này (ví dụ: main, combined, hoặc tên tùy chỉnh như ad_traffic) và sử dụng nó trong chỉ thị access_log. Ví dụ:
log_format my_custom_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Trong ví dụ trên, định dạng my_custom_format sẽ ghi lại địa chỉ IP của client, người dùng xác thực, thời gian yêu cầu, yêu cầu HTTP, mã trạng thái, số byte gửi đi, URL giới thiệu và thông tin trình duyệt.
access_log
Chỉ thị access_log xác định nơi lưu trữ log và định dạng log sẽ được sử dụng. Bạn có thể áp dụng chỉ thị này ở cấp độ http, server hoặc location. Ví dụ:
access_log /var/log/nginx/my_custom.log my_custom_format;
Lệnh trên sẽ ghi log theo định dạng my_custom_format vào tệp /var/log/nginx/my_custom.log.
Các biến thường dùng trong log_format
Nginx cung cấp nhiều biến để bạn có thể tùy chỉnh thông tin ghi log. Dưới đây là một số biến phổ biến:
$remote_addr: Địa chỉ IP của client.
$remote_user: Tên người dùng xác thực (nếu có).
$time_local: Thời gian server nhận yêu cầu (theo múi giờ địa phương).
$request: Dòng yêu cầu đầy đủ từ client (ví dụ: “GET /index.html HTTP/1.1”).
$status: Mã trạng thái HTTP mà server gửi về (ví dụ: 200, 404).
$body_bytes_sent: Số byte của phản hồi gửi đến client (không bao gồm header).
$http_referer: URL của trang giới thiệu (nếu có).
$http_user_agent: Thông tin về trình duyệt và hệ điều hành của client.
$request_time: Thời gian xử lý yêu cầu (tính bằng giây).
Ví dụ cấu hình ghi log tùy chỉnh
Dưới đây là ví dụ về cách cấu hình ghi log tùy chỉnh trong Nginx:
http {
log_format my_custom_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/my_custom.log my_custom_format;
server {
listen 80;
server_name example.com;
location / {
# Cấu hình khác
}
}
}
Trong cấu hình trên, Nginx sẽ ghi log theo định dạng my_custom_format vào tệp /var/log/nginx/my_custom.log cho tất cả các yêu cầu đến server example.com.
Lưu ý
- Nếu bạn không chỉ định định dạng log trong chỉ thị
access_log, Nginx sẽ sử dụng định dạng mặc định combined.
- Bạn có thể sử dụng chỉ thị
access_log off; để tắt ghi log cho một số location nhất định nếu cần thiết.
- Để ghi log dưới định dạng JSON, bạn có thể sử dụng tham số
escape=json trong chỉ thị log_format.
Xây dựng định dạng log tùy chỉnh cho traffic quảng cáo
Trong Nginx, định dạng log mặc định (thường là combined) cung cấp khá đầy đủ thông tin cơ bản về các request HTTP. Tuy nhiên, để phục vụ cho việc phân tích hiệu quả chiến dịch quảng cáo — đặc biệt là theo dõi hành vi người dùng, nguồn traffic, và các tham số định danh như UTM — chúng ta cần một định dạng log chi tiết và chuyên biệt hơn.
Tại sao cần định dạng log riêng cho quảng cáo?
Traffic đến từ quảng cáo thường mang theo các dữ liệu định danh quan trọng: tham số UTM trong URL, nguồn giới thiệu từ nền tảng quảng cáo, hoặc cookie chứa session/user ID. Việc tạo ra một định dạng log riêng giúp:
- Ghi nhận chính xác các trường dữ liệu phục vụ phân tích chuyển đổi và hành vi.
- Dễ dàng lọc, phân loại và truy vết traffic từ các chiến dịch quảng cáo.
- Hỗ trợ phân tích truy vấn và hành trình người dùng từ các nền tảng như Google Ads, Facebook Ads, Zalo Ads…
Các trường cần thiết trong định dạng log quảng cáo
Ngoài các trường cơ bản như IP, thời gian và mã trạng thái HTTP, cần đưa vào các biến sau:
$http_referer: Nguồn giới thiệu, giúp xác định người dùng đến từ đâu (Google, Facebook…).
$http_user_agent: Trình duyệt, thiết bị và hệ điều hành của người dùng.
$http_cookie: Thông tin định danh từ cookie (có thể chứa session/user ID).
$http_x_forwarded_for: IP thực tế của client khi đi qua proxy hoặc CDN.
$request_uri: Đường dẫn kèm query string — đây là nơi chứa các tham số UTM.
Cấu hình định dạng log ad_traffic
Trong khối http {} của file cấu hình chính (/etc/nginx/nginx.conf), thêm đoạn sau:
log_format ad_traffic '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_cookie" "$http_x_forwarded_for" '
'"$request_uri"';
Giải thích định dạng
$remote_addr: IP client.
$remote_user: Tài khoản xác thực (nếu có).
$time_local: Thời gian truy cập, theo múi giờ server.
$request: Câu lệnh HTTP đầy đủ (ví dụ: GET /landing?utm_source=fb HTTP/1.1).
$status: Mã trạng thái phản hồi (200, 404…).
$body_bytes_sent: Dung lượng dữ liệu gửi về.
$http_referer: Nguồn giới thiệu (ví dụ: từ Facebook hoặc Google).
$http_user_agent: Thông tin thiết bị và trình duyệt.
$http_cookie: Cookie từ client (phân tích kỹ trước khi dùng do liên quan đến quyền riêng tư).
$http_x_forwarded_for: IP gốc thực tế nếu có proxy/CDN.
$request_uri: Đường dẫn đầy đủ, bao gồm các tham số UTM cần phân tích.
Áp dụng cấu hình ghi log
Sau khi đã định nghĩa định dạng log tùy chỉnh ad_traffic, bước tiếp theo là áp dụng cấu hình ghi log này vào hệ thống Nginx. Việc này được thực hiện thông qua chỉ thị access_log, cho phép bạn xác định vị trí lưu trữ log và định dạng log sử dụng. Bạn có thể áp dụng cấu hình này ở các cấp độ khác nhau tùy theo phạm vi mong muốn.
Áp dụng cho toàn bộ máy chủ (khối http)
Để ghi log cho toàn bộ traffic trên máy chủ, bạn có thể đặt chỉ thị access_log trong khối http {} của file cấu hình chính (/etc/nginx/nginx.conf). Điều này đảm bảo tất cả các server block (Virtual Host) kế thừa cấu hình này, trừ khi có cấu hình ghi đè ở cấp độ server hoặc location.
http {
log_format ad_traffic '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_cookie" "$http_x_forwarded_for" '
'"$request_uri"';
access_log /var/log/nginx/ad_traffic.log ad_traffic;
# Các cấu hình khác...
}
Lưu ý: Bạn có thể định nghĩa nhiều access_log trong cùng một cấp độ để ghi log vào nhiều file khác nhau với các định dạng khác nhau nếu cần thiết.
Áp dụng cho một server cụ thể (khối server)
Nếu bạn muốn ghi log riêng biệt cho từng website hoặc domain cụ thể, hãy đặt chỉ thị access_log trong khối server {} tương ứng. Điều này giúp bạn dễ dàng phân tích traffic quảng cáo cho từng domain.
server {
listen 80;
server_name your_domain.com www.your_domain.com;
access_log /var/log/nginx/ad_traffic_your_domain.com.log ad_traffic;
# Các cấu hình khác...
}
Ưu điểm: Giúp phân tách log theo từng domain, thuận tiện cho việc phân tích và theo dõi hiệu quả của các chiến dịch quảng cáo riêng biệt.
Áp dụng cho một location cụ thể (khối location)
Trong trường hợp bạn chỉ muốn ghi log cho một đường dẫn cụ thể (ví dụ: trang landing page của chiến dịch quảng cáo), bạn có thể đặt chỉ thị access_log trong khối location {} tương ứng.
server {
# ...
location /landing-page-quang-cao/ {
access_log /var/log/nginx/ad_traffic_landing_page.log ad_traffic;
# Các cấu hình khác...
}
# ...
}
Lưu ý: Cấu hình access_log trong khối location sẽ ghi đè cấu hình ở cấp độ server hoặc http cho đường dẫn đó.
Lựa chọn cấp độ áp dụng phù hợp
- Toàn bộ máy chủ (http): Nếu bạn muốn ghi log cho tất cả các domain trên máy chủ vào một file chung.
- Một server cụ thể (server): Khi bạn cần phân tách log cho từng domain để dễ dàng phân tích.
- Một location cụ thể (location): Khi bạn chỉ quan tâm đến traffic của một đường dẫn cụ thể, như trang đích của chiến dịch quảng cáo.
Kiểm tra cấu hình và áp dụng thay đổi trong Nginx
Trước khi áp dụng bất kỳ thay đổi nào trong cấu hình Nginx, việc kiểm tra tính hợp lệ của file cấu hình là bắt buộc để tránh lỗi khiến dịch vụ web ngừng hoạt động. Sau khi xác nhận cấu hình hợp lệ, bạn cần tải lại (reload) Nginx để áp dụng thay đổi mà không làm gián đoạn dịch vụ.
Bước 1: Kiểm tra cấu hình Nginx
Nginx cung cấp công cụ tích hợp để kiểm tra cú pháp và tính hợp lệ của file cấu hình. Bạn nên thực hiện kiểm tra này sau mỗi lần chỉnh sửa các file cấu hình như nginx.conf hoặc các file trong sites-available.
Thực hiện lệnh sau trong Terminal hoặc SSH:
sudo nginx -t
Giải thích:
sudo: Chạy lệnh với quyền quản trị (root), cần thiết để đọc toàn bộ file cấu hình.
nginx -t: Kiểm tra cú pháp và tính hợp lệ của toàn bộ cấu hình mà không khởi chạy dịch vụ.
Kết quả:
- Nếu cấu hình hợp lệ, bạn sẽ thấy:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
- Nếu có lỗi, Nginx sẽ chỉ rõ file và dòng bị lỗi, ví dụ:
nginx: [emerg] unexpected end of file, expecting ";" in /etc/nginx/nginx.conf:45
=> Hãy sửa lỗi theo thông báo và chạy lại sudo nginx -t cho đến khi không còn lỗi.
Bước 2: Tải lại cấu hình Nginx
Sau khi xác nhận cấu hình hợp lệ, hãy yêu cầu Nginx tải lại cấu hình mà không dừng dịch vụ:
sudo systemctl reload nginx
Giải thích:
- Lệnh này không khởi động lại hoàn toàn Nginx mà chỉ gửi tín hiệu để Nginx đọc lại cấu hình.
- Các tiến trình mới sẽ áp dụng cấu hình mới, trong khi các tiến trình cũ hoàn tất kết nối hiện tại rồi tự động dừng.
Tại sao nên dùng reload thay vì restart?
| Lệnh |
Hành vi |
Ảnh hưởng |
| restart |
Dừng toàn bộ dịch vụ rồi khởi động lại |
Có thể gây gián đoạn kết nối |
| reload |
Chỉ tải lại cấu hình mới |
Không làm gián đoạn dịch vụ đang chạy |
Lời khuyên: Trên môi trường production, luôn ưu tiên dùng reload để giữ dịch vụ ổn định và tránh gián đoạn cho người dùng.
Sau khi reload thành công
Cấu hình lọc log traffic quảng cáo mới của bạn đã có hiệu lực. Từ thời điểm này, Nginx sẽ chỉ ghi log các yêu cầu có chứa dấu hiệu quảng cáo vào file log riêng biệt như bạn đã cấu hình.
Kết luận
Chúng ta vừa hoàn tất bước đầu tiên quan trọng trong hành trình phân tích traffic quảng cáo với Nginx: thiết lập hệ thống ghi log chi tiết, có cấu trúc rõ ràng và hướng tới mục tiêu phân tích. Việc nắm chắc cơ chế ghi log và cấu hình đúng định dạng log ad_traffic chính là nền tảng để tiếp tục lọc dữ liệu phù hợp và tối ưu hệ thống log trong môi trường thực tế.
Trong bài viết tiếp theo, chúng ta sẽ mở rộng cấu hình hiện có bằng cách áp dụng các kỹ thuật nâng cao như lọc log chỉ ghi nhận traffic từ quảng cáo, và tự động hóa việc xoay vòng – lưu trữ log, giúp bạn kiểm soát dung lượng và hiệu suất hệ thống hiệu quả hơn.