Trinn 1: Lag en enkel applikasjon
Trinn 2: Lag Docker-beholdere
Trinn 3: Konfigurer Nginx
Trinn 4: Implementer applikasjonen
Når du kjører en nettapplikasjon, vil du vanligvis få mest mulig ut av ressursene dine uten å måtte konvertere programvaren til å bruke multithreading eller komplekse hendelsesløkker. Docker tilbyr imidlertid en enkel måte for deg å lastebalanse applikasjonen din internt for å få mest mulig ut av serverressurser. Denne artikkelen vil vise deg hvordan du bruker Nginx til å lastebalanse nettapplikasjonen din ved å bruke Docker på CentOS.
Trinn 1: Lag en enkel applikasjon
Vi vil bruke rust for å bygge denne enkle applikasjonen. Forutsatt at du har rust installert, kjør cargo new webapp –bin
. Ved suksess vil du se en katalog som heter webapp
. Inne i webapp
vil du se en fil som heter Cargo.toml
. Legg til følgende linjer:
[dependencies.iron]
version = "*"
Deretter, inne i src/main.rs
filen, fjern alt og fyll den med følgende:
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();
}
Merk: Ikke endre IP-en i applikasjonen. Dette er konfigurert slik at Docker kan lytte til applikasjonen din.
Når du er ferdig, kompilerer du programmet ved å kjøre cargo build –release
. Avhengig av serveren din, kan det ta noen minutter. Hvis det ikke er noen feil, test programmet ved å følge disse trinnene:
- Løp
target/release/webapp
.
- Naviger til
http://0.0.0.0:3000/
i nettleseren din. Erstatt 0.0.0.0
med IP-adressen til serveren din.
Hvis alt fungerte som det skal, vil du se "Hei Vultr :)" på siden.
Trinn 2: Lag Docker-beholdere
Opprett en Dockerfile
og fyll den med følgende:
FROM centos:latest
MAINTAINER User <user@localhost>
RUN yum update -y
COPY ./webapp/target/release/webapp /opt/
EXPOSE 3000
WORKDIR /opt
CMD ./webapp
Lagre filen. Deretter oppretter du en fil som heter deploy.sh
og fyller den med følgende:
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
Når du kjører dette skriptet, vil det bygge bildet og distribuere beholderen basert på mengden du har angitt (standard er 5). Hvis beholderen eksisterer, vil den drepe og fjerne den fra registret før den distribueres igjen.
Opprett nå en Nginx-konfigurasjonsfil og fyll den med følgende:
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;
}
}
Erstatt 0.0.0.0
med IP-adressen til serveren din.
Start Nginx på nytt ved å gjøre systemctl restart nginx
. Løs eventuelle feil, og fortsett til neste trinn.
Trinn 4: Implementer applikasjonen
Distribuer applikasjonen ved å kjøre bash ./deploy.sh
.
Du kan sjekke statusen til søknaden din med docker ps
- det blir opprettet 5 bilder som starter med webapp
. Nå, naviger til http://0.0.0.0:3000/
i nettleseren din, vil du se "Hei, Vultr :)"-meldingen igjen.
Så, hvilken forskjell gjør dette egentlig?
Hvis du kjører en benchmark-test mot belastningsbalanserkonfigurasjonen, vil du legge merke til at flere av serverressursene dine blir brukt, noe du vil ha, spesielt hvis applikasjonen din er bygget på språk som Node der den normalt vil være entrådet. Hvis du noen gang trenger å oppgradere applikasjonen din, kan du gjøre det og kjøre på nytt for deploy.sh
å gjenoppbygge bildet og distribuere beholderne.