Hướng dẫn cấu hình Nginx reverse proxy cho Apache trên Ubuntu 20.04

Chào bạn, trong thế giới web server là gì hiện đại, web server đóng vai trò như trái tim của mọi website, chịu trách nhiệm xử lý yêu cầu từ người dùng và trả về nội dung tương ứng. Trong nhiều năm, Apache là gì đã là một lựa chọn phổ biến và mạnh mẽ. Tuy nhiên, khi website phát triển và lượng truy cập tăng cao, việc chỉ sử dụng Apache có thể dẫn đến các vấn đề về hiệu năng, đặc biệt là trong việc xử lý nhiều kết nối đồng thời và phục vụ các tệp tĩnh. Để giải quyết bài toán này, một giải pháp tối ưu đã ra đời: sử dụng Nginx là gì làm reverse proxy đứng phía trước Apache. Mô hình này kết hợp sức mạnh của cả hai, giúp tối ưu hiệu suất, tăng cường bảo mật và cải thiện khả năng mở rộng. Bài viết này sẽ hướng dẫn bạn chi tiết từ khái niệm, cách cài đặt, cấu hình, cho đến việc kiểm tra và quản lý hệ thống Nginx reverse proxy Apache trên Ubuntu 20.04.

Giới thiệu về Nginx và Apache

Để hiểu rõ hơn về giải pháp kết hợp này, chúng ta cần tìm hiểu về hai thành phần chính: Nginx và Apache. Việc nắm vững đặc điểm của từng web server sẽ giúp bạn biết tại sao chúng lại là một cặp đôi hoàn hảo.

Tổng quan về Apache và Nginx

Apache, ra đời từ năm 1995, là một trong những web server lâu đời và được sử dụng rộng rãi nhất. Nó nổi tiếng với sự linh hoạt, cấu trúc module mạnh mẽ và khả năng tùy biến cao thông qua các tệp .htaccess. Apache hoạt động tốt với các nội dung động, đặc biệt là PHP, nhờ vào module mod_php. Tuy nhiên, mô hình xử lý dựa trên tiến trình hoặc luồng của Apache có thể tiêu tốn nhiều tài nguyên khi phải xử lý hàng ngàn kết nối cùng lúc.

Ngược lại, Nginx (phát âm là “engine-x”) được tạo ra vào năm 2004 để giải quyết bài toán C10k – xử lý mười nghìn kết nối đồng thời. Nginx sử dụng kiến trúc bất đồng bộ, hướng sự kiện, giúp nó tiêu thụ rất ít bộ nhớ và có thể xử lý một lượng lớn kết nối một cách hiệu quả. Chính vì ưu điểm này, Nginx thường được dùng để phục vụ các tệp tĩnh (hình ảnh, CSS, JavaScript) và làm reverse proxy hoặc load balancer.

Khái niệm Web Server và Reverse Proxy

Web server là một phần mềm chạy trên máy chủ, có nhiệm vụ chính là nhận các yêu cầu HTTP từ trình duyệt của người dùng, tìm kiếm tài nguyên tương ứng (như file HTML, ảnh) và gửi chúng trở lại. Nó là cầu nối cơ bản giữa website của bạn và người dùng trên toàn thế giới. Cả Apache và Nginx đều là những web server mạnh mẽ.

Vậy reverse proxy là gì? Hãy tưởng tượng reverse proxy như một người lễ tân tại một tòa nhà văn phòng lớn. Thay vì khách truy cập tự đi tìm phòng ban mình muốn, họ sẽ đến quầy lễ tân. Người lễ tân sẽ tiếp nhận yêu cầu, xác định đúng phòng ban cần đến và dẫn đường hoặc chuyển tiếp thông điệp. Trong thế giới web, Nginx đóng vai trò “lễ tân” này. Nó nhận tất cả yêu cầu từ người dùng, sau đó phân loại và chuyển tiếp những yêu cầu phù hợp đến các máy chủ ứng dụng phía sau (trong trường hợp này là Apache). Người dùng cuối không bao giờ tương tác trực tiếp với Apache, mà chỉ làm việc thông qua Nginx.

Hình minh họa

Lợi ích khi sử dụng Nginx làm reverse proxy phía trước Apache

Việc kết hợp Nginx và Apache không chỉ là một giải pháp tình thế mà mang lại những lợi ích vượt trội về hiệu năng và bảo mật. Mô hình này cho phép bạn tận dụng điểm mạnh của từng web server để xây dựng một hệ thống vững chắc và hiệu quả.

Tăng hiệu suất xử lý và phân tải

