간단한 Nginx 웹 서버를 만드는 방법은 무엇입니까?
대상 고객
Nginx, Docker, Containers, Node.js에 대해 배우려는 사람들을 대상으로 이 기사를 작성했습니다.
학습 목표
이 문서를 완료하면 다음을 수행하는 방법을 알게 됩니다.
이 문서를 완료하면 다음을 수행하는 방법을 알게 됩니다.
docker-compose.yml
구성Nginx는 무엇입니까?
Nginx는 web server, reverse proxy, 메일 프록시 및 load balancer으로도 사용할 수 있는 HTTP cache입니다.
이 기사에서는 nginx를 로드 밸런서로 사용합니다.
부하 분산
리버스 프록시 서버는 "교통 경찰"역할을 할 수 있습니다. 백엔드 서버 앞에 앉아 클라이언트 요청을 서버 그룹 전체에 걸쳐 속도와 용량 활용을 극대화하는 동시에 서버에 과부하가 걸리지 않도록 하는 방식으로 클라이언트 요청을 분산시켜 성능을 저하시킬 수 있습니다. . 서버가 다운되면 load balancer은 나머지 온라인 서버로 트래픽을 리디렉션합니다.
아래에서 로드 밸런싱을 위한 nginx 구성의 예를 볼 수 있습니다.
#ngnix.conf file
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
이 예에서는 요청을 처리하기 위해 포트 80을 수신합니다. 각 요청에 대해 nginx는 클라이언트를 srv1에서 srv3으로 라우팅합니다. 로드 밸런싱 방법이 특별히 구성되지 않은 경우 기본적으로 라운드 로빈으로 설정됩니다.
다른 로드 밸런싱 방법을 확인할 수 있습니다here.
도커
Docker는 애플리케이션 배포를 위한 플랫폼입니다. 애플리케이션을 이미지로 분리하여 작동합니다. 이미지는 운영 체제 및 지원 소프트웨어가 포함된 컨테이너에서 실행됩니다. ( source )
도커 컨테이너란 무엇입니까?
ADocker container image는 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정 등 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 경량의 독립형 실행 가능 소프트웨어 패키지입니다.
Docker를 사용하여 애플리케이션을 컨테이너화하면 다양한 환경에 대해 걱정할 필요가 없습니다. 따라서 애플리케이션이 로컬 머신에서 실행될 때 docker를 사용하여 컨테이너화하면 서버에서도 실행됩니다. 사용되는 라이브러리를 지정하기 때문에 로컬 환경과 서버 환경은 동일한 버전의 라이브러리와 운영 체제를 사용합니다.
노드 애플리케이션용 Dockerfile의 예
FROM node:12
WORKDIR /home/node
COPY . /home/node/
RUN npm install
CMD npm run app
node.js에서 간단한 http 서버 만들기
이 기사에서는 간단한 데모를 만들 것입니다. HTTP 라이브러리를 사용하여 HTTP 웹 서버를 생성합니다.
다음은 node.js의 HTTP 웹 서버 구현입니다.
const http = require("http");
const defaultPort = 999;
const portNumber = process.argv[2] || defaultPort;
const httpServer = http.createServer((req, res) => {
res.statusCode = 200;
res.end("this is port: " + portNumber);
});
httpServer.listen(portNumber, "0.0.0.0", () => {
console.log("listening on port ", portNumber);
console.log(httpServer.address());
});
이 구현 후에는 포트가 다른 두 개의 웹 서버를 시작합니다. 아래에서 예제 명령줄을 볼 수 있습니다.
node index.js 2222 #this will create a web server on port 2222
node index.js 3333 #this will create a web server on port 3333
두 개의 웹 서버를 시작한 후 웹 브라우저 또는 curl을 사용하여 테스트할 수 있습니다. curl을 사용하여 웹 서버에 요청할 수 있습니다. 아래 예에서 get 요청을 볼 수 있습니다.
curl -v localhost:2222 #make a get request on localhost:2222
응답:
* Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 2222 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 2222 (#0)
> GET / HTTP/1.1
> Host: localhost:2222
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 09 Jul 2022 15:15:47 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
< Content-Length: 18
<
* Connection #0 to host localhost left intact
this is port: 2222* Closing connection 0
Nginx 구성
이 데모에서는 nginx를 로드 밸런서로 사용하여 두 웹 서버 간에 라우팅합니다.
구현은 다음과 같습니다.
# nginx.conf file
http
{
upstream all
{
server 192.168.1.36:3333;
server 192.168.1.36:2222;
}
server
{
listen 8080;
location /
{
proxy_pass http://all;
}
}
}
events
{
}
도커파일:
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
Docker Compose에서 사용하려면 이 이미지를 빌드해야 합니다.build
명령을 사용하여 도커 이미지를 빌드할 수 있습니다. 다음은 예입니다.
docker build -t nginxapp .
nginx 이미지를 만든 후 dockore-compose 파일을 구성할 수 있습니다.
다음은 docker-compose.yml
에 대한 구현입니다.
version: "3"
services:
nginxapp1:
image: nginxapp
ports:
- "8080:8080"
docker compose up
를 사용하여 애플리케이션을 시작하고 docker compose down
를 사용하여 컨테이너를 종료 및 제거할 수 있습니다.
docker compose up
를 사용하여 nginx 애플리케이션을 시작한 후. 터미널에서 예제 출력을 볼 수 있습니다.
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
node-nginx-docker-tut-lb-1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
node-nginx-docker-tut-lb-1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Configuration complete; ready for start up
즉, nginx 서버를 시작했으므로 이제 curl을 사용하여 테스트할 수 있습니다.
❯ curl localhost:8080
this is port: 3333%
❯ curl localhost:8080
this is port: 2222
localhost:8080
각 요청이 라운드 로빈 알고리즘을 사용하여 다른 HTTP 웹 서버로 이동하는 경우 이 예제 출력에서 볼 수 있습니다.
Reference
이 문제에 관하여(간단한 Nginx 웹 서버를 만드는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/eminvergil/how-to-create-a-simple-nginx-web-server--145k
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#ngnix.conf file
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
FROM node:12
WORKDIR /home/node
COPY . /home/node/
RUN npm install
CMD npm run app
const http = require("http");
const defaultPort = 999;
const portNumber = process.argv[2] || defaultPort;
const httpServer = http.createServer((req, res) => {
res.statusCode = 200;
res.end("this is port: " + portNumber);
});
httpServer.listen(portNumber, "0.0.0.0", () => {
console.log("listening on port ", portNumber);
console.log(httpServer.address());
});
node index.js 2222 #this will create a web server on port 2222
node index.js 3333 #this will create a web server on port 3333
curl -v localhost:2222 #make a get request on localhost:2222
* Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 2222 failed: Connection refused
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 2222 (#0)
> GET / HTTP/1.1
> Host: localhost:2222
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 09 Jul 2022 15:15:47 GMT
< Connection: keep-alive
< Keep-Alive: timeout=5
< Content-Length: 18
<
* Connection #0 to host localhost left intact
this is port: 2222* Closing connection 0
# nginx.conf file
http
{
upstream all
{
server 192.168.1.36:3333;
server 192.168.1.36:2222;
}
server
{
listen 8080;
location /
{
proxy_pass http://all;
}
}
}
events
{
}
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
docker build -t nginxapp .
version: "3"
services:
nginxapp1:
image: nginxapp
ports:
- "8080:8080"
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
node-nginx-docker-tut-lb-1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
node-nginx-docker-tut-lb-1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
node-nginx-docker-tut-lb-1 | /docker-entrypoint.sh: Configuration complete; ready for start up
❯ curl localhost:8080
this is port: 3333%
❯ curl localhost:8080
this is port: 2222
Reference
이 문제에 관하여(간단한 Nginx 웹 서버를 만드는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/eminvergil/how-to-create-a-simple-nginx-web-server--145k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)