nginx가있는 단일 포트를 사용하여 http 및 https 요청 처리 다른 포트를

nginx가 동일한 포트에서 http 및 https 요청을 처리 할 수 ​​있는지 궁금합니다 . [*]

이것이 내가하려고하는 일입니다. http 요청을 처리하는 웹 서버 (lighttpd)와 https를 통해 문서 트리의 특정 섹션을 제공하는 C 프로그램을 실행하고 있습니다. 이 두 프로세스는 동일한 서버에서 실행됩니다.

방화벽 수준 에서이 서버로 트래픽을 전달하는 포트는 하나만있을 수 있습니다 . 그래서 내가하고 싶은 것은이 서버에서 nginx를 설정하여 단일 포트에서 요청을 수신 한 다음에

A) 모든 http://myhost.com/ * 요청을 리디렉션 하여 localhost : 8080 (lighttpd가 청취하는 곳)으로 이동합니다.

B) 사용자가 예를 들어 https : // myhost.com/app로 시작하는 URL을 요청하면 해당 요청을 localhost : 8008 (C 프로그램)로 보냅니다. 이 경우 원격 브라우저와 nginx 간의 트래픽을 암호화해야합니다.

이것이 가능하다고 생각하십니까? 그렇다면 어떻게 할 수 있습니까?

두 개의 다른 포트를 사용 하여이 작업을 수행하는 방법을 알고 있습니다. 내가 직면 한 도전은 단 하나의 포트 로이 작업을 수행하는 것입니다 (불행히도이 특정 환경에서 방화벽 구성을 제어 할 수 없으므로 피할 수없는 제한 사항입니다). 방화벽을 우회하기 위해 ssh를 통한 역방향 포트 포워딩과 같은 기술을 사용하는 것도 작동하지 않습니다. 웹 브라우저와 인터넷 링크에 불과한 원격 사용자에게는 작동하지 않기 때문입니다.

이것이 nginx 기능을 넘어 서면이 요구 사항을 충족시킬 수있는 다른 제품에 대해 알고 있습니까? (지금까지는 lighttpd와 pound으로 이것을 설정하는데 실패했습니다). 또한 Apache를 피하는 것이 좋습니다 (유일한 선택 인 경우 Apache를 기꺼이 사용하지만).

미리 감사드립니다, 알렉스

[*] 명확하게 말하자면, 같은 포트를 통해 암호화 암호화되지 않은 HTTP 연결을 처리하는 것에 대해 이야기하고 있습니다. 암호화가 SSL 또는 TLS를 통해 수행되는지는 중요하지 않습니다.



답변

상태 코드에 대한 Wikipedia 기사에 따르면 Nginx에는 http 트래픽이 https 포트로 전송되면 사용자 정의 오류 코드가 있습니다 (오류 코드 497)

error_page의 nginx 문서에 따르면 특정 오류에 대해 표시되는 URI를 정의 할 수 있습니다.
따라서 오류 코드 497이 발생하면 클라이언트가 전송 될 URI를 만들 수 있습니다.

nginx.conf

#lets assume your IP address is 89.89.89.89 and also that you want nginx to listen on port 7000 and your app is running on port 3000

server {
    listen 7000 ssl;

    ssl_certificate /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate_key.key;
    ssl_client_certificate /path/to/ssl_client_certificate.cer;

    error_page 497 301 =307 https://89.89.89.89:7000$request_uri;

    location / {
        proxy_pass http://89.89.89.89:3000/;

        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Protocol $scheme;
    }
}

그러나 클라이언트가 GET을 제외한 다른 방법을 통해 요청하면 해당 요청은 GET으로 바뀝니다. 따라서 클라이언트가 들어오는 요청 방법을 보존합니다. error_page의 nginx 문서에 표시된대로 오류 처리 리디렉션을 사용합니다.

그래서 우리는 301 =307 리디렉션 입니다.

여기에 표시된 nginx.conf 파일을 사용하여 http 및 https가 동일한 포트에서 청취되도록 할 수 있습니다


답변

검색하는 사람들을 위해 :

추가 ssl on;error_page 497 $request_uri;서버 정의.


답변

정말로 영리하고 싶다면 연결 프록시를 사용하여 들어오는 데이터 스트림의 첫 두 바이트를 스니핑하고 바이트 0의 내용을 기반으로 연결을 전달하십시오 .0x16 인 경우 (SSL / TLS ‘ 핸드 셰이크 바이트), SSL 측에 연결을 전달하십시오 (알파벳 문자 인 경우 일반 HTTP 수행). 포트 번호에 대한 나의 의견이 적용됩니다 .


답변

예, 가능하지만 nginx 소스 코드를 패치해야합니다 (HoverHell은 패치없이 솔루션을 제공합니다). Nginx는 이것을 유효한 구성보다는 잘못된 구성으로 취급합니다.

$ ssl_session_id 변수를 사용하여 일반 연결과 ssl 연결을 구별 할 수 있습니다.

nginx-0.7.65에 대한 패치 :

--- src/http/ngx_http_request.c-orig    2011-05-03 15:47:09.000000000 +0200
+++ src/http/ngx_http_request.c 2011-05-03 15:44:01.000000000 +0200
@@ -1545,12 +1545,14 @@

    c = r->connection;

+    /* disable plain http over https port warning
     if (r->plain_http) {
         ngx_log_error(NGX_LOG_INFO, c->log, 0,
                       "client sent plain HTTP request to HTTPS port");
         ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS);
         return;
     }
+    */

#if (NGX_HTTP_SSL)

서버 설정 :

server {
    listen 80;
    index index.html;

    location / {
        root html;
        if ($ssl_session_id) {
            root html_ssl;
        }
    }

    ssl on;
    ssl_certificate cert.crt;
    ssl_certificate_key cert.key;
}


답변

단일 포트에서 서로 다른 두 가지 프로토콜을 처리 할 수있는 것은 없다고 생각합니다.

나는 왜 당신이 하나의 포트 만 전달할 수 있는지 궁금하지만 그 옆에 … 그것은 이상적이지는 않지만 내가 당신의 신발에 있다면 https를 통해 모든 것을 제공 할 것입니다.


답변

연결의 양쪽 끝이 특정 언어를 사용하기를 기대하고 다른 쪽 끝이 다른 것을 말하고있을 때 그것들이 충분히 영리하지 않기 때문에 동일한 포트를 통해 HTTP와 HTTPS를 모두 지원할 수 없습니다.

Wil의 답변에 대한 귀하의 의견에서 제안한 것처럼 TLS 업그레이드를 사용할 있습니다 (나는 시도하지 않았지만 최신 nginx 릴리스가 지원한다고 생각합니다).하지만 HTTP 및 HTTPS를 실행하지 않고 TLS 업그레이드로 HTTP를 실행합니다. 문제는 여전히 브라우저 지원입니다. 대부분의 브라우저는 (아직도) 지원하지 않습니다. 그러나 제한된 클라이언트 풀이 있다면 이것이 가능합니다.


답변

어떻게 풀릴 지 잘 모르겠지만 CUPSD는 포트 631에서 http와 https에 모두 응답합니다. nginx가 지금 그렇게 할 수 없다면 CUPS 팀이 어떻게 그것을 풀 수 있는지 알 수 있지만 CUPS는 GPL, 따라서 nginx는 그러한 기능을 구현하고 다른 곳에서 코드를 찾을 수없는 경우 라이센스 변경을 검토해야 할 수도 있습니다.