Một trong những lợi ích lớn nhất là cải thiện hiệu suất đáng kể. Nginx cực kỳ hiệu quả trong việc xử lý các tệp tĩnh như hình ảnh, CSS, và JavaScript. Khi một yêu cầu đến, Nginx sẽ kiểm tra. Nếu đó là yêu cầu cho một tệp tĩnh, Nginx sẽ tự xử lý và trả về cho người dùng mà không cần làm phiền đến Apache. Điều này giúp giảm tải đáng kể cho Apache.

Apache giờ đây chỉ cần tập trung vào thế mạnh của mình: xử lý nội dung động, ví dụ như các kịch bản PHP. Bằng cách phân chia công việc rõ ràng, hệ thống của bạn sẽ phản hồi nhanh hơn và có khả năng chịu tải tốt hơn nhiều. Nginx với kiến trúc hướng sự kiện có thể dễ dàng quản lý hàng ngàn kết nối đồng thời, giúp website của bạn không bị quá tải trong giờ cao điểm.

Hình minh họa

Tăng cường bảo mật và quản lý lưu lượng

Khi Nginx đứng trước Apache, nó tạo ra một lớp bảo vệ vững chắc. Máy chủ Apache sẽ không còn tiếp xúc trực tiếp với Internet, giúp che giấu thông tin và cấu trúc của nó. Mọi cuộc tấn công tiềm tàng từ bên ngoài sẽ phải đối mặt với Nginx trước tiên.

Nginx cung cấp nhiều tính năng bảo mật mạnh mẽ. Bạn có thể dễ dàng cấu hình tường lửa, giới hạn số lượng yêu cầu từ một địa chỉ IP (rate limiting) để chống lại các cuộc tấn công từ chối dịch vụ (DDoS) hoặc brute-force. Hơn nữa, bạn có thể thực hiện SSL/TLS termination tại Nginx. Điều này có nghĩa là Nginx sẽ chịu trách nhiệm giải mã các kết nối HTTPS, giảm tải công việc mã hóa cho Apache và đơn giản hóa việc quản lý chứng chỉ SSL.

Cách cài đặt và cấu hình Nginx trên Ubuntu 20.04

Bây giờ, hãy bắt đầu các bước thực hành để cài đặt và cấu hình Nginx. Quá trình này khá đơn giản trên Ubuntu 20.04 nhờ vào trình quản lý gói apt.

Hướng dẫn cài đặt Nginx

Trước khi cài đặt bất kỳ phần mềm nào, bạn nên cập nhật danh sách gói của hệ thống. Hãy mở terminal và chạy lệnh sau:

sudo apt update

Sau khi quá trình cập nhật hoàn tất, bạn có thể cài đặt Nginx bằng một lệnh duy nhất:

sudo apt install nginx

Hệ thống sẽ tự động tải về và cài đặt phiên bản Nginx ổn định nhất từ kho lưu trữ của Ubuntu.

Sau khi cài đặt xong, dịch vụ Nginx sẽ tự động khởi động. Để chắc chắn mọi thứ hoạt động bình thường, bạn hãy kiểm tra trạng thái của dịch vụ Nginx:

sudo systemctl status nginx

Nếu bạn thấy dòng chữ active (running) màu xanh lá, xin chúc mừng, Nginx đã được cài đặt và đang chạy thành công trên máy chủ của bạn.

Hình minh họa

Cấu hình Nginx làm web server cơ bản

Tệp cấu hình chính của Nginx nằm tại /etc/nginx/nginx.conf, nhưng các cấu hình cho từng trang web riêng lẻ thường được đặt trong thư mục /etc/nginx/sites-available/. Chúng ta sẽ tạo một tệp cấu hình mới cho trang web của mình.

Hãy tạo một tệp mới, ví dụ tenmien_cua_ban, trong thư mục sites-available:

sudo nano /etc/nginx/sites-available/tenmien_cua_ban

Bên trong tệp này, bạn có thể thêm một khối server (còn gọi là virtual host) cơ bản như sau:

