JABZ7SHOP : Web Selling Things With Cheap Price : https://jabz7shop.blogspot.com/ : Go To My Shop Online Now
Bài đăng

Cách sử dụng Apache làm Reverse-Proxy với mod_proxy trên Ubuntu 20.04

 

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:
  1. sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests

Để những thay đổi này có hiệu lực, hãy khởi động lại Apache:

  1. sudo systemctl restart apache2

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:

  1. sudo apt update

Sau đó, tiến hành cài đặt pip, trình kiến nghị việc quản lý các gói Python:

  1. sudo apt install python3-pip

Tiếp theo, sử dụng pip để cài đặt Flask:

  1. sudo pip3 install 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:

  1. nano ~/backend1.py

Chèn đoạn code sau vào tệp:

~/backend1.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello world!'

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:

  1. cp ~/backend1.py ~/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:

  1. nano ~/backend2.py

Cập nhật thông báo trả về là tin nhắn hello world thay vì đọc Howdy world:

~/backend2.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
    return '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:

  1. FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &

Ở đâ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:

  1. FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &

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ó:

  1. curl http://127.0.0.1:8080/

Thao tác này sẽ in phản hồi sau từ máy chủ:

Output
Hello world!

Tiếp theo, kiểm tra máy chủ thứ hai:

  1. curl http://127.0.0.1:8081/

Tương tự như trước đó, điều này sẽ in phản hồi mong đợi từ máy chủ:

Output
Howdy 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:

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

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ế:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:8080/ 
    ProxyPassReverse / http://127.0.0.1:8080/ 
</VirtualHost>

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ới http: // 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ới ProxyPass. 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:

  1. sudo systemctl restart apache2

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:

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

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ế:

/etc/apache2/sites-available/000-default.conf
<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 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ối Proxy 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ều BalancerMembers, 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:

  1. sudo systemctl restart apache2

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
00:00 / 00:00

Đăng nhận xét