Làm thế nào để sử dụng Apache như một Proxy ngược với mod_proxy trên Ubuntu 16.04

Giới thiệu

A proxy ngược là một loại máy chủ proxy nhận các yêu cầu HTTP (S) và phân phối rõ ràng chúng tới một hoặc nhiều máy chủ phụ trợ. Proxy ngược rất hữu ích vì nhiều ứng dụng web hiện đại xử lý các yêu cầu HTTP đến bằng cách sử dụng các máy chủ ứng dụng phụ trợ mà người dùng không trực tiếp truy cập và thường chỉ hỗ trợ các tính năng HTTP thô sơ.

Bạn có thể sử dụng proxy ngược để ngăn các máy chủ ứng dụng cơ bản này truy cập trực tiếp. Chúng cũng có thể được sử dụng để phân phối tải từ các yêu cầu gửi đến một số máy chủ ứng dụng khác nhau, tăng hiệu suất ở quy mô và cung cấp sự an toàn không thành công. Họ có thể lấp đầy khoảng trống với các tính năng mà các 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ẽ thiết lập Apache làm proxy ngược cơ bản bằng cách sử dụng mod_proxy mở rộng để chuyển hướng các kết nối đến tới một hoặc một số máy chủ phụ trợ chạy trên cùng một mạng. Hướng dẫn này sử dụng một backend đơn giản được viết với Flask web framework, nhưng bạn có thể sử dụng bất kỳ máy chủ phụ trợ nào bạn thích.

Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn sẽ cần:

Bước 1 - Kích hoạt các mô-đun Apache cần thiết

Apache có nhiều mô-đun đi kèm với nó có sẵn nhưng không được kích hoạt trong cài đặt mới. Đầu tiên, chúng ta cần kích hoạt những cái chúng ta sẽ sử dụng trong hướng dẫn này.

Các mô-đun chúng tôi cần là mod_proxy chính nó và một số mô-đun bổ sung của nó, mở rộng chức năng của nó để hỗ trợ các giao thức mạng khác nhau. Cụ thể, chúng tôi sẽ sử dụng:

  • mod_proxy, module mô-đun proxy chính của Apache để chuyển hướng các kết nối; nó cho phép Apache hoạt động như một cổng vào các máy chủ ứng dụng cơ bản.
  • mod_proxy_http, bổ sung hỗ trợ cho các kết nối HTTP proxy.
  • mod_proxy_balancermod_lbmethod_byrequests, bổ sung các tính năng cân bằng tải cho nhiều máy chủ phụ trợ.

Để kích hoạt bốn mô-đun này, hãy thực hiện các lệnh sau trong lần kế tiếp.

sudo a2enmod proxy

sudo a2enmod proxy_http

sudo a2enmod proxy_balancer

sudo a2enmod lbmethod_byrequests

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

sudo systemctl restart apache2

Apache hiện đã sẵn sàng hoạt động như một proxy ngược cho các yêu cầu HTTP. Trong bước tiếp theo (tùy chọn), chúng tôi sẽ tạo hai máy chủ phụ trợ cơ bản. Điều này sẽ giúp chúng tôi xác minh xem cấu hình có hoạt động đúng hay không, nhưng nếu bạn đã có (các) ứng dụng phụ trợ của riêng mình, bạn có thể chuyển sang Bước 3.

Bước 2 - Tạo máy chủ thử nghiệm phụ trợ

Chạy một số máy chủ phụ trợ đơn giản là một cách dễ dàng để kiểm tra xem cấu hình Apache của bạn có hoạt động đúng hay không. Ở đây, chúng tôi sẽ tạo hai máy chủ thử nghiệm đáp ứng 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 Chào thế giới! và người kia sẽ nói Howdy thế giới!.

Chú thích: Trong các thiết lập không kiểm tra, máy chủ phụ trợ thường trả về cùng một loại nội dung. Tuy nhiên, đối với thử nghiệm này đặc biệt, việc có hai máy chủ trả về các thông báo khác nhau giúp dễ dàng kiểm tra xem cơ chế cân bằng tải có sử dụng cả hai hay không.

Flask là một microframework Python để xây dựng các ứng dụng web. Chúng tôi đang sử dụng Flask để tạo các máy chủ thử nghiệm vì ứng dụng cơ bản chỉ yêu cầu một vài dòng mã. Bạn không cần phải biết Python để thiết lập chúng, nhưng nếu bạn muốn tìm hiểu, bạn có thể xem xét các hướng dẫn Python này.

Cập nhật danh sách các gói trước.

sudo apt-get update

Sau đó cài đặt Pip, trình quản lý gói Python được đề xuất.

