Nginx 역방향 에이전트 뒤에서 Docker 실행 하기

5411 단어
본 고 는 Nginx 역방향 에이전트 뒤에서 Docker 를 실행 하 는 것 을 말한다.
[편집자 의 말] Docker 에 게 공공 게 이 트 웨 이, 다 세대 지원, 그리고 우리 가 원 하 는 안전 인증 등 기능 을 가지 게 하고 싶 습 니까?웹 소켓 을 지원 하 는 것 처럼 Docker 자체 프로 토 콜 을 지원 하도록 Nginx 를 재 컴 파일 하 는 것 을 보십시오.
몇 주 전에 Docker 가 클 라 우 드 / 공유 호스트 와 유사 한 환경 에서 어떻게 작 동 하 는 지 시험 해 보고 싶 습 니 다.당시 Docker 는 1.4 버 전 을 발 표 했 고 1.4 버 전 은 추가 적 인 안전 과 인증 기능 을 가 져 왔 으 며 Docker machine 도 원 격 Docker 인 스 턴 스 를 자동화 하여 만 들 고 실행 할 수 있 었 다.
공유 호스트 환경 은 보통 특정한 공공 게 이 트 웨 이 를 바탕 으로 구축 되 는데 게 이 트 웨 이 는 대량의 유입 과 유출 된 데 이 터 를 관리 하 는 데 사용 할 수 있 으 며 FTP 와 SSH 를 포함한다.환경 에서 가장 큰 부분 (빙산 과 다 를 것 이 없다) 은 이 게 이 트 웨 이 뒤의 개인 네트워크 에 숨 어 있다.
그래서 제 문 제 는 Docker 가 비슷 한 행 위 를 할 수 있 는 게 이 트 웨 이 가 있 는 지 하 는 것 입 니 다. 다 세대 지원 과 원 하 는 모든 기능 을 포함 합 니까?
사실 이 증명 하 다
Docker 바 이 너 리 파일 은 세 가지 역할 을 합 니 다.
Docker 명령 행 - > Docker 를 사용 하기 쉽 고 간단 합 니 다 Docker Daemon - > 막후 에서 묵묵히 고역 을 하고 있다 Docker init - > 막후 초기 용기 설정 명령 행 과 Docker Daemon 은 주로 HTTP 프로 토 콜 을 기반 으로 통신 합 니 다.내 가 '주요' 라 고 말 한 것 은 몇 개의 API 가 연결 을 차단 하기 때문이다. 특히container/attach
명령, 그것 은 'forward my container' s console '이 라 고도 부른다.
인터넷 에서 흔히 볼 수 있 는 글 은 Nginx 역방향 대 리 를 설정 하고 기본 적 인 신분 인증 을 추가 하여 안전 을 확보 하 는 것 을 추천 합 니 다.
불 행 히 도 이런 방법 은 두 가지 단점 이 있다.
기 존 Docker 클 라 이언 트 는 HTTP 기본 인증 과 통신 할 수 없습니다 Docker 가 연결 을 차단 할 때 기 존 Nginx 는 연결 을 완전히 잃 어 버 립 니 다 인증 에 관 한 문 제 는 Docker 의 TLS 인증 을 사용 하 는 것 을 추천 합 니 다. 상 자 를 열 면 바로 사용 할 수 있 기 때 문 입 니 다.또한 Lua magic (번역자 주: Lua 의 Magic 문자) 를 사용 하면 우 리 는 이 를 '공개 키' 로 사용 하여 적당 한 균형 을 이 룰 수 있 습 니 다.
그럼 두 번 째 문 제 는 어떻게 처리 해 야 하나 요?
차단 방식 을 확인 하면 일이 훨씬 간단 해 집 니 다. HTTP 는 '반 양 방향' 프로 토 콜 이 라 고 볼 수 있 습 니 다. 즉, 같은 시간 에 데이터 가 단 방향 으로 만 흐 를 수 있 습 니 다. 클 라 이언 트 가 서버 에 요청 (단 방향) 을 보 낸 다음 에 서버 응답 요청 (단 방향) 입 니 다.집행 할 때docker attach
Docker 는 원본 '듀 플 렉 스' 모드 의 TCP 연결 을 사용 할 수 있 으 며, 어느 한 쪽 이 든 요청 할 수 있 습 니 다.이것 이 바로 역방향 에이전트 가 잃 어 버 린 이유 입 니 다. HTTP 프로 토 콜 은 요청 을 한 후에 확인 을 받 아야 하기 때 문 입 니 다.
흥미 로 운 것 은 여기에 또 다른 주류 협의 가 이 를 할 수 있다 는 것 이다.사실은 이 표준 협의 가 이렇게 유행 해서 몇 년 전에 Nginx 에 의 해 받 아들 여 졌 다 는 것 을 증명 한다. 나 는 그것 을 '  WebSocket

