Khi chạy một ứng dụng web, thông thường bạn muốn tận dụng tối đa tài nguyên của mình mà không phải chuyển đổi phần mềm để sử dụng các vòng lặp sự kiện đa luồng hoặc phức tạp. Docker, tuy nhiên, cung cấp một cách đơn giản để bạn tải cân bằng nội bộ ứng dụng của mình để tận dụng tối đa tài nguyên máy chủ. Bài viết này sẽ chỉ cho bạn cách sử dụng Nginx để tải cân bằng ứng dụng web của bạn bằng Docker trên CentOS.
Bước 1: Tạo một ứng dụng đơn giản
Chúng tôi sẽ sử dụng rỉ sét để xây dựng ứng dụng đơn giản này. Giả sử rằng bạn đã cài đặt gỉ, chạy cargo new webapp –bin
. Khi thành công, bạn sẽ thấy một thư mục được gọi là webapp
. Bên trong webapp
, bạn sẽ thấy một tập tin được gọi là Cargo.toml
. Nối các dòng sau vào nó:
[dependencies.iron]
version = "*"
Tiếp theo, bên trong src/main.rs
tệp, xóa mọi thứ và điền vào tệp sau:
extern crate iron;
use iron::prelude::*;
use iron::status;
fn main() {
Iron::new(|_: &mut Request| {
Ok(Response::with((status::Ok, "Hello Vultr :)")))
}).http("0.0.0.0:3000").unwrap();
}
Lưu ý: Không thay đổi IP trong ứng dụng. Điều này được cấu hình để Docker có thể nghe ứng dụng của bạn.
Một khi bạn đã hoàn thành, biên dịch ứng dụng bằng cách thực hiện cargo build –release
. Tùy thuộc vào máy chủ của bạn, có thể mất vài phút. Nếu không có lỗi, hãy kiểm tra ứng dụng bằng cách làm theo các bước sau:
- Chạy đi
target/release/webapp
.
- Điều hướng đến
http://0.0.0.0:3000/
trong trình duyệt của bạn. Thay thế 0.0.0.0
bằng địa chỉ IP của máy chủ của bạn.
Nếu mọi thứ hoạt động tốt, bạn sẽ thấy "Xin chào Vultr :)" trên trang.
Bước 2: Tạo container Docker
Tạo một Dockerfile
và điền vào nó như sau:
FROM centos:latest
MAINTAINER User <user@localhost>
RUN yum update -y
COPY ./webapp/target/release/webapp /opt/
EXPOSE 3000
WORKDIR /opt
CMD ./webapp
Lưu các tập tin. Sau đó tạo một tệp được gọi deploy.sh
và điền vào tệp sau:
DEFAULT_PORT=45710
APP_PORT=3000
DEPLOY=5
NAME="webapp"
docker build -t webapp:example .
for ((i=0; i<DEPLOY; i++)); do
docker kill $NAME$i ; docker rm $NAME$i
docker run --name $NAME$i -p 127.0.0.1:$(((i * 1000) + DEFAULT_PORT)):$APP_PORT -d webapp:example
done
Khi bạn chạy tập lệnh này, nó sẽ xây dựng hình ảnh và triển khai vùng chứa dựa trên số lượng bạn đã đặt (mặc định là 5). Nếu container tồn tại, nó sẽ giết và xóa nó khỏi registry trước khi nó được triển khai lại.
Bây giờ, tạo tệp cấu hình Nginx và điền vào tệp sau:
upstream application {
server localhost:45710;
server localhost:46710;
server localhost:47710;
server localhost:48710;
server localhost:49710;
}
server {
listen 0.0.0.0:80;
location / {
expires 1w;
proxy_pass http://application;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
}
Thay thế 0.0.0.0
bằng địa chỉ IP của máy chủ của bạn.
Khởi động lại Nginx bằng cách làm systemctl restart nginx
. Giải quyết bất kỳ lỗi nào, sau đó tiến hành bước tiếp theo.
Bước 4: Triển khai ứng dụng
Triển khai ứng dụng bằng cách chạy bash ./deploy.sh
.
Bạn có thể kiểm tra trạng thái của ứng dụng của mình với docker ps
- sẽ có 5 hình ảnh được tạo bắt đầu bằng webapp
. Bây giờ, điều hướng đến http://0.0.0.0:3000/
trong trình duyệt của bạn, bạn sẽ thấy thông báo "Xin chào, Vultr :)".
Vì vậy, chính xác sự khác biệt này làm gì?
Nếu bạn chạy thử nghiệm điểm chuẩn so với cấu hình cân bằng tải, bạn sẽ nhận thấy rằng nhiều tài nguyên máy chủ của bạn đang được sử dụng, đó là điều bạn muốn, đặc biệt là nếu ứng dụng của bạn được xây dựng bằng các ngôn ngữ như Node, nơi nó thường được phân luồng. Nếu bạn cần nâng cấp ứng dụng của mình, bạn có thể làm như vậy và chạy lại deploy.sh
để xây dựng lại hình ảnh và triển khai các thùng chứa của bạn.