server {
    listen 80;
    listen [::]:80;

    server_name tenmien_cua_ban www.tenmien_cua_ban;

    root /var/www/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

Cấu hình này yêu cầu Nginx lắng nghe trên cổng 80 cho tên miền tenmien_cua_ban và phục vụ các tệp từ thư mục /var/www/html. Sau khi lưu tệp, bạn cần kích hoạt nó bằng cách tạo một liên kết tượng trưng đến thư mục sites-enabled:

sudo ln -s /etc/nginx/sites-available/tenmien_cua_ban /etc/nginx/sites-enabled/

Cuối cùng, hãy kiểm tra cú pháp cấu hình và tải lại Nginx để áp dụng thay đổi:

sudo nginx -t

sudo systemctl reload nginx

Cách thiết lập reverse proxy chuyển tiếp yêu cầu đến Apache

Đây là phần cốt lõi của bài hướng dẫn, nơi chúng ta sẽ cấu hình Nginx để chuyển tiếp các yêu cầu xử lý nội dung động sang cho Apache.

Cấu hình reverse proxy trong file config Nginx

Đầu tiên, chúng ta cần cấu hình Apache để nó lắng nghe trên một cổng khác, ví dụ như 8080, thay vì cổng 80 mặc định (vì Nginx đã sử dụng cổng này). Tiếp theo, hãy mở lại tệp cấu hình virtual host của Nginx mà chúng ta đã tạo:

sudo nano /etc/nginx/sites-available/tenmien_cua_ban

Bây giờ, chúng ta sẽ sửa đổi khối location để chuyển tiếp các yêu cầu đến Apache. Cấu hình sẽ trông giống như sau:

server {
    listen 80;
    server_name tenmien_cua_ban www.tenmien_cua_ban;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Trong đó:

  • proxy_pass http://127.0.0.1:8080;: Đây là chỉ thị quan trọng nhất, yêu cầu Nginx chuyển tiếp mọi yêu cầu trong khối location / đến Apache đang chạy ở địa chỉ 127.0.0.1 và cổng 8080.
  • Các dòng proxy_set_header: Các chỉ thị này giúp chuyển tiếp thông tin gốc của yêu cầu (như tên miền, địa chỉ IP thực của người dùng) đến Apache. Điều này rất quan trọng để Apache có thể ghi log và hoạt động chính xác.

Hình minh họa

Cấu hình Apache để hỗ trợ reverse proxy

Bây giờ, chúng ta cần điều chỉnh Apache để nó hoạt động hài hòa với Nginx. Đầu tiên, hãy thay đổi cổng lắng nghe của Apache. Mở tệp cấu hình cổng của Apache:

sudo nano /etc/apache2/ports.conf

Tìm dòng Listen 80 và đổi nó thành Listen 8080.

Tiếp theo, bạn cần chỉnh sửa tệp virtual host của Apache. Mở tệp cấu hình mặc định:

sudo nano /etc/apache2/sites-available/000-default.conf

Thay đổi dòng <VirtualHost *:80> thành <VirtualHost *:8080>. Điều này đảm bảo Apache chỉ nhận kết nối trên cổng 8080.

Sau khi đã thay đổi cấu hình, hãy lưu các tệp lại và khởi động lại Apache để áp dụng:

sudo systemctl restart apache2

Cuối cùng, đừng quên tải lại Nginx để nó nhận cấu hình reverse proxy mới:

sudo systemctl reload nginx

Bây giờ, hệ thống của bạn đã được cấu hình hoàn chỉnh. Nginx sẽ nhận yêu cầu từ cổng 80 và chuyển tiếp chúng đến Apache trên cổng 8080.

Kiểm tra và tối ưu hiệu năng của hệ thống web server

Sau khi cài đặt và cấu hình, việc kiểm tra và tối ưu là bước không thể thiếu để đảm bảo hệ thống hoạt động ổn định và hiệu quả nhất.

Công cụ kiểm tra hiệu năng và log

Có nhiều công cụ giúp bạn đánh giá hiệu suất hệ thống. curl là một công cụ đơn giản để kiểm tra tiêu đề HTTP và đảm bảo reverse proxy đang hoạt động. Ví dụ, lệnh curl -I http://tenmien_cua_ban sẽ cho bạn thấy tiêu đề Server: nginx, xác nhận rằng Nginx đang xử lý yêu cầu.

Để kiểm tra tải, bạn có thể dùng ab (ApacheBench). Lệnh như ab -n 1000 -c 100 http://tenmien_cua_ban/ sẽ mô phỏng 100 người dùng truy cập đồng thời, gửi tổng cộng 1000 yêu cầu, giúp bạn thấy được tốc độ phản hồi của máy chủ dưới áp lực. Ngoài ra, htop là một công cụ giám sát tài nguyên hệ thống tuyệt vời, cho phép bạn xem mức sử dụng CPU, RAM của các tiến trình Nginx và Apache trong thời gian thực.

Đừng quên kiểm tra các tệp log. Log của Nginx (thường ở /var/log/nginx/access.logerror.log) và Apache (ở /var/log/apache2/) là nguồn thông tin vô giá để phát hiện lỗi và các điểm nghẽn hiệu năng.

Hình minh họa

Tối ưu cấu hình

Tối ưu hóa là một quá trình liên tục. Dưới đây là một vài phương pháp cơ bản:

  • Cache: Tận dụng tính năng cache của Nginx (proxy_cache) để lưu trữ các phản hồi từ Apache. Khi có yêu cầu tương tự, Nginx sẽ trả về nội dung từ cache mà không cần hỏi lại Apache, giúp tăng tốc độ đáng kể.
  • Nén Gzip: Bật tính năng nén Gzip trong Nginx (gzip on;) để giảm kích thước các tệp văn bản (HTML, CSS, JS) trước khi gửi cho người dùng. Điều này giúp tiết kiệm băng thông và tăng tốc độ tải trang.
  • Keep-alive: Tinh chỉnh keepalive_timeout để cho phép tái sử dụng các kết nối TCP, giảm độ trễ cho các yêu cầu liên tiếp từ cùng một người dùng.
  • Worker Processes: Điều chỉnh số lượng worker_processes trong Nginx (thường bằng số lõi CPU của máy chủ) để tối ưu hóa việc phân phối công việc.

Quản lý và bảo trì dịch vụ web sử dụng Nginx và Apache

Vận hành một hệ thống web không chỉ dừng lại ở việc cài đặt. Quản lý và bảo trì thường xuyên là chìa khóa để đảm bảo hệ thống luôn ổn định, an toàn và hoạt động với hiệu suất cao nhất.

Quản lý dịch vụ và cập nhật phần mềm

Khi bạn thay đổi tệp cấu hình của Nginx, thay vì khởi động lại hoàn toàn, bạn nên sử dụng lệnh reload. Lệnh này sẽ tải lại cấu hình mới mà không làm gián đoạn các kết nối hiện tại, đảm bảo thời gian hoạt động (uptime) của website.

sudo systemctl reload nginx

Đối với Apache, bạn cũng có thể dùng lệnh tương tự:

sudo systemctl reload apache2

Bảo mật là yếu tố sống còn. Bạn cần đảm bảo rằng cả Nginx, Apache và hệ điều hành Ubuntu luôn được cập nhật các bản vá bảo mật mới nhất. Hãy thường xuyên chạy lệnh sau để cập nhật hệ thống:

sudo apt update && sudo apt upgrade -y

Bạn thậm chí có thể thiết lập một công việc tự động (cron job) để thực hiện việc này định kỳ, giúp hệ thống luôn được bảo vệ.

Hình minh họa

Theo dõi và xử lý sự cố

Chủ động theo dõi là cách tốt nhất để phát hiện sự cố trước khi chúng ảnh hưởng đến người dùng. Hãy thường xuyên kiểm tra các tệp log lỗi của cả NginxApache. Bạn có thể sử dụng các công cụ như logwatch hoặc GoAccess để tự động phân tích log và gửi báo cáo hàng ngày.

Khi sự cố xảy ra, hãy bình tĩnh và tiếp cận một cách có hệ thống. Kiểm tra trạng thái của các dịch vụ (systemctl status nginx apache2). Xem các dòng log lỗi gần nhất để tìm manh mối. Phân tích tài nguyên hệ thống bằng htop hoặc top để xem có tiến trình nào đang chiếm quá nhiều CPU hoặc RAM không. Việc ghi chép lại các bước xử lý sự cố cũng giúp bạn giải quyết nhanh hơn trong những lần sau.

Các vấn đề phổ biến và cách xử lý

Ngay cả với một cấu hình chuẩn, bạn vẫn có thể gặp phải một số lỗi phổ biến. Biết cách nhận diện và khắc phục chúng sẽ giúp bạn tiết kiệm rất nhiều thời gian và công sức.

Lỗi 502 Bad Gateway khi cấu hình reverse proxy

Đây có lẽ là lỗi phổ biến nhất khi làm việc với reverse proxy. Lỗi 502 Bad Gateway xảy ra khi Nginx (proxy) không thể nhận được phản hồi hợp lệ từ máy chủ phía sau (Apache). Nguyên nhân thường gặp bao gồm:

  • Apache không chạy: Dịch vụ Apache có thể đã bị dừng hoặc gặp lỗi không khởi động được. Hãy kiểm tra bằng lệnh sudo systemctl status apache2.
  • Sai cấu hình proxy_pass: Địa chỉ IP hoặc cổng trong chỉ thị proxy_pass của Nginx không chính xác, khiến Nginx không thể kết nối đến Apache. Hãy chắc chắn rằng nó trỏ đến đúng cổng mà Apache đang lắng nghe (ví dụ: 127.0.0.1:8080).
  • Tường lửa chặn kết nối: Tường lửa của máy chủ (ví dụ: ufw) có thể đang chặn kết nối nội bộ giữa Nginx và Apache trên cổng 8080. Bạn cần cho phép kết nối trên cổng này.

Hình minh họa

Vấn đề hiệu năng chậm và timeout

Nếu website của bạn tải chậm hoặc thỉnh thoảng báo lỗi timeout, nguyên nhân có thể khá đa dạng:

  • Tài nguyên máy chủ không đủ: Máy chủ của bạn có thể đang thiếu RAM hoặc CPU để xử lý lượng truy cập hiện tại. Sử dụng htop để kiểm tra và cân nhắc nâng cấp nếu cần.
  • Cấu hình timeout quá thấp: Các giá trị proxy_connect_timeout, proxy_send_timeout, và proxy_read_timeout trong Nginx có thể quá ngắn. Nếu Apache cần nhiều thời gian để xử lý một yêu cầu động phức tạp, Nginx có thể đã hết kiên nhẫn và đóng kết nối.
  • Ứng dụng web hoặc cơ sở dữ liệu chậm: Vấn đề không phải lúc nào cũng nằm ở web server. Một truy vấn cơ sở dữ liệu không được tối ưu hoặc một đoạn mã PHP kém hiệu quả cũng có thể là thủ phạm. Hãy kiểm tra log ứng dụng để tìm manh mối.

Hình minh họa

Best Practices

Để xây dựng và duy trì một hệ thống Nginx reverse proxy Apache bền vững và dễ quản lý, hãy tuân thủ các nguyên tắc tốt nhất sau đây.

  • Luôn sao lưu file cấu hình trước khi thay đổi: Đây là quy tắc vàng. Trước khi chỉnh sửa bất kỳ tệp .conf nào, hãy tạo một bản sao lưu. Một lệnh đơn giản như sudo cp nginx.conf nginx.conf.bak có thể cứu bạn khỏi nhiều giờ khắc phục sự cố.
  • Ưu tiên cập nhật bản vá bảo mật sớm nhất: Thế giới mạng luôn tiềm ẩn các lỗ hổng mới. Việc cập nhật Nginx, Apache, OpenSSL và hệ điều hành của bạn một cách thường xuyên là tuyến phòng thủ quan trọng nhất để bảo vệ website.
  • Tận dụng tính năng cache và nén của Nginx: Đừng bỏ qua sức mạnh của caching và Gzip. Cấu hình đúng cách các tính năng này có thể cải thiện tốc độ tải trang một cách đáng kinh ngạc và giảm chi phí băng thông.
  • Không cấu hình quá phức tạp, giữ cấu trúc rõ ràng dễ quản lý: Hãy giữ cho các tệp cấu hình của bạn đơn giản và có tổ chức. Sử dụng các nhận xét (#) để giải thích các phần phức tạp. Chia nhỏ các cấu hình lớn thành các tệp riêng biệt và include chúng khi cần thiết để dễ dàng bảo trì.

Hình minh họa

Kết luận

Qua bài viết này, chúng ta đã cùng nhau tìm hiểu chi tiết về cách cấu hình Nginx làm reverse proxy cho Apache trên nền tảng Ubuntu 20.04. Việc kết hợp sức mạnh của hai web server hàng đầu này mang lại những lợi ích không thể phủ nhận: Nginx xử lý hiệu quả các kết nối đồng thời và tệp tĩnh, trong khi Apache tập trung vào việc xử lý nội dung động. Kết quả là một hệ thống web có hiệu suất cao hơn, bảo mật tốt hơn và khả năng mở rộng vượt trội.

Mô hình này không chỉ dành cho các hệ thống lớn mà còn cực kỳ hữu ích cho các website vừa và nhỏ muốn tối ưu hóa tài nguyên và cải thiện trải nghiệm người dùng. Tôi khuyến khích bạn hãy bắt tay vào thử nghiệm và áp dụng kiến trúc này cho các dự án của mình. Đừng ngần ngại tìm hiểu sâu hơn về các tính năng nâng cao như load balancing, caching hay các module bảo mật của Nginx.

Công nghệ luôn thay đổi, và việc liên tục học hỏi, thực hành là cách tốt nhất để trở thành một chuyên gia. Chúc bạn thành công trên hành trình xây dựng và vận hành những website tuyệt vời!

Hình minh họa

Đánh giá
Tác giả

Mạnh Đức

Có cao nhân từng nói rằng: "Kiến thức trên thế giới này đầy rẫy trên internet. Tôi chỉ là người lao công cần mẫn đem nó tới cho người cần mà thôi !"

Chia sẻ
Bài viết liên quan