2010-02-09 3 views
5

몇 가지 사용 가능한 http 서버 라이브러리를 살펴보면서 내가 원하는 것을 찾지 못했지만이 요구 사항을 처음으로 가질 수는 없습니다.실시간 임베디드 http 서버 라이브러리가 필요합니다.

'파이프 라인'된 API를 제공하는 라이브러리가 필요합니다. 파이프 라이닝은 응답을 기다리지 않고 한 번에 TCP 링크를 통해 여러 HTTP 요청을 보낼 수있는 HTTP 기능을 설명하는 데 사용됩니다. 응용 프로그램이 응답을 보내지 않고도 모든 요청을 수신 할 수있는 라이브러리 API에서 유사한 기능을 원합니다 (응답 할 것이지만 한 번에 여러 요청을 처리하여 내부 대기 시간의 영향을 줄이려합니다).

그래서 웹 서버 라이브러리 ... 다음 흐름

1) HTTP 클라이언트는 HTTP 요청 1

2) HTTP 클라이언트는 HTTP 요청이 전송 전송을 지원하기 위해

3) 웹 필요합니다 서버 라이브러리는 요청 1을 받아 내 웹 서버 응용 프로그램에 전달합니다.

4) 내 웹 서버 응용 프로그램은 요청 1을 받아 내 시스템으로 보냅니다.

5) 웹 서버가 요청이 수신 앱

6) 내 웹 서버 애플리케이션은 요청이 수신 내 웹 서버로 전달하고 제 시스템으로 전달

7) 내 웹 서버 애플리케이션이 요청에 대한 응답을 수신 내 시스템에서 (1) 및 웹 서버에 전달

8) 웹 서버는 HTTP 클라이언트에 HTTP 응답 한 전송

9) 응용 프로그램이 응답이 내 시스템에서 2를 요청 받고 가 웹 서버에 전달 내 웹 서버

10) 웹 서버가 HTTP 클라이언트에게 HTTP 응답 2를 전송합니다.

바라기를 이것은 내 요구 사항을 보여줍니다. 인식 할 두 가지 중요한 점은 입니다. 웹 서버 라이브러리에 대한 응답은 비동기이며 내 웹에 전달 된 여러 HTTP 요청이있을 수 있습니다. 응답이 뛰어난 서버 응용 프로그램.