따라서 본질 적 으로 이 아 이 디 어 는 Nginx 가 웹 소켓 처럼 Docker 의 자체 프로 토 콜 을 처리 하 는 방법 을 알려 주 는 것 이다.이것 은 패 치 입 니 다.
--- a/src/http/ngx_http_upstream.c  Tue Nov 04 19:56:23 2014 +0900
+++ b/src/http/ngx_http_upstream.c  Sat Nov 15 16:21:58 2014 +0100
@@ -89,6 +89,8 @@
 ngx_table_elt_t *h, ngx_uint_t offset);
static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r,
 ngx_table_elt_t *h, ngx_uint_t offset);
+static ngx_int_t ngx_http_upstream_process_content_type(ngx_http_request_t *r,
+    ngx_table_elt_t *h, ngx_uint_t offset);
static ngx_int_t ngx_http_upstream_process_last_modified(ngx_http_request_t *r,
 ngx_table_elt_t *h, ngx_uint_t offset);
static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r,
@@ -175,7 +177,7 @@
              ngx_http_upstream_copy_header_line, 0, 0 },

 { ngx_string("Content-Type"),
-                 ngx_http_upstream_process_header_line,
+                 ngx_http_upstream_process_content_type,
              offsetof(ngx_http_upstream_headers_in_t, content_type),
              ngx_http_upstream_copy_content_type, 0, 1 },

@@ -2716,6 +2718,7 @@
 u->write_event_handler = ngx_http_upstream_upgraded_write_upstream;
 r->read_event_handler = ngx_http_upstream_upgraded_read_downstream;
 r->write_event_handler = ngx_http_upstream_upgraded_write_downstream;
+    u->headers_in.chunked = 0;

 if (clcf->tcp_nodelay) {
     tcp_nodelay = 1;
@@ -3849,6 +3852,25 @@

static ngx_int_t
+ngx_http_upstream_process_content_type(ngx_http_request_t *r, ngx_table_elt_t *h,
+    ngx_uint_t offset)
+{
+    ngx_int_t ret = ngx_http_upstream_process_header_line(r, h, offset);
+    if (ret != NGX_OK) {
+        return ret;
+    }
+
+    // is docker header ?
+    if (ngx_strstrn(h->value.data,
+                    "application/vnd.docker.raw-stream", 34 - 1) != NULL) {
+        r->upstream->upgrade = 1;
+    }
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t
ngx_http_upstream_process_last_modified(ngx_http_request_t *r,
 ngx_table_elt_t *h, ngx_uint_t offset)
{

유일한 남 은 단 계 는 역방향 대 리 를 설정 하 는 것 이다.참고 로 이것 은 제 nginx 테스트 프로필 입 니 다.  nginx.conf
worker_processes  1;

events {
worker_connections  1024;
}

http {
include       mime.types;
default_type  application/octet-stream;

sendfile        on;

keepalive_timeout  65;

server {
    listen 9000;

    location / {
        proxy_buffering off;
        proxy_pass http://localhost:8080;
    }
}
}

다음 명령 을 사용 하여 8080 포트 에서 Docker 를 실행 하거나 인 자 를 추가 해 야 합 니 다./etc/default/docker
docker -d -H tcp://localhost:8080

우 리 는 임 무 를 완수 했다!
마지막 문제
이것 을 해 킹 했 지만 모든 Nginx 가 Websocket 프로 토 콜 을 적당 한 HTTP 헤드 로 전환 해 야 한 다 는 것 을 알 게 되 었 습 니 다.
Request Connection: Upgrade Upgrade: websocket
Response HTTP/1.1 101 Upgraded Connection: Upgrade Upgrade: websocket
그래서 다른 방법 은 Docker 프로 토 콜 에 적당 한 머리 를 주입 하 는 것 이 라 고 생각 합 니 다.
원본 링크: Nginx 역방향 프 록 시 뒤에 Docker 를 실행 하 는 방법 (번역: 엽 가 강 심사: 곽 레이)
발표 일자: 2015 - 01 - 05 
이 글 쓴 이: 잎 이 강하 다.
본 고 는 클 라 우 드 커 뮤 니 티 파트너 DockerOne 에서 왔 으 며 관련 정 보 를 알 면 DockerOne 에 주목 할 수 있다.
원문 제목: Nginx 역방향 에이전트 뒤에서 Docker 실행

좋은 웹페이지 즐겨찾기