Reverse proxy là một loại server proxy nhận các request HTTP/HTTPS rồi gửi đến backend server, thường dùng để ngăn việc truy cập trực tiếp đến các server ứng dụng hoặc phân phối tải đến các server. Bài viết này sẽ hướng dẫn thiết lập để sử dụng Apache làm Reverse-proxy với mod_proxy
trên Ubuntu 20.04.
Giới thiệu về Reverse-Proxy
Reverse proxy là một công cụ rất hữu ích vì có nhiều ứng dụng web hiện đại xử lý yêu cầu HTTP đến server ứng dụng backend. Các server không được phép truy cập trực tiếp, và thường chỉ hỗ trợ các tính năng HTTP cơ bản.
Ngoài việc ngăn truy cập trực tiếp đến server ứng dụng, reverse proxy còn có thể dùng để phân phối tải đến nhiều server ứng dụng khác nhau, giúp làm tăng hiệu suất và đảm bảo an toàn khi có sự cố. Bên cạnh đó, reverse proxy cũng giúp cung cấp các tính năng mà server ứng dụng không cung cấp như caching, nén hay mã hóa SSL.
Điều kiện để sử dụng Apache làm Reverse-Proxy với mod_proxy trên Ubuntu 20.04
Để bắt đầu việc thiết lập, ta cần có sẵn một server Ubuntu 20.04, user non-root có quyền sudo và tường lửa. Bài viết này cũng sẽ hướng dẫn trên Apache 2.
Xem thêm: Hướng dẫn cài đặt Dante Proxy trên Ubuntu 20.04 cho các kết nối riêng tư
Bước 1 – Bật các module Apache cần thiết
Apache có rất nhiều module hữu ích, nhưng thường không được bật sẵn sau khi cài đặt. Để thực hiện việc thiết lập theo hướng dẫn này, ta cần cài đặt mod_proxy
và một số module add-on để mở bổ sung thêm chức năng và hỗ trợ nhiều giao thức mạng khác nhau:
mod_proxy
: module chính để điều hướng kết nối, cho phép Apache hoạt động như một gateway đến tầng ứng dụng bên dưới.mod_proxy_http
: hỗ trợ proxy kết nối HTTP.mod_proxy_balancer
vàmod_lbmethod_byrequests
: bổ sung các tính năng cân bằng cho nhiều server backend.
Chạy lệnh sau để bật 4 module vừa rồi:
sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
Restart lại Apache để áp dụng thay đổi:
sudo systemctl restart apache2
Bây giờ Apache đã đủ điều kiện để hoạt động như một reverse proxy. Tiếp theo ta cần tạo hai server backend cơ bản để kiểm tra xem cấu hình có hoạt động chính xác hay không. Nếu đã có sẵn server rồi thì bạn đọc có thể bỏ qua bước này. Nếu muốn tiết kiệm chi phí thì bạn cũng có thể sử dụng máy chủ ảo VPS trong trường hợp chưa có sẵn server.
Nếu chưa biết nên thuê VPS ở đâu thì có thể tham khảo các gói dịch vụ tại Vietnix. Hiện tại Vietnix đang cung cấp đa dạng gói VPS tốc độ cao với nhiều mức giá khác nhau để người dùng có thể dễ dàng lựa chọn như VPS Giá Rẻ, VPS Cloud Server, VPS Cao Cấp, VPS NVMe,… Bất kể gói dịch vụ nào bạn chọn, Vietnix đều cam kết cung cấp cho bạn chất lượng dịch vụ tốt nhất.
Bên cạnh đó, đội ngũ hỗ trợ túc trực 24/7 sẵn sàng tiếp nhận và giải quyết mọi vấn đề phát sinh trong thời gian ngắn nhất. Liên hệ để được trải nghiệm ngay VPS Vietnix và không cần lo lắng về vấn đề quản trị máy chủ.
Bước 2 – Tạo server backend để kiểm tra
Bây giờ ta sẽ tạo hai server, một server để truyền thông tin Hello World!, server còn lại truyền thông tin Howdy World!, việc này sẽ giúp ta kiểm tra khả năng cân bằng tải giữa nhiều dịch vụ.
Flask là một microframework Python dùng để xây dựng các ứng dụng web. Ở hướng dẫn này ta sẽ sử dụng Flask để tạo các server test.
Trước tiên, cập nhật apt
rồi cài đặt pip
:
sudo apt update
sudo apt install python3-pip
Cài đặt Flask bằng pip
:
sudo pip3 install Flask
Bây giờ hãy tạo một file mới chứa code cho server backend đầu tiên, nằm trong home directory của user hiện tại:
nano ~/backend1.py
Thêm đoạn code này vào file:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello world!'
Hai dòng code đầu giúp khởi tạo framework Flask. Hàm home()
trả về một chuỗi Hello World!
, dòng @app.route('/')
yêu cầu Flask sử dụng giá trị trả về của hàm home()
làm phản hồi cho các request HTTP đến root URL /
của ứng dụng.
Sau khi hoàn tất, lưu rồi đóng file lại.
Việc tạo server backend thứ hai cũng tương tự. Trước tiên, chạy lệnh cp
để copy nội dung từ file đầu sang:
cp ~/backend1.py ~/backend2.py
Mở file vừa tạo:
cp ~/backend1.py ~/backend2.py
Sau đó đổi câu trả về thành Howdy world!:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Howdy world!'
Lưu rồi đóng file lại.
Tiếp theo, hãy dùng lệnh dưới để để khởi động server chạy nền đầu tiên trên cổng 8080
. Lệnh này cũng sẽ điều hướng output của Flask đến /dev/null
.
FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
Trong lệnh trên, FLASK_APP
là biến môi trường. Biến môi trường là một phương pháp giúp truyền thông tin vào các tiến trình được sinh ra từ shell thuận lợi hơn. Việc sử dụng biến môi trường trong lệnh này giúp đảm bảo các thiết lập chỉ được áp dụng cho lệnh đang chạy, không có hiệu lực sau đó. Hướng dẫn này sẽ truyền một tên file khác theo cách tương tự, cho nên việc sử dụng biến môi trường sẽ giúp tránh nhầm lẫn.
Tương tự, chạy lệnh dưới đây để khởi động server thứ hai trên cổng 8181
:
FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
Bây giờ dùng lệnh curl
để kiểm tra xem hai server có đang chạy không. Địa chỉ 127.0.0.1
là địa chỉ IP cục bộ (localhost). Lệnh dưới đây dùng để yêu cầu server tự kết nối với chính nó hiển thị phản hồi:
curl http://127.0.0.1:8080/
Output:
Output
Hello world!
Tương tự cho server thứ hai:
curl http://127.0.0.1:8081/
Output:
Output
Howdy world!
Bước 3 – Thay đổi cấu hình mặc định của Apache
Trong bước này, ta sẽ cấu hình cho virtual host Apache mặc định hoạt động như một reverse proxy cho một server backend hoặc một mảng các server backend đã được cân bằng tải.
Lưu ý rằng nếu Apache của bạn hoạt động như server HTTP và cả HTTPS thì cấu hình reverse proxy cần phải được đặt trong virtual host HTTP lẫn HTTPS.
Đầu tiên, mở file config mặc định của Apache:
sudo nano /etc/apache2/sites-available/000-default.conf
Trong file này, tìm block <VirtualHost *:80>
. Bây giờ ta sẽ xem qua một số ví dụ để hiểu rõ cách cấu hình block này cho Apache hoạt động như reverse proxy cho một server backend. Đồng thời ta cũng sẽ tìm hiểu cách thiết lập một reverse proxy đã được cân bằng tải cho nhiều server backend.
Ví dụ 1 – Reverse Proxy cho một server backend
Trước tiên, đổi mọi nội dung trong block VirtualHost
để file cấu hình có dạng như dưới đây. Nếu đã làm theo Bước 2 ở trên thì hãy dùng địa chỉ 127.0.0.1:8080
, còn không bạn có thể sử dụng địa chỉ server ứng dụng riêng:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
Có ba directive như sau:
ProxyPreserveHost
: Apache chuyển header Host ban đầu sang server backend. Việc này giúp server backend biết được địa chỉ được dùng để truy cập ứng dụng.ProxyPass
: directive cấu hình proxy chính. Trong ví dụ này, mọi file dưới URL root (/
) đều được ánh xạ đến server backend tại địa chỉ được chỉ định. Ví dụ, nếu Apache nhận một request cho/example
thì nó sẽ kết nối đếnhttp://your_backend_server/example
rồi trả phản hồi về client gốc.ProxyPassReverse
: nên có cấu hình giống vớiProxyPass
. Directive này yêu cầu Apache chỉnh sửa header phản hồi từ server backend. Việc này giúp đảm bảo rằng nếu server backend trả về header điều hướng vị trí thì trình duyệt của client sẽ được điều hướng đến địa chỉ proxy chứ không phải địa chỉ server backend.
Sau đó lưu, đóng file lại và restart lại Apache:
sudo systemctl restart apache2
Bây giờ nếu ta có quyền truy cập vào https:/your_server_id
thì sẽ thấy phản hồi server backend thay vì trang chào mừng tiêu chuẩn của Apache.
Ví dụ 2 – Cân bằng tải trên nhiều server backend
Nếu có nhiều server backend thì ta nên phân phối đều lưu lượng khi proxy bằng cách sử dụng tính năng cân bằng tải của mod_proxy
.
Trước tiên, mở file config mặc định của Apache:
sudo nano /etc/apache2/sites-available/000-default.conf
Sau đó đổi nội dung bên trong VirtualHost
như dưới đây. Nếu đã làm theo Bước 2 ở trên thì hãy dùng địa chỉ 127.0.0.1:8080
cho directive BalancerMember
, còn không bạn có thể sử dụng địa chỉ server ứng dụng riêng:
<VirtualHost *:80>
<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:8080
BalancerMember http://127.0.0.1:8081
</Proxy>
ProxyPreserveHost On
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
</VirtualHost>
Cấu hình cũng tương tự như ở phần trước, nhưng thay vì chỉ định trực tiếp một server backend thì ta sẽ có các directive như sau:
Proxy
: dùng để định nghĩa nhiều server. Block được đặt tên làbalancer://mycluster
(tên có thể đổi tự do) và bao gồm một hay nhiềuBalancerMember
– chỉ định địa chỉ server backend bên dưới.ProxyPass
vàProxyPassReverse
: sử dụng pool cân bằng tải có tênmycluster
thay vì một server cụ thể.
Sau khi hoàn tất, lưu và đóng file lại. Cuối cùng là restart lại Apache:
sudo systemctl restart apache2
Bây giờ khi truy cập vào http://your_server_ip
trong trình duyệt web thì ta sẽ thấy các phản hồi của server backend thay vì trang Apache tiêu chuẩn. Nếu làm theo Bước 2, khi refresh trang nhiều lần thì sẽ hiển thị Hello world! và cả Howdy world!. Khi đó có thể xác nhận rằng reverse proxy đang hoạt động tốt và tải cũng được cân bằng cho cả hai server.
Sau khi hoàn tất hướng dẫn, nếu muốn đóng cả hai server thì bạn có thể dùng lệnh killall flask
.
Với hơn 10 năm kinh nghiệm trong lĩnh vực cung cấp giải pháp VPS tốc độ cao, Vietnix đã vinh hạnh được đồng hành cùng sự thành công của hơn 50.000 khách hàng cá nhân, doanh nghiệp như GTV, iVIVU, Vietnamworks, SAGO Media,… Sự hài lòng của người dùng luôn là ưu tiên hàng đầu của Vietnix và chính vì vậy, Vietnix luôn nỗ lực để đáp ứng mọi nhu cầu của họ.
Đặc biệt, Vietnix không chỉ cung cấp giải pháp VPS mà còn có nhiều giải pháp khác như hosting, domain, email, SSL, Firewall anti DDoS, và nhiều hơn nữa. Tất cả những giải pháp này sẽ giúp khách hàng an tâm xây dựng thương hiệu, phát triển kinh doanh trên internet mà không cần lo lắng về việc quản trị hệ thống hạ tầng. Hãy để Vietnix là đối tác hỗ trợ đồng hành cùng bạn trong con đường hướng tới sự thành công.
Mọi vấn đề thắc mắc cần tư vấn, quý khách vui lòng liên hệ:
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
- Hotline: 1800 1093 – 07 088 44444
- Email: sales@vietnix.com.vn
Lời kết
Bài viết này đã hướng dẫn cách thiết lập Apache để hoạt động như một reverse proxy cho một hay nhiều server ứng dụng. mod_proxy
có thể được dùng để cấu hình như reverse proxy cho các server ứng dụng, được viết bằng nhiều ngôn ngữ và lập trình khác nhau như Python hay Django, Ruby, và Ruby on Rails. Nếu có bất kỳ thắc mắc nào khác, hãy để lại bên dưới để được Vietnix hỗ trợ nhanh nhất nhé.