추가 요구 사항은 기존의 'C'응용 프로그램

  • 작은 풋 프린트에 포함 가능한
    1. 이다; 아파치 등에서 사용할 수있는 모든 기능이 필요하지 않습니다.
    2. 효율적입니다. 초당 수천 개의 요청을 지원해야합니다.
    3. 요청에 대한 비동기 응답을 허용합니다. 응답에 작은 대기 시간이 소요되며 동기식 아키텍처가 요구되는 요청 처리량을 감당할 수 없습니다.
    4. 지원 지속적인 TCP 연결
    5. 서버 푸시 혜성 연결이
    6. 지원 사용
    7. 오픈 소스/GPL
    8. 리눅스에서
    9. 휴대용 HTTPS에 대한
    10. 지원, 창; 바람직하게는 더 많습니다.

    나는

    안부

  • +1

    단일 연결을 사용하는 경우 요청과 동일한 순서로 응답을 보내도록 요청하는 HTTP 파이프 라이닝을 사용하고 있으므로 요청을 병렬 처리하면 어쨌든별로 도움이되지 않을까요? –

    +0

    안녕하세요, 크리스토퍼 - 댓글을 달아 주셔서 감사합니다. 내 시스템이 단일 연결을 통해 많은 요청을 받고 있으며 이러한 요청에 응답하기위한 대기 시간이 짧습니다. 요청을 순차적으로 처리해야하는 경우 처리량 max_throughput = 1/latency에 대한 제한이 있습니다. 여러 요청을 동시에 처리 할 수있는 경우이 제한이 사라집니다. 참고 : 대기 시간은 HTTP 클라이언트와 웹 서버 사이가 아니라 내 시스템 내부입니다. –

    답변

    4

    당신은 libmicrohttp을 시도 할 수있는 추천에 매우 감사하게 될 것입니다.

    +0

    libmicrohttp이 필요한 작동 모드를 허용하지 않는 것 같습니다. 단일 연결을 통해 여러 요청을 동시에 처리해야합니다. libmicrohttp는 스레딩 모델과 관계없이 이것을 허용하지 않는 것 같습니다. 내 이해를 확인할 수 있니? –

    +1

    당신이 파이프 라이닝을 의미한다고 가정하면 이것은 다음과 관련이 있습니다 : http://www.themes.freshmeat.net/projects/libmicrohttpd/releases/270855 파이프 라인 된 요청을 동시에 처리할지 모르겠지만 지원해야합니다 GET 및 HEAD 요청에 대한 파이프 라이닝. –

    +0

    @Howard, 병렬 스레드가 당신을 도울 수 있다고 가정한다면, 내가 필요로하는 운영 모드를 허용한다고 생각합니다. (나는 일반적으로 쓰레드 팬이 아니다. 그러나 유용 할 때도있다.) –

    1

    원하는 것은 HTTP pipelining을 지원하는 것입니다. 당신은 이미 그 페이지에 익숙해 져야한다.

    예, libmicrohttp으로 이동하십시오. 그것은 SSL 등을 지원하며 유닉스와 윈도우 모두에서 작동합니다.

    그러나 크리스토퍼 (Christopher)는 자신의 의견에서 바로 그 자리에 올랐습니다. 각 응답에 대한 시작 시간이 있다면 파이프 라이닝을 많이하지 않을 것입니다. 그러나 첫 번째 요청에 대해 상당한 응답 시간 만있는 경우 무언가를 얻을 수 있습니다.

    각 응답에 시작 시간이있는 경우 이 아닌이 파이프 라이닝을 사용하여 많게 나타날 수 있지만 각 개체에 대해 새 요청을 만듭니다. 그런 다음 각 요청에 자체 스레드가있어 시작 비용을 동시에 지불 할 수 있습니다. 모든 응답은 최적의 경우 "즉시"전송됩니다. libmicrohttpMHD_USE_THREAD_PER_CONNECTION 스레드 모델에서이 작동 모드를 지원합니다. 이전 의견과 업데이트에 최대에 따라

    +0

    감사합니다. Mr. Kant. 위에서 설명한대로 파이프 라이닝이 필요하지만 충분하지 않습니다. 라이브러리를 사용하는 응용 프로그램/시스템이 동시에 여러 요청을 처리 할 수있는 무언가가 필요합니다. 나는 libmicrohttp가하는 것을 믿지 않는다. –

    +0

    하단에 새 단락이있는 답변이 업데이트되었습니다. –

    0

    ...

    당신은 가지고 있지만 단지 "는 TCP 연결"것이다 얼마나 많은 동시 연결 말을하지 않습니다.
    단일 연결 인 경우 이전에 언급 한 것처럼 HTTP 파이프 라이닝을 사용합니다. 따라서 파이프 라인의 헤드에서 요청을 처리하려면 소수의 스레드 — 대신 — 만 필요합니다.

    그래서 모든 요청에 ​​대해 스레드를 가질 필요가 없습니다. 각 연결마다 직원 수가 적습니다.

    실제로 파이프 라인 된 연결에 대한 응답 대기 시간에 문제가 있는지 여부를 보여주기 위해 테스트 또는 구현을 수행 했습니까?
    임베디드 장치가 TLS 설정, 암호화 및 암호 해독을 포함하여 초당 수천 건의 요청에 대처할만큼 강력하면이 수준의 조숙 한 최적화에 대해 걱정할 것입니다.

    +0

    크리스토퍼 귀하의 의견에 감사드립니다. 10 개의 클라이언트 연결 순서가있을 수 있습니다. 각 클라이언트 연결은 시스템에 과부하가 걸릴 수 있습니다. 대기 시간이 제 시스템에 있습니다. 필자는 통신을 전달하는 메시지를 기반으로 구축 된 기존 시스템에 웹 인터페이스를 설치하려고합니다. 대기 시간은 HTTP 요청을 수신하고 HTTP 응답을 보내는 사이의 시간입니다. 한 번에 TCP 연결에서 여러 요청을 수신 할 수 없다면 각 TCP 연결은 1/대기 시간으로 제한됩니다. 이것이 내 요구 사항을 충족시키지 않을 것이라는 것을 알고 있으므로 지금 해결해야합니다. –

    0

    하워드,

    당신은 lighthttpd 살펴 보셨나요? 명시 적으로 임베디드 웹 서버가 아닌 경우를 제외하고는 모든 요구 사항을 충족합니다. 하지만 그것은 오픈 소스이며, 당신의 어플리케이션에 컴파일하는 것은 너무 어렵지 않아야합니다. 그런 다음 요청을 처리하기 위해 plugin 사용자 정의를 작성할 수 있습니다.

    0

    아무도 nginx을 언급 한 것으로 믿을 수 없습니다. 나는 소스 코드의 많은 부분을 읽었으며 매우 모듈화되어있다. 당신은 아마도 당신이 필요로하는 부품을 꽤 빨리 얻을 수 있습니다.

    0

    UIP 또는 lwip을 사용할 수 있습니다. 저는 개인적으로 uIP를 사용합니다. 적은 수의 클라이언트와 동시 연결 (또는 호출 할 때 "파이프 라이닝")에 유용합니다. 그러나, 내가 읽은 것에서부터 lwip으로 컨텐츠를 제공하는 것이 확장 성이 없거나 빠르지는 않습니다. lwip의 힘 대신 단순하고 작은 크기의 uIP를 사용했습니다. 보통 내 앱에는 사용자가 1 명 밖에 없었습니다.

    동시 연결 수가 늘어남에 따라 uIP이 제한되어 있음을 발견했습니다.그러나, 그것은 나의 MAC 수신 버퍼의 한계이며 uIP 자체가 아니라는 것을 확신합니다. lwip은이 문제를 해결하기 위해 훨씬 더 많은 메모리를 사용한다고 생각합니다. 난 그냥 들어오는 요청 패킷 톤을 지원하기에 충분한 이더넷 RAM이 없다. 56mhz 프로세서에서 15ms 대기 시간으로 백그라운드 아약스 폴링을 할 수있다.

    http://www.sics.se/~adam/software.html

    사실은 여러 가지 방법으로 UIP를 수정했습니다. DHCP 서버를 추가하고 파일 업로드를 위해 멀티 파트 POST를 지원하는 것이 큰 일입니다.) 질문이 있으면 알려주십시오.

    3

    루크 Onion을 사용하십시오. 이것은 C에서 사용하기 가볍고 사용하기 쉬운 HTTP 서버 라이브러리입니다.

    3

    나중에 참조 할 사항은 다음을 참조하십시오. libasyncd 저는 기고자 중 한 명입니다. 그것은 C.

    작은 풋 프린트로 작성

    기존의 'C'응용 프로그램에

    포함 가능한; 아파치 등에서 사용할 수있는 모든 기능이 필요하지 않습니다.

    매우 컴팩트합니다.

    효율적인; 초당 수천 개의 요청을 지원해야합니다.

    libevent 기반 프레임 워크입니다. 그 이상을 처리 할 수 ​​있습니다.

    요청에 대한 비동기 응답을 허용합니다.

    비동기입니다. 또한 파이프 라이닝을 지원합니다.

    물론

    지원 지속적인 TCP 연결, 연결 유지. 서버 푸시 혜성 연결이

    지원 사용

    그것은 당신이 당신의 논리를 코딩하는 방법에 달려 있습니다. HTTPS

    예에 대한 BSD 라이선스에 따라

    오픈 소스/GPL

    지원. 그것은 openssl과 함께 https를 지원합니다.

    Portable across linux, windows; 바람직하게는 더 많습니다.

    휴대용이긴하지만 아직 창문에는 이식 가능하지 않습니다.

    관련 문제