Ở bài viết này, chúng ta sẽ cùng tìm hiểu các vấn đề sau đây:
- Reverse Proxy là gì?
- Những lợi ích khi sử dụng Nginx làm Proxy reverse là gì?
- Cách cấu hình Nginx làm Reverse Proxy.
Ok, nếu bạn đã sẵn sàng, chúng ta hãy cùng bắt đầu ngay thôi nào.
Reverse Proxy là gì?
Reverse Proxy hay còn gọi là Proxy ngược, nó đảm nhiệm vai trò tiếp nhận yêu cầu của khách hàng sau đó chuyển yêu cầu đó đến một hoặc nhiều máy chủ khác được chỉ định.
Các phản hồi của máy chủ cũng được Reverse Proxy nhận và phản hồi tới ứng dụng khách.
Nhờ vào khả năng mở rộng cũng như hiệu suất tuyệt vời mà Nginx trở thành một lựa chọn được ưa chuộng hơn để làm proxy reverse cho các máy chủ HTTP và máy chủ khác.
Cấu hình Nginx được sử dụng rộng rãi ở các ứng dụng sử dụng Node.js, Python hay Java.
Những lợi ích khi sử dụng Nginx làm Proxy reverse
- Cân bằng tải: Nginx hỗ trợ cân bằng tải nhằm phân bổ những yêu cầu của khách hàng một cách hợp lý, tránh tình trạng bị tắc nghẽn khi có nhiều yêu cầu đồng thời. Điều này giúp cải thiện hiệu suất cũng như mở rộng độ tin cậy của ứng dụng.
- Bộ nhớ đệm: Khi Nginx làm Reverse Proxy, nó sẽ hỗ trợ bộ nhớ đệm để lưu các phản hồi từ máy chủ ủy quyền. Bộ nhớ này sẽ chứa các nội dung đã được truy xuất từ khách hàng trước đó, đồng thời sẽ dùng nội dung đó để trả lời khách hàng khi họ gửi yêu cầu cùng một nội dung. Điều này giúp hạn chế thời gian gọi đến máy chủ thêm một lần nữa từ đó làm tăng tốc độ tải của trang.
- Termination SSL: Nginx hoạt động như một điểm cuối SSL thực thụ trong quá trình kết nối với khách hàng. Nó giúp giải mã các kết nối của SSL đồng thời mã hóa các phản hồi từ máy chủ ủy quyền.
- Nén: Nginx còn hỗ trợ nén các phản hồi từ máy chủ trước khi gửi đến máy khách trong những trường hợp máy chủ được ủy quyền không gửi phản hồi ở dạng nén.
- Giảm thiểu các cuộc tấn công DdoS: Để hạn chế tắc nghẽn, Nginx cung cấp tính năng giới hạn số lượng kết nối và yêu cầu cho mỗi địa chỉ IP ở một giá trị nhất định. Đồng thời cho phép chặn hay hạn chế các quyền truy cập dựa trên địa lý của khách hàng cũng như các yêu cầu có tiêu đề như “User-Agent” hay “Referer”.
Điều kiện tiên quyết
Giả sử rằng Nginx đã được cấu hình trên các máy chủ như Ubuntu, CentOS hay Debian.
Cách cấu hình Nginx làm Reverse Proxy
Khi cấu hình Nginx làm reverse proxy cho máy chủ HTTP, đầu tiên bạn cần mở tệp và thiết lập miền của máy chủ, chỉ định vị trí máy chủ được ủy quyền bên trong tệp đó.
Câu lệnh như sau:
{{EJS0}}
Câu lệnh trên bạn có thể thấy, chỉ thị proxy_pass là URL của máy chủ, bạn có thể sử dụng giao thức HTTP hoặc HTTPS. Trong URL chứa một trên miền hoặc địa chỉ IP cùng với một port và URI để định vị vị trí.
Với cấu hình trên, nghĩa là Nginx phải chuyển tất cả các yêu cầu đến location /app hay ứng dụng của máy chủ được ủy quyền tại địa chỉ http://127.0.0.1:8080.
Đối với các bản phân phối dựa trên cấu hình của Ubuntu hat Debian thì các tệp được lưu trữ ở thư mục /etc/nginx/sites-available. Còn đối với CentOS thì được lưu ở thư mục /etc/nginx/conf.d.
Để có thể hiểu rõ hơn về cách thức hoạt động của location và proxy_pass, hãy theo dõi ví dụ sau đây:
{{EJS1}}
Câu lệnh trên có nghĩa là, khi khách hàng truy cập vào địa chỉ http://example.com/blog/my-post thì Nginx sẽ điều hướng đến địa chỉ http://node1.com:8000/wordpress/my-post.
Khi địa chỉ máy chủ ủy quyền đã chứa một URI trước đó, lúc này URI yêu cầu của máy chủ sẽ được thay thế bằng một URI được chỉ định khác. Trong trường hợp địa chỉ của máy chủ ủy quyền được chỉ định không chứa URI, nó sẽ được cung cấp một URI có yêu cầu đầy đủ.
Quá trình xử lý các Headers của Nginx theo yêu cầu
Khi Nginx xác nhận một yêu cầu, nó sẽ xác định hai tiêu đề trong yêu cầu từ máy khách, Host & Connection, đồng thời xóa các tiêu đề trống. Lúc này Host sẽ trở hành biến $proxy_host và Connection được đặt thành Close.
Để đặt hay điều chỉnh tiêu đề cho các kết nối, bạn có thể sử dụng lệnh proxy_set_header kèm theo giá trị tiêu đề bạn mong muốn. Để tiện cho việc điều chỉnh bạn có thể tham khảo danh sách các tiêu đề có sẵn và các giá trị hợp lệ với câu lệnh. Để ngăn cách giữa các tiêu đề bạn có thể sử dụng chuỗi trống “”
.
Đây là một ví dụ về thay đổi giá trị tiêu đề của Host thành $host đồng thời xóa đi tiêu đề Accept- Encoding bằng cách dùng chuỗi “”
ở chỗ điền giá trị.
{{EJS2}}
Bạn cần khởi động lại Nginx khi có bất cứ chỉnh sửa gì về cấu hình, điều đó giúp các thay đổi sẽ có hiệu lực.
Cách cấu hình Nginx làm Reverse Proxy cho non-HTTP proxy server
Bạn có thể cấu hình Nginx để làm reverse proxy cho máy chủ không phải HTTP bằng các lệnh như sau:
- fastcgi_pass: reverse proxy cho máy chủ FastCGI.
- uwsgi_pass: reverse proxy cho máy chủ uwsgi.
- scgi_pass: reverse proxy cho máy chủ SCGI.
- memcached_pass: reverse proxy cho máy chủ Memcached.
Dùng Nginx làm reverse proxy cho PHP-FPM là một trong những ví dụ được sử dụng phổ biến nhất:
{{EJS3}}
Các thiết lập nâng cao
Ngày nay việc sử dụng giao thức HTTPS đã trở thành một tiêu chuẩn. Sau đây là một ví dụ về cách cấu hình Nginx làm reverse proxy cho HTTPS với các tiêu đề cũng như các thông số proxy được để xuất.
{{EJS4}}
- proxy_http_version 1.1: Dùng để xác định phiên bản giao thức HTTP cho proxy, mặc định sẽ là 1.0. Tuy nhiên đối với Websockets và các kết nối lưu trữ, bạn cần sử dụng phiên bản 1.1.
- proxy_cache_bypass $ http_upgrade: Khi dùng tùy chọn này, các phản hồi sẽ không được lấy từ bộ nhớ đệm mà lấy từ máy chủ.
- upgrade $ http_upgrade và connection ” upgrade “: Khi bạn dùng Websockets thì các trường này là bắt buộc phải có trong câu lệnh
- Host $ host – the $host theo thứ tự ưu tiên: Sẽ lưu trữ tên host theo thứ tự từ yêu cầu, tiêu đề hay phù hợp với yêu cầu.
- X-Real-IP $ remote_addr: Giúp chuyển tiếp các địa chỉ IP được truy cập trực tueyens đến máy chủ ủy quyền.
- X-Forwarded-For $ proxy_add_x_osystemed_for:. Chứa danh sách các địa chỉ IP của tất cả máy chủ mà máy khách đã ủy quyền.
- Lược đồ X-Forwarded-Proto $: Câu lệnh này dùng để chuyển đổi phản hồi của máy chủ ủy quyền từ giao thức HTTP thành HTTPS
- X-Forwarded-Host $ host: Xác định host ban đầu do khách hàng yêu cầu.
- X-Forwarded-Port $ server_port: Xác định port gốc do máy khách yêu cầu.
Nếu hiện tại máy chủ của bạn chưa có chứng chỉ SSL/TLS, có thể sử dụng cerbot để SSL Let’s Encrypt hoàn toàn miễn phí trên máy chủ Ubuntu 18.04, CentOS 7 hoặc Debian.
Tổng kết về Nginx Reverse Proxy
Bài viết trên đã hướng dẫn các bạn cách dùng Nginx để làm Reverse Proxy cũng như các cách chuyển đổi tham số bổ sung đến máy chủ hay chỉnh sửa tiêu đề,…
Hy vọng qua bài viết bạn có thể vận dụng vào quá trình làm việc của mình một cách hiệu quả và chuyên nghiệp, đồng thời cũng mang đến cho các bạn một kiến thức vô cùng hữu ích.
Nếu bạn còn bất cứ câu hỏi nào liên quan đến Nginx Reverse Proxy, hãy để lại bình luận ở bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.
P/s: Bạn cũng có thể truy cập vào Blog của BKHOST để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công.