>  기사  >  백엔드 개발  >  Docker를 사용하여 nginx 역방향 프록시 만들기

Docker를 사용하여 nginx 역방향 프록시 만들기

大家讲道理
大家讲道理원래의
2017-05-28 09:32:542427검색

역방향 프록시 서버는 일반적으로 웹 서버 앞에 위치하며 웹 서버 자체에는 없는 첨부 기능을 제공할 수 있는 서버입니다.

예를 들어 역방향 프록시는 SSL 종료, 로드 밸런싱, 요청 라우팅, 캐싱, 압축 및 A/B 테스트까지 제공할 수 있습니다.

Docker 컨테이너로 웹 서비스를 실행할 때 역방향 프록시를 실행하면 배포가 단순화될 수 있습니다.

**

Docker에 역방향 프록시를 사용하는 이유는 무엇인가요?

**
Docker 컨테이너에는 임의의 IP와 포트가 할당되므로 클라이언트 관점에서 이러한 컨테이너를 찾기가 어렵습니다. 기본적으로 이러한 IP와 포트는 비공개이며 호스트에 바인딩되지 않는 한 외부에서 액세스할 수 없습니다.

컨테이너를 호스트에 바인딩하면 컨테이너가 동일한 포트에서 실행되는 것을 방지할 수 있습니다. 예를 들어, 한 번에 하나의 Docker만 포트 80에 바인딩할 수 있습니다. 또한 이로 인해 새 버전의 컨테이너 배포가 복잡해집니다. 새 버전은 이전 버전이 서비스를 중지한 후에만 서비스를 시작할 수 있기 때문입니다.

역방향 프록시는 다운타임을 0으로 제공하여 안정성을 향상시키면서 위의 문제를 해결할 수 있습니다.

**

역방향 프록시 구성 생성

**

역방향 프록시 구성 설정은 컨테이너가 시작되고 중지될 때 수행해야 하는 책임 있는 작업입니다. 종종 구성을 수동으로 업데이트해야 하는데, 이는 시간이 많이 걸리고 오류가 발생하기 쉽습니다.

다행히 docker는 쉽게 관찰할 수 있고 이미 구성된 메타데이터인 컨테이너의 IP 및 포트에 액세스할 수 있는 원격 호출 API을 제공합니다. 또한 docker는 컨테이너가 시작되고 중지될 때 알림을 보내는 데 사용할 수 있는 실시간 eventAPI도 제공합니다. 이러한 API를 사용하여 역방향 프록시 구성을 자동으로 생성할 수 있습니다.

docker-gen은 작은 애플리케이션입니다. Docker의 API를 사용하여 컨테이너의 메타데이터를 템플릿으로 가져옵니다. 템플릿을 생성한 후 이를 사용하여 서비스를 다시 시작할 수 있습니다.

docker-gen을 사용하면 nginx 구성을 자동으로 생성하고 구성이 변경되면 nginx를 다시 로드할 수 있습니다. Docker 로그 관리에도 동일한 방법을 사용할 수 있습니다.

**

nginx 리버스 프록시 for docker

**
다음 nginx 템플릿 예제를 사용하여 Docker 컨테이너에 대한 리버스 프록시 구성을 생성할 수 있습니다. 이 템플릿은 golang을 사용합니다. groupby 템플릿 함수 는 실행 중인 컨테이너 를 그룹 으로 그룹화하는 데 사용됩니다. 그룹화는 VIRTUAL_HOST 환경 변수 를 기반으로 합니다. 이 방법은 로드 밸런싱된 백엔드를 생성하기 위해 컨테이너 순회를 단순화하고 가동 중지 시간 없는 배포도 지원합니다.

{{ range

containers := groupBy "Env.VIRTUAL_HOST" }}​
업스트림 {{

호스트 }} {

{ { 범위

value := containers }}
{{ with

address := index value.Addresses 0 }}
서버 { {

주소.IP }}:{{ $주소.포트 }}
{{ end }}
{{ end }}

}

서버 {
#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_
key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}
}

{{ end }}

이 템플릿은 다음 명령을 사용하여 실행됩니다:

docker-gen -only-exposed -watch -notify " /etc/init.d/nginx reload” template/nginx.tmpl /etc/nginx/sites-enabled/default

-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.
다음은 두 개의 컨테이너로 구성된 데모1과 데모2

업스트림 데모1.localhost {

서버 172.17.0.4:5000
서버 172.17.0.3:5000
}

서버 {

#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}
}

업스트림 데모2.localhost {

서버 172.17.0.5:5000
}

서버 {

#ssl_certificate /etc/nginx/certs/demo.pem
#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}
}

**

사용해 보세요

**

제가 만든 빌드를 사용해 볼 수 있습니다.

https://index.docker.io/u/jwilder/nginx-proxy/ nginx 프록시 컨테이너 실행:

docker run -e VIRTUAL_HOST=foo.bar.com -t …

HTTPS를 사용하고 다른 컨테이너를 실행하려는 경우

github에서 프로젝트를 확인하여 자세한 내용을 확인할 수 있습니다.

**

결론

**

Docker API를 사용하여 Docker 컨테이너에 대한 nginx 역방향 프록시 구성 생성을 자동으로 수행할 수 있습니다. 이 접근 방식은 배포를 단순화하고 가용성을 향상시킵니다.

이 솔루션은 단일 호스트에서 실행되는 컨테이너에 매우 편리합니다. 분산 호스트에 대한 구성 종속성 서비스 검색을 제공합니다. Docker 서비스가 발견한 내용을 살펴보고 해결책을 찾을 수 있습니다.