sudo apt-get -y install python3-pip

Sử dụng Pip để cài đặt Flask.

sudo pip3 install flask

Bây giờ tất cả các thành phần cần thiết được cài đặt, bắt đầu bằng cách tạo một tệp mới sẽ chứa mã cho máy chủ phụ trợ đầu tiên trong thư mục chính của người dùng hiện tại.

nano ~/backend1.py

Sao chép mã sau vào tệp, sau đó lưu và đóng lại.

~/backend1.py

from flask import Flask
app = Flask(__name__)

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

Hai dòng đầu tiên khởi tạo khung công tác Flask. Có một chức năng, home(), trả về một dòng văn bản (Hello world!). Các @app.route('/') dòng phía trên home() định nghĩa hàm cho Flask sử dụng home()Giá trị trả về là phản hồi cho các yêu cầu HTTP được hướng đến / URL gốc của ứng dụng.

Máy chủ phụ trợ thứ hai hoàn toàn giống với máy chủ đầu tiên, ngoài việc trở về một dòng văn bản khác, vì vậy hãy bắt đầu bằng cách sao chép tệp đầu tiên.

cp ~/backend1.py ~/backend2.py

Mở tệp mới được sao chép.

nano ~/backend2.py

Thay đổi tin nhắn được trả về từ Chào thế giới! đến Howdy thế giới!, sau đó lưu và đóng tệp.

~/backend2.py

from flask import Flask
app = Flask(__name__)

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

Sử dụng lệnh sau để khởi động máy chủ nền đầu tiên trên cổng 8080. Điều này cũng chuyển hướng đầu ra của Flask tới /dev/null bởi vì nó sẽ làm đám mây đầu ra trên bàn điều khiển tiếp tục.

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

Ở đây, chúng ta đang ở trước flask lệnh bằng cách thiết lập FLASK_APP biến môi trường trong cùng một dòng. Biến môi trường là một cách thuận tiện để truyền thông tin vào các tiến trình được sinh ra từ trình bao. Bạn có thể tìm hiểu thêm về biến môi trường trong Làm thế nào để đọc và đặt biến môi trường và vỏ trên một VPS Linux.

Trong trường hợp này, việc sử dụng biến môi trường đảm bảo rằng cài đặt chỉ áp dụng cho lệnh đang chạy và sẽ không có sẵn sau đó, vì chúng tôi sẽ chuyển tên tệp khác theo cách tương tự để thông báo flask lệnh để khởi động máy chủ thứ hai

Tương tự, sử dụng lệnh này để khởi động máy chủ thứ hai trên cổng 8081. Lưu ý giá trị khác nhau cho FLASK_APP biến môi trường.

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

Bạn có thể kiểm tra rằng hai máy chủ đang chạy bằng curl. Kiểm tra máy chủ đầu tiên:

curl http://127.0.0.1:8080/

Điều này sẽ xuất Chào thế giới! trong nhà ga. Kiểm tra máy chủ thứ hai:

curl http://127.0.0.1:8081/

Điều này sẽ xuất Howdy thế giới! thay thế.

chú thích: Để đóng cả hai 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 thi killall flask.

Trong bước tiếp theo, chúng tôi sẽ sửa đổi tập tin cấu hình của Apache để cho phép sử dụng nó như một proxy ngược.

Bước 3 - Sửa đổi cấu hình mặc định để kích hoạt Proxy ngược

Trong phần này, chúng tôi sẽ thiết lập máy chủ ảo Apache mặc định để phục vụ như một proxy ngược cho máy chủ phụ trợ đơn lẻ hoặc một loạt các máy chủ phụ trợ cân bằng tải.

chú thích: Trong hướng dẫn này, chúng tôi đ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 được bật. Tuy nhiên, bạn 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. Để tìm hiểu thêm về các máy chủ ảo trong Apache, bạn có thể đọc Làm thế nào để thiết lập máy chủ ảo Apache trên Ubuntu 16.04 hướng dẫn.

Nếu máy chủ Apache của bạn hoạt động như cả máy chủ HTTP và HTTPS, cấu hình proxy ngược của bạn phải được đặt trong cả máy chủ ảo HTTP và HTTPS. Để tìm hiểu thêm về SSL với Apache, bạn có thể đọc Cách tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 16.04 hướng dẫn.

Mở tệp cấu hình Apache mặc định bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn.

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

Bên trong tập tin đó, bạn sẽ tìm thấy <VirtualHost *:80> khối bắt đầu trên dòng đầu tiên. Ví dụ đầu tiên dưới đây giải thích cách cấu hình khối này để đảo ngược proxy cho một máy chủ phụ trợ duy nhất và thứ hai thiết lập proxy ngược cân bằng tải cho nhiều máy chủ phụ trợ.

