Giới thiệu
A reverse-proxy là một loại máy chủ ủy quyền, chuyên nhận các yêu cầu HTTP (S) và phân phối chúng đến một hoặc nhiều máy chủ hỗ trợ khác một cách minh bạch. Các reverse-proxy này rất hữu ích vì dược sử dụng bởi nhiều ứng dụng web hiện đại khác nhau. Chúng chuyên xử lý các yêu cầu HTTP đến bằng cách sử dụng các máy chủ ứng hỗ trợ khác. Những máy chủ này không phải để người dùng truy cập trực tiếp mà thường được sử dụng để hỗ trợ các tính năng HTTP cơ bản. Bạn có thể sử dụng reverse-proxy để ngăn các máy chủ ứng dụng cơ bản này bị truy cập trực tiếp từ bên ngoài. Chúng cũng có thể được sử dụng để phân phối tải từ các yêu cầu đến đến một số máy chủ, tăng hiệu suất trên quy mô lớn và cung cấp độ bảo mật nếu như có sự cố. Chúng có thể lấp đầy khoảng trống bằng các tính năng mà máy chủ ứng dụng không cung cấp, chẳng hạn như bộ nhớ đệm, nén hoặc mã hóa SSL. Trong hướng dẫn này, bạn sẽ tiến hành thiết lập Apache làm reverse-proxy một cách cơ bản bằng cách sử dụng tiện ích mở rộng mod_proxy
để chuyển hướng các kết nối đến đến một/ một số máy chủ Backend chạy trên cùng một mạng. Hướng dẫn này sử dụng chương trình Backend được viết bằng Web Framework Flask, nhưng bạn có thể sử dụng bất kỳ máy chủ Backend nào bạn thích.
Điều kiện
Để làm theo hướng dẫn này, bạn sẽ phải cần có:
- Một máy chủ Ubuntu 20.04 được thiết lập sẵn, bao gồm một người dùng không phải root
sudo
và chắc chắn không thể thiếu tường lửa. - Apache 2 đã được cài đặt sẵn trên máy chủ của bạn.
Bước 1: Kích hoạt các Module Apache cần thiết
Apache có nhiều mô-đun đi kèm, đôi lúc nó có sẵn nhưng không được kích hoạt trong bản cài đặt mới nhất. Do đó, trước tiên, bạn cần bật những cái bạn sẽ sử dụng trong hướng dẫn này. Các mô-đun bạn cần là chính là mod_proxy
và một số mô-đun bổ trợ của nó, cái mà sẽ giúp mở rộng chức năng để hỗ trợ các giao thức mạng khác nhau. Cụ thể, những mô-đun bạn sẽ sử dụng bao gồm:
mod_proxy
: mô-đun proxy chính để chuyển hướng kết nối. Nó cho phép Apache hoạt động như một cổng vào dành cho các máy chủ ứng dụng bên dưới.mod_proxy_http
: thêm hỗ trợ cho các kết nối HTTP ủy quyền.mod_proxy_balancer
vàmod_lbmethod_byrequests
: chúng bổ sung các tính năng cân bằng tải cho nhiều máy chủ Backend. Để bật 4 mô-đun này, hãy thực hiện lệnh sau:
Để những thay đổi này có hiệu lực, hãy khởi động lại Apache:
Apache hiện đã sẵn sàng hoạt động như một reverse-proxy cho các yêu cầu HTTP. Trong bước tùy chọn tiếp theo, bạn sẽ phải tạo 2 máy chủ Backend cơ bản. Những điều này sẽ giúp xác minh xem cấu hình có hoạt động bình thường hay không, nhưng nếu bạn đã có ứng dụng Backend của riêng mình, bạn có thể chuyển sang Bước 3.
Bước 2: Tạo Máy chủ backend để Test
Khởi chạy một số máy chủ Backend có thể giúp kiểm tra xem cấu hình Apache của bạn có hoạt động bình thường hay không. Tại đây, bạn sẽ tạo 2 máy chủ thử nghiệm phản hồi các yêu cầu HTTP bằng cách in một dòng văn bản. Một máy chủ sẽ nói “hello world” và máy còn lại sẽ hiển thị “Howdy world” Điều này sẽ cho phép bạn kiểm tra cân bằng tải giữa nhiều dịch vụ cùng lúc.
Lưu ý: Trong thiết lập thế giới thực, các máy chủ Backend thường trả về cùng một loại nội dung. Tuy nhiên, với mục đích của bài viết này, việc 2 máy chủ trả về các thông báo khác nhau cho phép bạn kiểm tra xem cơ chế cân bằng tải có sử dụng cả 2 hay không
Flask là một microframework Python được dùng để xây dựng các ứng dụng web. Bước này phác thảo cơ bản cách sử dụng Flask để tạo các máy chủ thử nghiệm vì một ứng dụng tối thiểu chỉ yêu cầu một vài dòng code. Đâu tiên, hãy cập nhạt danh sách các gói mục lục bằng cách sử dụng apt
:
Sau đó, tiến hành cài đặt pip
, trình kiến nghị việc quản lý các gói Python:
Tiếp theo, sử dụng pip
để cài đặt Flask:
Bây giờ, tất cả các thành phần bắt buộc đều đã được cài đặt đầy đủ. Hãy tạo một tệp mới chứa code cho máy chủ Backend đầu tiên trong thư mục chính hiện tại. Bạn có thể thực hiện việc này bằng trình soạn thảo văn bản ưa thích của mình, ở đây chúng tôi sẽ sử dụng nano
trong bài viết này:
Chèn đoạn code sau vào tệp:
Hai dòng code đầu tiên khởi tạo khung Flask. Có một hàm, home ()
, trả về một dòng văn bản (Xin chào thế giới)
. Dòng @ app.route ('/')
phía trên định nghĩa hàm home ()
yêu cầu Flask sử dụng giá trị trả về của home ()
làm phản hồi cho các yêu cầu HTTP được hướng đến URL /
root của ứng dụng. Sau khi hoàn tất, hãy lưu và thoát khỏi tệp. Nếu đang sử dụng nano
, bạn có thể thực hiện việc này bằng cách nhấn CTRL + X
, sau đó nhấn Y
và ENTER
. Máy chủ Backend thứ hai hoàn toàn giống với máy chủ đầu tiên, ngoại trừ việc trả về một dòng văn bản khác. Do đó, hãy chạy cp
để sao chép nội dung từ tệp đầu tiên, từ tệp backend1.py
vào tệp backend2.py
:
Bây giờ, hãy mở tệp mới được sao chép bằng trình soạn thảo văn bản ưa thích của bạn:
Cập nhật thông báo trả về là tin nhắn hello world thay vì đọc Howdy world:
Sau khi bạn cập nhật xong, hãy lưu và đóng tệp lại. Tiếp theo, sử dụng dòng lệnh dưới đây để khởi động máy chủ nền đầu tiên trên cổng 8080
. Thao tác này cũng làm chuyển hướng đầu ra của Flask
đến / dev / null
vì nó sẽ làm ảnh hưởng đến đầu ra của bảng điều khiển trên:
Ở đây, bạn đang đặt trước lệnh flask
bằng cách cài đặt biến môi trường FLASK_APP
trên cùng một dòng. Các biến môi trường là một cách thuận tiện để truyền thông tin vào các quy trình được sinh ra từ phía ngoài. Trong trường hợp này, việc sử dụng một biến môi trường sẽ đảm bảo cài đặt này chỉ áp dụng cho các lệnh đang được chạy và sẽ không có sẵn sau đó. Điều này là cần thiết để tránh nhầm lẫn vì bạn sẽ chuyển một tên tệp khác theo cách tương tự để yêu cầu lệnh flask
khởi động máy chủ thứ hai. Tương tự, bạn muốn chạy lệnh sau để khởi động máy chủ thứ hai trên cổng 8081
. Lưu ý giá trị khác nhau cho biến môi trường FLASK_APP
:
Bây giờ bạn có thể kiểm tra xem hai máy chủ có đang chạy hay không bằng cách sử dụng lệnh curl
. Bắt đầu bằng cách thử nghiệm máy chủ đầu tiên. Lệnh này sử dụng curl
để kết nối với 127.0.0.1
, một địa chỉ IP đặc biệt đại diện cho localhost. Điều này có nghĩa là lệnh sau yêu cầu máy chủ của bạn kết nối với chính nó và in phản hồi của chính nó:
Thao tác này sẽ in phản hồi sau từ máy chủ:
OutputHello world!
Tiếp theo, kiểm tra máy chủ thứ hai:
Tương tự như trước đó, điều này sẽ in phản hồi mong đợi từ máy chủ:
OutputHowdy world!
Trong bước tiếp theo, bạn sẽ sửa đổi tệp cấu hình của Apache để cho phép sử dụng tệp này làm reverse proxy.
Bước 3: Sửa đổi cấu hình mặc định để kích hoạt Reverse Proxy
Trong phần này, bạn sẽ thiết lập máy chủ ảo Apache mặc định để phục vụ như một reverse proxy cho một máy chủ Backend duy nhất hoặc một loạt các máy chủ Backend để đám ứng nhu cầu chạy cân bằng tải.
Lưu ý: Trong hướng dẫn này, các bạn đang áp dụng cấu hình ở cấp máy chủ ảo. Trên cài đặt mặc định của Apache, chỉ có một máy chủ ảo mặc định duy nhất được kích hoạt. Tuy nhiên, bạn cũng có thể sử dụng tất cả các đoạn cấu hình đó trong các máy chủ ảo khác.
Nếu máy chủ Apache của bạn hoạt động như một máy chủ HTTP và HTTPS, thì cấu hình reverse proxy của bạn phải được đặt trong cả máy chủ ảo HTTP và HTTPS.
Mở tệp cấu hình Apache mặc định bằng trình soạn thảo văn bản ưa thích của bạn:
Bên trong tệp đó, bạn sẽ tìm thấy khối <VirtualHost *: 80>
ngay trên dòng đầu tiên. Ví dụ đầu tiên sau đây sẽ giải thích cách định cấu hình khối này để thiết lập reverse proxy cho một máy chủ Backend duy nhất và ví dụ thứ hai thiết lập reverse proxy cân bằng tải cho nhiều máy chủ Backend.
Ví dụ 1: Thiết lập reverse proxy với duy nhất một máy chủ Backend
Đầu tiên, thay thế tất cả nội dung trong khối VirtualHost
để tệp cấu hình của bạn đọc như sau. Nếu bạn đã làm theo các máy chủ mẫu ở Bước 2, hãy sử dụng 127.0.0.1:8080
. Nếu bạn có máy chủ ứng dụng của riêng mình, hãy sử dụng địa chỉ của chúng để thay thế:
Có ba nội dung được trình bày, dưới đây là tổng quan ngắn gọn về những gì chúng đang thực hiện:
ProxyPreserveHost
: làm cho Apache chuyển tiêu đềHost
ban đầu đến máy chủ Backend. Điều này rất hữu ích, vì nó làm cho máy chủ Backend nhận biết được địa chỉ nào đang được sử dụng để truy cập ứng dụng.ProxyPass
: chỉ thị cấu hình proxy chính. Trong trường hợp này, nó chỉ định rằng mọi thứ dưới dạng URL gốc(/)
phải được chuyển tới máy chủ Backend tại địa chỉ đã cho. Ví dụ: nếu Apache nhận được một yêu cầu cho/ example
, nó sẽ kết nối vớihttp: // your_backend_server / example
và trả lại phản hồi cho máy khách ban đầu.ProxyPassReverse
: nên có cùng cấu hình vớiProxyPass
. Nó yêu cầu Apache sửa đổi các tiêu đề phản hồi từ máy chủ Backend. Điều này đảm bảo rằng nếu máy chủ Backend trả về tiêu đề chuyển hướng vị trí, trình duyệt của khách hàng sẽ được chuyển hướng đến địa chỉ proxy chứ không phải địa chỉ máy chủ Backend, điều này sẽ không hoạt động như dự kiến.
Sau khi bạn thêm xong nội dung này, hãy lưu và thoát khỏi tệp. Để những thay đổi này có hiệu lực, hãy khởi động lại Apache:
Bây giờ, nếu bạn truy cập http: // your_server_ip
trong trình duyệt web, bạn sẽ thấy phản hồi của máy chủ Backend của mình thay vì trang chào mừng Apache tiêu chuẩn. Nếu bạn đã làm theo Bước 2, điều này có nghĩa là bạn sẽ thấy Hello world! trong trình duyệt.
Ví dụ 2: Cân bằng tải qua nhiều máy chủ Backend
Nếu bạn có nhiều máy chủ Backend, một cách tốt để phân phối lưu lượng truy cập khi ủy quyền là sử dụng các tính năng cân bằng tải của mod_proxy
. Trước tiên, hãy mở tệp cấu hình Apache mặc định bằng trình soạn thảo văn bản ưa thích của bạn:
Bây giờ thay thế tất cả nội dung trong VirtualHost
để tệp cấu hình của bạn đọc như sau. Nếu bạn đã làm theo các máy chủ mẫu ở Bước 2, hãy sử dụng 127.0.0.1:8080
và 127.0.0.1:8081
cho các lệnh BalancerMember
. Nếu bạn có máy chủ ứng dụng của riêng mình, hãy sử dụng địa chỉ của chúng để thay thế:
Cấu hình tương tự như cấu hình trước đó, nhưng thay vì chỉ định trực tiếp một máy chủ Backend duy nhất, các lệnh này thực hiện như sau:
Proxy
: khốiProxy
bổ sung này được sử dụng để xác định nhiều máy chủ. Khối được đặt tên làbalancer: // mycluster
(tên có thể được thay đổi tùy ý) và bao gồm một hoặc nhiềuBalancerMembers
, khối này chỉ định địa chỉ máy chủ Backend cơ bản.ProxyPass
vàProxyPassReverse: các chỉ thị này sử dụng nhóm cân bằng tải
có tên mycluster thay vì một máy chủ cụ thể.
Nếu bạn đã làm theo các máy chủ mẫu trong Bước 2, hãy sử dụng 127.0.0.1:8080
và 127.0.0.1:8081
cho các lệnh BalancerMember
, như được viết trong khối ở trên. Nếu bạn có máy chủ ứng dụng của riêng mình, hãy sử dụng địa chỉ của chúng để thay thế.
Sau khi bạn thêm xong nội dung này, hãy lưu và thoát khỏi tệp.
Để những thay đổi này có hiệu lực, hãy khởi động lại Apache:
Nếu bạn truy cập http: // your_server_ip
trong trình duyệt web, bạn sẽ thấy phản hồi của máy chủ Backend của mình thay vì trang Apache tiêu chuẩn. Nếu bạn đã làm theo Bước 2, thì việc làm mới trang nhiều lần sẽ hiển thị Hello world! và Howdy world !, nghĩa là reverse proxy đã hoạt động và đang cân bằng tải giữa cả hai máy chủ.
Lưu ý: Để đóng cả 2 máy chủ thử nghiệm sau khi bạn không còn cần đến chúng nữa, như khi bạn hoàn thành hướng dẫn này, bạn có thể thực hiện lệnh killall flask
Kết luận
Bây giờ bạn đã biết cách thiết lập Apache làm reverse proxy cho một hoặc nhiều máy chủ ứng dụng cơ bản. mod_proxy
có thể được sử dụng hiệu quả để định cấu hình reverse proxy cho các máy chủ ứng dụng được viết bằng nhiều ngôn ngữ và công nghệ, chẳng hạn như Python và Django, hoặc Ruby và Ruby on Rails. Nó cũng có thể được sử dụng để cân bằng lưu lượng truy cập giữa nhiều máy chủ Backend cho các trang web có nhiều lưu lượng truy cập, để cung cấp tính khả dụng cao thông qua nhiều máy chủ hoặc cung cấp hỗ trợ SSL an toàn cho các máy chủ Backend không hỗ trợ SSL nguyên bản. Trong khi mod_proxy
với mod_proxy_http
có lẽ là sự kết hợp phổ biến nhất của các mô-đun, có một số mô-đun khác hỗ trợ các giao thức mạng khác nhau. Bạn đã không sử dụng chúng trong hướng dẫn này, nhưng một số mô-đun phổ biến khác bao gồm:
mod_proxy_ftp cho FTP
mod_proxy_connect
mod_proxy_ajp
cho AJP (Apache JServ Protocol)mod_proxy_wstunnel