번역. 원문 보기: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

역방향 프록시 서버는 일반적으로 서버 앞에 위치한 서버입니다. 웹 서버 자체에는 없는 첨부 기능을 제공할 수 있습니다.

예를 들어 역방향 프록시는 SSL 종료, 로드 밸런싱, 요청 라우팅, 캐싱, 압축은 물론 A/B 테스트까지 제공할 수 있습니다.

Docker 컨테이너로 웹 서비스를 실행할 때 역방향 프록시를 실행하면 배포가 단순화될 수 있습니다.

**

Docker에 역방향 프록시를 사용하는 이유는 무엇인가요?

**

Docker 컨테이너에는 임의의 IP와 포트가 할당되므로 클라이언트 관점에서 이러한 컨테이너를 찾기가 어렵습니다. 기본적으로 이러한 IP와 포트는 비공개이며 호스트에 바인딩되지 않는 한 외부에서 액세스할 수 없습니다.

컨테이너를 호스트에 바인딩하면 컨테이너가 동일한 포트에서 실행되는 것을 방지할 수 있습니다. 예를 들어, 한 번에 하나의 Docker만 포트 80에 바인딩할 수 있습니다. 또한 이로 인해 새 버전의 컨테이너 배포가 복잡해집니다. 새 버전은 이전 버전이 서비스를 중지한 후에만 서비스를 시작할 수 있기 때문입니다.

역방향 프록시는 다운타임을 0으로 제공하여 안정성을 향상시키면서 위의 문제를 해결할 수 있습니다.

**

역방향 프록시 구성 생성

**

역방향 프록시 구성 설정은 컨테이너가 시작되고 중지될 때 수행해야 하는 책임 있는 작업입니다. 종종 구성을 수동으로 업데이트해야 하는데, 이는 시간이 많이 걸리고 오류가 발생하기 쉽습니다.

다행히 docker에서는 이미 구성된 메타데이터인 컨테이너의 IP와 포트를 쉽게 관찰하고 접근할 수 있는 원격 호출 API를 제공합니다. 또한 docker는 컨테이너가 시작되고 중지될 때 알림을 보내는 데 사용할 수 있는 실시간 이벤트 API도 제공합니다. 이러한 API를 사용하여 역방향 프록시 구성을 자동으로 생성할 수 있습니다.

docker-gen은 작은 애플리케이션입니다. Docker의 API를 사용하여 컨테이너의 메타데이터를 템플릿으로 가져옵니다. 템플릿을 생성한 후 이를 사용하여 서비스를 다시 시작할 수 있습니다.

docker-gen을 사용하면 nginx 구성을 자동으로 생성하고 구성이 변경되면 nginx를 다시 로드할 수 있습니다. Docker 로그 관리에도 동일한 방법을 사용할 수 있습니다.

**

nginx 리버스 프록시 for docker

**

다음 nginx 템플릿 예제를 사용하여 Docker 컨테이너에 대한 리버스 프록시 구성을 생성할 수 있습니다. 이 템플릿은 golang을 사용합니다. groupby 템플릿 함수는 실행 중인 컨테이너를 그룹화하는 데 사용됩니다. 그룹화는 VIRTUAL_HOST 환경 변수를 기반으로 합니다. 이 방법은 로드 밸런싱된 백엔드를 생성하기 위해 컨테이너 순회를 단순화하고 가동 중지 시간 없는 배포도 지원합니다.

{{ 범위

containers := groupBy

"Env.VIRTUAL_HOST" }} 업스트림 {{

호스트 }} {

{{ 범위

값 := 컨테이너 }}                                                         
주소 := 색인

값 .주소 0 }}
서버 {{


address.IP }}:{{ $address.Port }}; {{ 종료 }}
{{ 종료 }}
}

서버 {
#ssl_certificate /etc/nginx/certs/demo.pem

#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}

} {{ end }}

이 템플릿은 다음 명령을 사용하여 실행됩니다:

docker-gen -only-exposed -watch -notify “/etc/ init .d/nginx reload” template/nginx.tmpl /etc/nginx/sites-enabled/default

-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.

다음은 두 개의 컨테이너 데모1과 데모2로 구성된 템플릿입니다

upstream deco1.localhost {
서버 172.17.0.4:5000

서버 172.17.0.3:5000

}

서버 {

#ssl_certificate /etc/nginx/certs/demo.pem

#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}

}

업스트림 데모2.localhost { 서버 172.17.0.5:5000

}

서버 {

#ssl_certificate /etc/nginx/certs/demo.pem

#ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}

}

**


사용해 보세요

**

제가 만든 빌드를 사용해 볼 수 있습니다. https://index.docker.io/u/jwilder/nginx-proxy/

nginx 프록시 컨테이너 실행:



docker run -e VIRTUAL_HOST=foo.bar.com -t …if HTTPS를 사용하고 다른 컨테이너를 실행하려면 github에서 프로젝트를 확인하여 자세한 내용을 확인하세요. **

결론

**

Docker API를 사용하여 Docker 컨테이너에 대한 nginx 역방향 프록시 구성 생성을 자동으로 수행할 수 있습니다. 이 접근 방식은 배포를 단순화하고 가용성을 향상시킵니다.

이 솔루션은 단일 호스트에서 실행되는 컨테이너에 매우 편리합니다. 분산 호스트에 대한 구성 종속성 서비스 검색을 제공합니다. Docker 서비스가 발견한 내용을 살펴보고 해결책을 찾을 수 있습니다.

위 내용은 Docker를 사용하여 nginx 역방향 프록시 만들기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.