Reverse proxy là một loại proxy server hữu ích, có thể ngăn chặn sự truy cập trực tiếp từ các app server. Đồng thời, còn có thể phân phối tải các request đến các app server khác nhau nhằm tăng hiệu suất trên quy mô lớn và đảm bảo an toàn cho hệ thống khi có sự cố xảy ra. Vì thế, để thiết lập Apache như reverse proxy, người dùng có thể dùng mode_proxy trên CentOS 7 với cách thực hiện được Vietnix hướng dẫn chi tiết trong bài viết.
Các yêu cầu cần chuẩn bị để sử dụng Apache làm Reverse Proxy với mod proxy trên CentOS 7
Trước khi bắt đầu quá trình ứng dụng Apache làm Reverse Proxy trên CentOS 7, người dùng cần đảm bảo đáp ứng các yếu tố sau:
- Một server CentOS 7 với non-root user có quyền sudo.
- Cài đặt Apache 2 web server trên CentOS 7.
- Sử dụng
vi
text editor (mặc định) hoặc cài đặtnano
text editor (tùy chọn) có giao diện thân thiện và dễ sử dụng hơn thông qua câu lệnhyum install nano
.
Chi tiết các bước sử dụng Apache làm Reverse Proxy với mod proxy trên CentOS 7
Để thiết lập Apache như reverse proxy cơ bản, người dùng có thể thông qua mod_proxy trên CentOS 7 với các bước thực hiện được hướng dẫn chi tiết:
Bước 1: Tìm hiểu các module Apache cần thiết
Để sử dụng Apache như là reverse proxy, người dùng cần cài đặt và sử dụng các module cần thiết bao gồm mod_proxy
và một số add-on module khác. Những module này giúp mở rộng chức năng cho Apache nhằm hỗ trợ cho các giao thức mạng khác nhau. Cụ thể:
mod_proxy
: Là module chính của Apache được sử dụng để chuyển hướng kết nối. Module này đóng vai trò cho phép Apache hoạt động như một cổng vào các máy chủ ứng dụng cơ sở.mod_proxy http
: Là một add-on module được sử dụng để thêm hỗ trợ cho các kết nối HTTP proxy.mod_proxy balancer
vàmod_lbmethod_byrequests
: Là 2 add-on module được sử dụng để thêm tính năng load balancing cho nhiều máy chủ backend.
Với phiên bản cài đặt CentOS 7 mới, 4 module trên sẽ ở được kích hoạt mặc định. Vì thế, người dùng có thể xác minh trạng thái hoạt động của những module này bằng cách khởi chạy lệnh:
httpd -M
Output sẽ hiển thị kết quả xử lý là danh sách các module Apache đã kích hoạt, trong đó 4 module kể trên cũng được đến đó:
Output
. . .
proxy_module (shared)
. . .
lbmethod_byrequests_module (shared)
. . .
proxy_balancer_module (shared)
. . .
proxy_http_module (shared)
. . .
Ngược lại, khi các module không được kích hoạt, người dùng có thể kích hoạt chúng bằng cách mở file /etc/httpd/conf.modules.d/00-proxy.conf
với nano
editor qua câu lệnh:
sudo nano /etc/httpd/conf.modules.d/00-proxy.conf
Đồng thời, người dùng còn có thể xóa ghi chú các dòng với các module cần thiết bằng cách xóa dấu #
ở đầu dòng để file hiển thị như sau:
. . .
LoadModule proxy_module modules/mod_proxy.so
. . .
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
. . .
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
. . .
LoadModule proxy_http_module modules/mod_proxy_http.so
. . .
Sau đó, lưu file và khởi động lại Apache bằng câu lệnh sau để áp dụng các thay đổi đã thực hiện trên file cấu hình.
sudo systemctl restart httpd
Lúc này, Apache đã sẵn sàng để hoạt động như một reverse proxy cho các HTTP request.
Ở bước tiếp theo, người dùng sẽ tạo 2 server backend cơ bản để xác thực trạng thái cài đặt. Tuy nhiên, nếu đã có một hoặc một vài ứng dụng backend của riêng mình, người dùng có thể chuyển sang bước 3.
Khi sử dụng Apache như Reverse Proxy trên CentOS 7, bạn cần sở hữu một VPS chất lượng để có quyền truy cập và kiểm soát máy chủ của mình.
Vietnix hiện đang cung cấp các gói dịch vụ Cloud Server linh hoạt và đa dạng cấu hình như VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp và VPS NVMe với giá chỉ từ 89.000 VND/Tháng. Với các gói dịch vụ này, bạn sẽ có một môi trường ảo riêng hiệu quả để triển khai và quản lý ứng dụng của mình một cách ổn định.
Liên hệ với đội ngũ tư vấn của Vietnix để tìm hiểu gói VPS phù hợp với bạn ngay.
Bước 2: Tạo Backend Server thử nghiệm
Để kiểm tra trạng thái cài đặt của Apache có ổn định hay không, người dùng cần tạo 2 web server để phản hồi các HTTP request. Kết quả nhận được là một dòng văn bản đơn giản được trả về từ mỗi server. Cụ thể, một server sẽ nói “Hello world!” và server khác nói “Howdy world!”
Lưu ý: Trong các thiết lập không phải kiểm thử, các server backend thường trả về cùng một loại nội dung. Tuy nhiên, đối với thử nghiệm trên, việc 2 server trả về những thông báo khác nhau sẽ giúp người dùng dễ dàng kiểm tra được cơ chế load balancing có đang sử dụng ở cả 2 server.
Flask là một microframework của Python được sử dụng để xây dựng các ứng dụng web. Bởi vì Flask có cấu trúc đơn giản, chỉ cần vài dòng code để tạo ra một ứng dụng cơ bản, thế nên người dùng có thể thông qua Flask thực hiện tạo các test server.
Để tiến hành, trước tiên cần đặt các file IUS package repository (IUS – Inline with Upstream Stable – một dự dự án cộng đồng mang đến các bản cập nhật mới của phần mềm trên CentOS, bao gồm Python 3) bằng câu lệnh sau:
sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm
Sau đó, cài đặt Python 3 (Hướng dẫn chi tiết về cách cài đặt Python 3 trên CentOS 7 tại đây) và Pip – công cụ quản lý gói Python được khuyến khích sử dụng:
sudo yum -y install python35u python35u-pip
Để cài đặt Flask thông qua Pip, người dùng nhập lệnh sau:
sudo pip3.5 install flask
Giờ đây, khi đã hoàn tất cài đặt các thành phần cần thiết, người dùng tiếp tục tiến hành tạo một file mới để chứa mã cho backend server đầu tiên trong thư mục home của người dùng hiện tại. Cụ thể:
nano ~/backend1.py
Sau đó, sao chép đoạn code bên dưới vào file rồi thực hiện sao lưu và đóng file:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello world!'
Ở 2 dòng lệnh đầu tiên khởi tạo framework Flask. Có một hàm home()
trả về dòng văn bản (Hello world!
) và dòng @app.route('/')
ở trên định nghĩa hàm home()
cho biết Flask sử dụng giá trị trả về của hàm home()'
như một phản hồi cho các HTTP request được chỉ định tại / URL root của ứng dụng.
Tương tự, Backend server thứ 2 cũng giống với server đầu tiên, ngoại trừ việc trả về một dòng văn bản khác. Do đó, người dùng cần bắt đầu bằng cách sao chép file đầu tiên như sau:
cp ~/backend1.py ~/backend2.py
Tiếp đó, mở file vừa được sao chép với lệnh:
nano ~/backend2.py
Thay đổi thông điệp trả về từ “Hello world!” thành “Howdy world!”. Sau đó lưu và đóng file.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Howdy world!'
Tiếp đó, nhập câu lệnh bên dưới để khởi động background server đầu tiên trên cổng 8080
. (Điều này cũng đồng thời làm chuyển hướng Output Flask đến /dev/null
vì framework này sẽ làm console output mờ hơn).
FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
Tại đây, người cần thiết lập environment variable FLASK APP
trước khi chạy lệnh flask
. Các environment variable là một cách tiện lợi để truyền thông tin vào các tiến trình được sinh ra từ shell.
Ở trường hợp này, việc sử dụng environment variable đảm bảo rằng cài đặt chỉ áp dụng cho lệnh đang xử lý và sẽ không còn khả dụng sau đó. Bởi vì, người dùng sẽ chuyển một tên file khác theo cùng cách để cho lệnh flask
biết khởi chạy server thứ 2.
Tương tự, người dùng còn có thể thông qua cổng 8081
để khởi động server thứ 2 bằng câu lệnh bên dưới. Lưu ý giá trị khác cho environment variable FLASK_APP
.
FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
Bên cạnh đó, để kiểm tra trạng thái hoạt động của 2 server, người dùng có thể sử dụng lệnh curl
. Cụ thể, kiểm tra server thứ nhất bằng cách nhập:
curl http://127.0.0.1:8080/
Trong terminal, output xuất kết quả Hello world!. Tiếp theo, để kiểm tra server thứ 2, nhập:
curl http://127.0.0.1:8081/
Output sẽ hiển thị Howdy world!.
Lưu ý: Khi người dùng không cần sử dụng đến 2 server test này nữa, có thể đóng chúng lại bằng các thực thi lệnh killall flask
.
Bước 3: Thay đổi cấu hình mặc định để kích hoạt Reverse Proxy
Người dùng sẽ thiết lập Apache virtual host mặc định để đóng vai trò như một reverse proxy cho backend server đơn hoặc một loạt các load balancing backend server.
Lưu ý: Bước hướng dẫn này sẽ giúp người dùng cấu hình Apache ở mức độ virtual host. Bởi vì theo cài đặt mặc định Apache sẽ không cấu hình virtual host nào. Do đó, để lấy hết lưu lượng truy cập thì người dùng cần tạo một virtual host mặc định.
Bên cạnh đó, nếu Apache server của người dùng hoạt động như 2 server HTTP và HTTPS thì cấu hình reverse proxy phải được đặt ở cả 2 virtual server HTTP và HTTPS.
Để tạo một virtual host mặc định mới, người dùng cần tạo một file cấu hình Apache mới trống trong thư mục /etc/httpd/conf.d
bằng nano
text editor. Cụ thể:
sudo nano /etc/httpd/conf.d/default-site.conf
Dưới đây là 2 ví dụ để cấu hình virtual host mặc định để reverse proxy cho một hoặc nhiều backend server:
Ví dụ 1: Reverse proxy cho một backend server
Dán đoạn nội dung bên dưới vào file default-site.conf
để configuration file của người dùng:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
Trường hợp người dùng đã làm theo các server ở ví dụ trong bước 2 thì cần sử dụng 127.0.0.1:8080
được viết trong block trên. Tuy nhiên, nếu người dùng có các app server trong hệ thống của mình thì cần sử dụng địa chỉ IP của chúng thay vì địa chỉ IP mặc định.
Ở đây sẽ có 3 directive:
ProxyPreserveHost
: Đây là một tùy chọn cấu hình trong Apache, được sử dụng để giữ nguyên giá trị củahost
header và chuyển tiếp đến backend server. Việc làm này rất hữu ích, giúp backend server nhận biết địa chỉ được sử dụng để truy cập ứng dụng.ProxyPass
: Là một directive cấu hình chính của proxy. Trong trường hợp này, directive sẽ bao gồm mọi thứ dưới URL root (/
) và được ánh xạ đến backend server với địa chỉ đã có sẵn. Ví dụ: Nếu Apache nhận được yêu cầu cho/example
thì sẽ kết nối đến backend server đó với URLhttp://your_backend_server/example
và phản hồi trả lại cho client ban đầu.ProxyPassReverse
: Có cấu hình tương tự nhưProxyPass
. ProxyPassReverse cho phép Apache chỉnh sửa các tiêu đề phản hồi từ backend server. Qua đó, có thể đảm bảo rằng nếu backend server trỏ về tiêu đề chuyển hướng vị trí (location redirect header) thì trình duyệt của client sẽ được chuyển hướng đến địa chỉ proxy chứ không phải địa chỉ backend server.
Để áp dụng những thay đổi trên, người dùng cần khởi động lại Apache bằng cách nhập lệnh:
sudo systemctl restart httpd
Giờ đây, nếu người dùng truy cập vào http://your_server_ip
thông qua trình duyệt web sẽ thấy phản hồi của backend server thay vì trang chào mừng tiêu chuẩn của Apache. Mặt khác, nếu người dùng đã thực hiện theo hướng dẫn ở bước 2, sẽ thấy hiển thị dòng chữ Hello world!.
Ví dụ 2: Load balancing thông qua nhiều backend server
Nếu người dùng có nhiều backend server thì cách tốt nhất để phân phối lưu lượng khi ủy quyền trên các server này là sử dụng các tính năng load balancing của mod_proxy
.
Quá trình thực hiện bằng cách thay thế tất cả nội dung trong VirtualHost
block với đoạn nội dung sau:
<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 này tương như cấu hình trước, tuy nhiên, thay vì chỉ định một backend server duy nhất thì người dùng sử dụng một Proxy
block để xác định nhiều server. Block được đặt tên là balancer://mycluster
(tên có thể tự do tùy chỉnh) và bao gồm một hoặc nhiều BalancerMembers
được chỉ định địa chỉ backend server bên dưới.
Bên cạnh đó, thay vì chỉ định một server cụ thể thì người dùng có thể sử dụng vùng load balancing có tên là mycluster cho 2 directive ProxyPass
và ProxyPassReverse
.
Nếu người dùng đã thực hiện theo server được ví dụ ở bước 2, hãy sử dụng lệnh 127.0.0.1:8080
và 127.0.0.1:8081
trong block trên để directive cho BalancerMember
. Mặt khác, nếu người dùng đã có app server của riêng mình thì hãy sử dụng địa chỉ này để thay thế.
Sau đó, thực hiện lệnh khởi động lại Apache để lưu và kích hoạt các thay đổi:
sudo systemctl restart httpd
Nếu người dùng truy cập vào http://your_server_ip
trên trình duyệt web sẽ thấy các phản hồi từ các backend server thay vì hiển thị trang Apache tiêu chuẩn. Trường hợp người dùng thực hiện theo bước 2 thì việc làm mới trang nhiều lần sẽ hiển thị dòng Hello world! và Howdy world!. Điều này đồng nghĩa rằng reverse proxy đã hoạt động và đang load balancing giữa 2 server.
Vietnix là một nhà cung cấp dịch vụ VPS hàng đầu tại Việt Nam với 11 năm kinh nghiệm và hơn 50.000 khách hàng tin tưởng lựa chọn. Luôn đặt chất lượng dịch vụ đặt lên hàng đầu, Vietnix cam kết các gói VPS khi tới tay khách hàng đều có tốc độ truy cập nhanh, ổn định và bảo mật cao.
Không chỉ được đánh giá cao về chất lượng sản phẩm, Vietnix còn chú trọng đến dịch vụ hỗ trợ khách hàng. Đội ngũ kỹ thuật của Vietnix túc trực 24/7 để hỗ trợ mọi vấn đề trong quá trình sử dụng VPS của khách hàng. Vì vậy, đến 97% khách hàng của Vietnix đều đánh giá 5 sao sau khi sử dụng.
Nhờ không ngừng nghỉ nâng cao chất lượng sản phẩm, mang lại sự hài lòng cho khách hàng, Vietnix đã nhận được giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022.
Hãy lựa chọn Vietnix để trải nghiệm dịch vụ VPS tốc độ cao, ổn định. Liên hệ ngay để được tư vấn.
- Đị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
- Email: sales@vietnix.com.vn
Lời kết
Trên đây là chi tiết hướng dẫn người dùng sử dụng Apache làm reverse proxy với mod proxy trên CentOS 7. Hy vọng những thông tin này sẽ giúp bạn có thêm các kiến thức hữu ích về mod_proxy để khai thác và áp dụng hiệu quả. Ngoài ra, nếu có thắc mắc nào trong quá trình thực hiện, bạn đừng ngại để lại bình luận để được hỗ trợ giải đáp nhanh nhất nhé.