NGINX Docker 리버스 에이전트는 어떻게 설정합니까?
21113 단어 httpsreverseproxydockernginx
소개
로컬 서버를 설정하고 이를 기반으로 전단 프로그램을 만들 때 상상해 보세요.응용 프로그램의 API에 액세스하려면 example을 입력합니다.com:3000 응용 프로그램에 대해 이 예시와 같은 내용을 입력할 수 있습니다.통신: 4040.한 응용 프로그램은 여러 개의 포트를 가지고 서로 다른 페이지에 접근할 수 있습니다: 홈페이지, 계기판, 연락처, 표, e.t.c. 지금 상상해 보세요. 여러 응용 프로그램의 여러 개의 포트를 기억하세요.
API에 액세스하기 위해 이런 작업만 하는 것은 좋지 않습니다: 예.com/api 및 애플리케이션: 예.com/app.어리석은 포트를 입력하지 않아도 여러 용기에 루트를 만들 수 있습니다. 이 루트 URL은 어떤 내용이든 될 수 있습니다.docker의 역방향 에이전트를 사용하면 더욱 쉽게 실현할 수 있습니다.
무엇이 대리입니까?
나는 하나의 유형으로 그것을 해석해 보았다.네가 가장 좋아하는 식당에 들어갔다고 가정해 봐.배고파?너는 네가 가장 좋아하는 음식을 먹고 싶다.너는 종업원에게 음식을 하나 시켰다.종업원이 주문해 주고 주방으로 갈게요.종업원은 요리사에게 네가 종업원에게 요구하는 모든 것을 다 하라고 했다.요리사가 음식을 조리하다.종업원이 너에게 음식을 보내왔다.이해하기 쉽다
주의해야 할 관건적인 사항: 당신은 종업원에게 요구합니다.종업원이 너를 주방에 가지 못하게 한 것은 너의 요구를 만족시켰다.요리사는 그 요리를 누구에게 먹였는지 모른다.
이 예에서 종업원은 대리이고 요리사는 인터넷이다.에이전트는 당신과 인터넷 사이의 방화벽을 충당합니다.에이전트는 보안, 프라이버시 및 기타 수준의 기능을 제공합니다.나이지리아에 프록시 서버를 설정할 수 있습니다.그리고 인터넷에서 HTTP 요청을 보낼 수 있습니다. 이 요청은 나이지리아로 먼저 보내고 인터넷에서 easy 언어로 보낼 것입니다.
대리의 또 다른 예는 한 회사나 빌딩에 있는 여러 대의 컴퓨터다.회사 내부의 모든 컴퓨터의 IP 주소는 회사의 최고 IP 주소 아래에 있습니다.모든 인터넷 요청은 하나의 IP 주소에서 이루어지기 때문에 단일 컴퓨터로 거슬러 올라가기 어렵다.
에이전트는 안전한 외부 요청을 보내는 것이다.
리버스 에이전트
만약 내가 여기서 예를 들지 않는다면, 그것은 불공평한 것이다.이 비유는 매우 오래되었다.면책 성명: 나를 평가하지 마라. 나는 기술에 정통한 사람이다.만약 네가 아침에 깨어났다면, 우체부가 너의 문 위에 있는 것을 보았을 것이다.우체부는 너에게 편지, 영수증, 엽서, 그리고 다른 형식의 편지를 여러 통 주었다.모든 이 편지들은 다른 곳에서 부쳐졌지만, 결국 정확한 곳으로 보내졌다.
주의: 발송자는 당신과 직접 연락할 필요가 없습니다.우체부는 당신이 여러 출처에서 편지를 검색하는 것을 대표합니다.
이 예에서 우체부는 역방향 대리이고 원본은 클라이언트입니다. 신청하고 있습니다.클라이언트가 응용 프로그램과 대화하기 위해 HTTP 요청을 보냅니다.클라이언트가 응용 프로그램을 보고 싶어 하기 때문에 클라이언트가 이 요청을 만듭니다: 예.일반 도메인 이름 형식입니다.그러나 막후 역방향 에이전트는 이 요청을 예시로 변환합니다.통신: 8080.클라이언트나 사용자가 API를 보려면 클라이언트가 다음과 같은 요청을 작성합니다. 예.com/api, 그러나 막후에서 프록시를 반대로 바꾸면 예시로 바뀝니다.통신: 3000.리버스 에이전트는 웹 서버 앞에 위치하고 클라이언트 요청을 서버로 전송합니다.역방향 에이전트는 일반적으로 안전성, 성능, 신뢰성을 향상시키는 데 쓰인다.
리버스 에이전트는 안전한 내부 요청을 할 수 있습니다.
Docker가 뭐예요?
Docker는 컨테이너를 사용하여 응용 프로그램을 생성, 실행 및 배포하는 데 사용되는 유행하는 기업 PAAS (플랫폼 즉 서비스) 입니다.용기는 개발자가 필요한 모듈, 라이브러리, 의존항 패키지 응용 프로그램을 사용하고 패키지 중 하나로 배치할 수 있도록 한다.Docker는 기존 호스트 운영 체제에 있으며 개발자가 가상 시스템에서 경량급 용기를 만들어 응용 프로그램을 실행할 수 있도록 합니다.따라서 개발자는 한 호스트 운영체제에서 여러 개의 용기를 만들고 여러 개의 응용 프로그램을 실행할 수 있다.기업은 단일 애플리케이션을 배포하기 위해 여러 운영 체제를 구입할 필요가 없습니다.
NGINX Docker 리버스 프록시 설정 방법
Docker를 사용하여 NGINX 역방향 에이전트를 설정하는 용례를 만듭니다.docker 용기에서 호스트에 연결되지 않으면 개인 포트와 IP 주소에 접근할 수 없습니다.우리는 단일 포트 80을 통해 여러 용기에서 실행되는 여러 웹 응용 프로그램에 접근할 수 있는 역방향 에이전트를 사용할 수 있다.Nginx 용기를 설정합니다. 이 용기는 포트 80에서 docker 호스트의 포트 80에 연결되고 여러 용기에서 실행되는 웹 응용 프로그램에 요청을 전달합니다.
웹 서비스나 어떤 언어로 작성할 수 있는 두 개의 응용 프로그램에 두 개의 용기를 설정해야 합니다.그러나 이 강좌를 배우기 위해 간단한 색인으로 두 개의 웹 서비스를 만듭니다.html 페이지.
우리의 웹 서비스 1의 구조:
webservice1
├── docker-compose.yml
└── index.html
cd ~
mkdir webservice1
cd webservice1
vi docker-compose.yml
그런 다음 이 YAML 코드를 파일에 붙여넣습니다.version: '2'
services:
app:
image: nginx:1.9
volumes:
- .:/usr/share/nginx/html/
expose:
- "80"
Ouick tip: Make sure that the indentations for all the YAML files correctly formatted. You can also use the VS Code to format them correctly.
이제 웹 서비스1을 위한 간단한 HTML 페이지를 만듭니다.
vi index.html
<!DOCTYPE html>
<html>
<head>
<title>Web service 1</title>
</head>
<body>
<h1>Welcome to website 1</h1>
</body>
</html>
현재, dockercompose 명령을 사용하여 웹 서비스를 구축합니다.docker-compose build
시작 컨테이너docker-compose up -d
모든 컨테이너 나열docker ps -a
컨테이너의 이름을 봐야 합니다.site2_app_1
웹 서비스2를 위한 두 번째 용기 만들기cd ~
mkdir webservice2
cd webservice2
vi docker-compose.yml
YAML 파일 코드:version: '2'
services:
app:
image: nginx:1.9
volumes:
- .:/usr/share/nginx/html/
expose:
- "80"
색인 파일 만들기vi index.html
간단한 HTML 응답 만들기<!DOCTYPE html>
<html>
<head>
<title>Web service 2</title>
</head>
<body>
<h1>Welcome to website 2</h1>
</body>
</html>
dockercompose 명령을 사용하여 웹 서비스 2 용기 구축docker-compose build
시작 컨테이너docker-compose up -d
너무 좋아요.현재 실행 중인docker 용기가 두 개 있습니다. 에이전트에 연결하고 싶습니다.주의: 이 두 용기는 모두 포트 80에서 실행되어야 하기 때문에 요청을 유도하기 위해 에이전트를 설정해야 합니다.그럼 에이전트를 설정합시다.프록시의 파일 구조가 됩니다.
proxy/
├── backend-not-found.html
├── default.conf
├── docker-compose.yml
├── Dockerfile
├── includes
│ ├── proxy.conf
│ └── ssl.conf
└── ssl
├── site1.crt
├── site1.key
├── site2.crt
└── site2.key
필요한 모든 파일을 만드는 것부터 시작합시다.cd ~
mkdir proxy
cd proxy
touch Dockerfile
touch backend-not-found.html
touch default.conf
touch docker-compose.yml
mkdir includes
mkdir ssl
cd includes
touch proxy.conf
touch ssl.conf
Dockerfile 만들기vi Dockerfile
FROM nginx:1.9
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./backend-not-found.html /var/www/html/backend-not-found.html
COPY ./includes/ /etc/nginx/includes/
COPY ./ssl/ /etc/ssl/certs/nginx/
docker 파일은docker 이미지를 만드는 데 사용됩니다.그리고docker 이미지를 사용하여docker 용기를 만듭니다.이 docker 파일에서 이미지는 사용자 정의 docker 이미지를 만들기 위해 기존 Nginx docker 이미지를 참조합니다.그리고 로컬 시스템의 기존 파일을docker 이미지로 복사해서 이미지를 구축합니다.우리는 기본적으로 프로필, 기본 오류 HTML, 다른 프록시 프로필, 그리고 나중에 생성된 인증서를 추가했습니다.기본값을 만듭니다.형태
vi default.conf
# web service1 config.
server {
listen 80;
listen 443 ssl http2;
server_name site1.test;
# Path for SSL config/key/certificate
ssl_certificate /etc/ssl/certs/nginx/site1.crt;
ssl_certificate_key /etc/ssl/certs/nginx/site1.key;
include /etc/nginx/includes/ssl.conf;
location / {
include /etc/nginx/includes/proxy.conf;
proxy_pass http://site1_app_1;
}
access_log off;
error_log /var/log/nginx/error.log error;
}
# web service2 config.
server {
listen 80;
listen 443 ssl http2;
server_name site2.test;
# Path for SSL config/key/certificate
ssl_certificate /etc/ssl/certs/nginx/site2.crt;
ssl_certificate_key /etc/ssl/certs/nginx/site2.key;
include /etc/nginx/includes/ssl.conf;
location / {
include /etc/nginx/includes/proxy.conf;
proxy_pass http://site2_app_1;
}
access_log off;
error_log /var/log/nginx/error.log error;
}
# Default
server {
listen 80 default_server;
server_name _;
root /var/www/html;
charset UTF-8;
error_page 404 /backend-not-found.html;
location = /backend-not-found.html {
allow all;
}
location / {
return 404;
}
access_log off;
log_not_found off;
error_log /var/log/nginx/error.log error;
}
이 Nginx 프로필에는 두 개의 웹 서비스에 두 개의 주요 서버 구성 요소가 있습니다.두 컨테이너 모두 Nginx 포트 80을 수신합니다.이 두 용기에 접근하기 위해서, 우리는 그것들을 정의된 서버 이름인 HTTP://site1.test 또는 HTTP://site2.test에 구부릴 수 있다.이 두 서버 구성 요소는 Nginx가 요청을 적당한 웹 서비스 용기에 표시하는 데 도움을 줄 것입니다.이 구성에서는 기본 Nginx 오류 페이지가 아닌 사용자 정의 오류 HTML을 내보낼 수 있습니다.두 서버 구성 요소 모두 Nginx가 적절한 위치에서 SSL 인증서를 선택하도록 지시합니다.docker compose를 만듭니다.yml 회사
vi docker-compose.yml
version: '2'
services:
proxy:
build: ./
networks:
- site1
- site2
ports:
- 80:80
- 443:443
networks:
site1:
external:
name: site1_default
site2:
external:
name: site2_default
Note: Make sure indentation is right when copying my file to the terminal.
이것은 우리가 실제적으로 대리를 실현하는 주요 부분이다.(기술적으로 말하자면, 우리는default.conf에서 완성한) 이 docker 구성 요소입니다.yml 파일은site1과site2라는 두 개의 외부 네트워크를 에이전트에 연결합니다.이 프록시의 포트 80/443은 Docker 호스트의 포트 80/443에 바인딩됩니다.우리는 웹 서비스에 두 개의 docker 용기를 만들었고, 사이트1\udefault와site2\udefault라는 외부 docker 네트워크를 만들었다.
인증서 및 키 만들기
웹 서비스 1
cd ssl
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout site1.key -out site1.crt
웹 서비스 2openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout site2.key -out site2.crt
이제 에이전트를 위한 표준 설정을 만듭니다.cd includes
vi proxy.conf
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_intercept_errors on;
SSL 인증서 및 키 디코딩을 위한 표준 SSL 구성 만들기vi ssl.conf
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-
ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-
SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-
GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-
AES128-SHAECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-
SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:
DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-
DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:
AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-
CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
이 구성은 SSL 인증서와 키를 암호로 디코딩하는 데 도움이 됩니다.호스트 이름과 IP 주소 추가
cd ~
vi /etc/hosts
172.31.30.78 site1.test
172.31.30.78 site2.test
이것들은 docker 호스트의 개인 IP 주소입니다.요청은 docker 호스트의 포트 80에 도달하지만, Nginx 용기의 포트 80으로 리디렉션됩니다.마지막으로 프록시 용기를 구축합시다
docker-compose build
우리는 용기가 하나 있는데, 지금 이 용기를 운행하고 있다docker-compose up -d
현재, 실행 중인docker 용기 세 개를 보셔야 합니다.두 개는 웹 서비스에 사용되고, 한 개는 프록시 용기에 사용된다.docker ps -a
역방향 에이전트가 작동하는지 확인해 봅시다.curl site1.test
다음 응답을 확인해야 합니다.<!DOCTYPE html>
<html>
<head>
<title>Web service 1</title>
</head>
<body>
<h1>Welcome to website 1</h1>
</body>
</html>
잘했어!✨용기화 응용 프로그램의 장점 중 하나는 응용 프로그램을 쉽게 추가하고 배치할 수 있다는 것이다.기본값에 설정을 추가하면 웹 서비스 용기를 여러 개 추가할 수 있습니다.conf와 외부 네트워크를 docker에 추가하여 YAML 파일을 구성합니다.이 예는 Docker와 Nginx를 사용하여 역방향 프록시를 설정하는 것이 얼마나 쉬운지 설명한다.Docker 용기에서 여러 개의 프로그램이 실행되고 있으며, 모든 요청이 Nginx 용기로 리디렉션된다고 상상해 보세요.수동으로 구성을 추가할 염려는 없습니다.Docker API를 사용하여 이 프로세스를 간단하게 자동화할 수 있습니다. 이것은 또 다른 블로그에서 토론할 수 있는 좋은 개념입니다.
이 블로그를 읽어 주셔서 감사합니다. 나는 그것이 당신이 이 매우 독특한 개념을 이해하는 데 도움을 줄 수 있기를 바랍니다.
만약 당신에게 어떤 문제나 걱정이 있다면, 저에게 메시지를 남겨 주세요.
Reference
이 문제에 관하여(NGINX Docker 리버스 에이전트는 어떻게 설정합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sukhbirsekhon/what-is-docker-reverse-proxy-45mm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)