Ví dụ 1 - Reverse Proxying một máy chủ Backend đơn

Thay thế tất cả nội dung bên trong VirtualHost chặn với những điều sau đây, vì vậy tệp cấu hình của bạn trông giống như sau:

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

Nếu bạn theo dõi cùng với các máy chủ mẫu trong Bước 2, hãy sử dụng 127.0.0.1:8080 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 họ thay thế.

Có ba chỉ thị ở đây:

  • ProxyPreserveHost làm cho Apache vượt qua bản gốc Host tiêu đề đến máy chủ phụ trợ. Điều này rất hữu ích, vì nó làm cho máy chủ phụ trợ nhận biết địa chỉ được sử dụng để truy cập ứng dụng.
  • ProxyPass là chỉ thị cấu hình proxy chính. Trong trường hợp này, nó chỉ định rằng mọi thứ trong URL gốc (/) nên được ánh xạ tới máy chủ phụ trợ tại địa chỉ đã cho. Ví dụ: nếu Apache nhận được yêu cầu /example, nó sẽ kết nối với http://your_backend_server/example và trả lại phản hồi cho khách hàng ban đầu.
  • ProxyPassReverse nên có cùng cấu hình như ProxyPass. Nó báo cho Apache sửa đổi các tiêu đề phản hồi từ máy chủ phụ trợ. Điều này đảm bảo rằng nếu máy chủ phụ trợ 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 tới địa chỉ proxy chứ không phải địa chỉ máy chủ phụ trợ, sẽ không hoạt động như dự định.

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

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ủ phụ trợ thay vì trang chào đón chuẩn của Apache. Nếu bạn đã làm theo Bước 2, điều này có nghĩa là bạn sẽ thấy Hellow thế giới!.

Ví dụ 2 - Cân bằng tải trên nhiều máy chủ phụ trợ

Nếu bạn có nhiều máy chủ phụ trợ, một cách hay để phân phối lưu lượng truy cập trên các máy chủ đó khi proxy là sử dụng các tính năng cân bằng tải của mod_proxy.

Thay thế tất cả nội dung trong VirtualHost chặn với những điều sau đây, vì vậy tệp cấu hình của bạn trông giống như sau:

/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 một máy chủ phụ trợ trực tiếp, chúng tôi đã sử dụng một cấu hình bổ sung Proxy để xác định nhiều máy chủ. Khối được đặt tên balancer://mycluster (tên có thể được tự do thay đổi) và bao gồm một hoặc nhiều BalancerMembers, chỉ định các địa chỉ máy chủ phụ trợ cơ bản. Các ProxyPassProxyPassReverse chỉ thị 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 theo dõi cùng với các máy chủ mẫu trong Bước 2, hãy sử dụng 127.0.0.1:8080127.0.0.1:8081 cho BalancerMember chỉ thị, 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 họ thay thế.

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

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 các phản hồi của máy chủ phụ trợ thay vì trang Apache chuẩn. Nếu bạn đã làm theo Bước 2, hãy làm mới trang nhiều lần sẽ hiển thị Chào thế giới!Howdy thế giới!, nghĩa là proxy ngược hoạt động và cân bằng tải giữa hai máy chủ.

Phần kết luận

Bây giờ bạn đã biết cách thiết lập Apache như một proxy ngược với 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ả để cấu hình proxy ngược với các máy chủ ứng dụng được viết bằng một loạt các 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 giữa nhiều máy chủ phụ trợ cho các trang có nhiều lưu lượng truy cập hoặc cung cấp tính sẵn sàng cao thông qua nhiều máy chủ hoặc để cung cấp hỗ trợ SSL an toàn cho máy chủ phụ trợ không hỗ trợ SSL.

Trong khi mod_proxy với mod_proxy_http là sự kết hợp có lẽ thường được sử dụng nhất của các mô-đun, có một số khác hỗ trợ các giao thức mạng khác nhau. Chúng tôi đã không sử dụng chúng ở đây, nhưng một số mô-đun phổ biến khác bao gồm:

  • mod_proxy_ftp cho FTP.
  • mod_proxy_connect cho đường hầm SSL.
  • mod_proxy_ajp cho AJP (Giao thức JServ Apache), giống như các chương trình phụ trợ dựa trên Tomcat.
  • mod_proxy_wstunnel cho các ổ cắm web.

Để tìm hiểu thêm về mod_proxy, bạn có thể đọc Apache chính thức mod_proxy tài liệu.

Thêm Bình Luận: