Kestrel 웹 서버 란 무엇이며 IIS / IIS Express와 어떤 관련이 있습니까?
IIS Express에서 앱을 개발하고 IIS 웹 서버에서 호스팅하는 데 있습니다. ASP.NET Core를 사용하면Microsoft.AspNetCore.Server.Kestrel
있고 시작시 .UseServer("Microsoft.AspNetCore.Server.Kestrel")
. 그러나 웹 사이트를 실행할 때 여전히 시스템 트레이에 IIS Express 아이콘이 나타납니다. 누군가 IIS Express 또는 Kestrel을 사용하고 있는지 물어 봤는데 어떻게해야할지 몰랐습니다!
PC에서 개발하고 Azure에서 호스트 할 때 크로스 플랫폼 요구 사항 need
이 없으므로 Kestrel 조차도 혼란 스럽지만 대안이없는 것 같습니다. 가장 간단한 샘플조차 Kestrel을 사용합니다.
답변
황조롱이 무엇입니까
완전한 웹 서버입니다. Kestrel 만 사용하여 ASP.NET Core 응용 프로그램을 실행할 수 있습니다.
그러나 웹 사이트를 실행해도 시스템 트레이에 IIS Express 아이콘이 계속 나타납니다.
ASP.NET 응용 프로그램, 아마도 wwwroot
디렉토리에 다음이 포함 된 web.config가 표시됩니다.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
</system.webServer>
</configuration>
이것이 HttpPlatformHandler입니다. 본질적으로 이것이하는 일은 모든 요청을 Kestrel에 전달 하는 것 입니다. IIS Express (및 그 문제에 대한 IIS)는 더 이상 ASP.NET 자체를 실행하지 않습니다. 대신 Kestrel의 요청과 응답을 단순히 전달하는 프록시 역할을합니다. IIS를 사용하면 여전히 장점이 있습니다. 특히 보안 구성, 커널 수준 캐싱 등을 제공합니다.
답변
Windows와 IIS 만 사용하더라도 Kestrel이 제공되는 이유를 이해할 수 있도록 몇 가지 이력이있는 대체 답변을 제공하고 싶습니다.
2000 년 이전 ASP.NET 개발 초기에 Microsoft는 ASP.NET WebForms 앱을 호스팅하기 위해 두 가지를 만들었습니다.
- Cassini는 나중에 Visual Studio에서 ASP.NET 개발 서버가되었습니다. C #으로 작성된 완전 관리 형 웹 서버입니다
HttpListener
. 물론 개발 전용이므로 많은 기능이 구현되지 않았습니다. Microsoft가 Cassini의 소스 코드를 공개 할 수있게되면서 코드 기반을 분기하고 더 많은 기능을 추가 한 Cassini 제품군을 시작한 타사가 있습니다. - IIS에서 ASP.NET 지원 (개정 1). 당시에는 IIS가 4.0 및 5.0 / 5.1 이었으므로 응용 프로그램 풀과 같은 것은 없으므로 ASP.NET에는 자체 작업자 프로세스도 있습니다 (
aspnet_wp.exe
).
따라서 웹앱을 개발하려면 Cassini를 사용하고 IIS를 사용하여 배포하십시오.
-
IIS 6에 응용 프로그램 풀을 도입하려면 ASP.NET에서 약간의 변경이 필요하므로
aspnet_wp.exe
더 이상 사용되지 않고로 대체되었습니다aspnet_isapi.dll
. 이는 IIS 개정 2에서 ASP.NET 지원으로 볼 수 있습니다. 따라서 ASP.NET 앱은 IIS 작업자 프로세스에서 호스팅됩니다w3wp.exe
. -
IIS 7 이상에 통합 파이프 라인을 도입하려면을 (를) 대체
aspnet_isapi.dll
한 추가 변경이 필요 했습니다webengine4.dll
. 이는 IIS 개정 3에서 ASP.NET 지원으로 볼 수 있습니다. ASP.NET과 IIS 파이프 라인이 통합되었습니다.
ASP.NET이 IIS와 훨씬 더 복잡해지고 긴밀하게 통합되어 Cassini가 시대를 보이기 시작했으며 점차 IIS Express (사용자 모드 lite IIS)로 대체되었습니다.
따라서 많은 경우에 사람들이 IIS가 느리다고 비난 할 때 실제로 ASP.NET을 비난해야합니다. ASP.NET이없는 IIS 자체는 매우 빠르고 안정적이며 ASP.NET은 충분한 성능 메트릭을 염두에두고 개발되지 않았습니다 (WebForms는 많은 생산성과 RAD에 중점을두기 때문에).
그런 다음 2014 년 11 월에 ASP.NET 5 (나중에 ASP.NET Core로 이름이 바))가 발표되어 크로스 플랫폼 기술이되었습니다. 분명히 Microsoft는 Windows, macOS 및 Linux를 지원하기위한 새로운 디자인이 필요했습니다. 여기서 IIS 이외의 모든 주요 웹 서버, nginx / Apache (또는 다른 웹 서버)를 고려해야합니다.
나는 많은 사람들이 마이크로 소프트가 NodeJS로부터 많은 것을 배운 다음 Kestrel을 디자인하고 개발했다는 데 동의 할 것이라고 생각한다 libuv
. 처음에는 Cassini와 같은 경량 웹 서버이지만 나중에 더 많은 기능이 추가되고 있습니다 (다른 답변과 같이 더 많은 기능이 있으므로 전체 웹 서버로 취급 될 수 있음). 완전히 관리되지만 (일부 고유 종속성이 존재하지만) 더 이상 Cassini와 같은 장난감 웹 서버가 아닙니다.
그렇다면 왜 Kestrel을 사용할 수 없습니까? IIS Express와 IIS, nginx 또는 Apache가 여전히 필요한 이유는 무엇입니까? 그것은 주로 오늘날의 인터넷 관행의 결과입니다. 대부분의 웹 사이트는 리버스 프록시를 사용하여 웹 브라우저에서 요청을받은 다음 백그라운드에서 애플리케이션 서버로 전달합니다.
- IIS Express / IIS / nginx / Apache는 리버스 프록시 서버입니다
- Kestrel / NodeJS / Tomcat 등은 애플리케이션 서버입니다.
또 다른 대답은 이미 Microsoft 설명서에 대한 링크를 보여 주었으므로 살펴볼 수 있습니다.
Microsoft는 HttpPlatformHandler를 처음 개발하여 IIS를 Java / Python 등에 대한 충분한 역방향 프록시로 만들기 위해 ASP.NET Core에 사용할 계획이었습니다. 개발 과정에서 문제가 발생하기 시작하여 나중에 Microsoft는 ASP.NET Core를 위해 ASP.NET Core Module을 만들었습니다. IIS 개정판 4에 대한 ASP.NET 지원입니다.
ASP.NET Core 2.2부터 IIS 용 ASP.NET Core Module (버전 2)은 w3wp.exe
ASP.NET 2.x / 4.x와 매우 유사한 IIS 작업자 프로세스 ( ) 내에서 .NET Core 환경을 호스팅 할 수 있습니다 . 이 모드를 “IIS 인 프로세스 호스팅”이라고 합니다. IIS 개정판 5에서 ASP.NET 지원으로 간주 될 수 있습니다.
글쎄요, 꽤 길지만, 필요한 부분을 모두 모아서 읽는 것을 즐기시기 바랍니다.
답변
ms 문서에서
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x
Kestrel은 크로스 플랫폼 비동기 I / O 라이브러리 인 libuv를 기반으로하는 ASP.NET Core 용 크로스 플랫폼 웹 서버입니다. Kestrel은 기본적으로 ASP.NET Core 프로젝트 템플릿에 포함 된 웹 서버입니다.
Kestrel을 단독으로 사용하거나 IIS, Nginx 또는 Apache와 같은 리버스 프록시 서버와 함께 사용할 수 있습니다. 리버스 프록시 서버는 인터넷에서 HTTP 요청을 수신하여 예비 처리 후 Kestrel에 전달합니다.
업데이트 : .net 코어 2.1, Kestrel은 libuv 인 경우 대신 관리 소켓을 사용합니다.
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration의 asp.net 코어 2.1 문서에서
ASP.NET Core 2.1이 릴리스되면서 Kestrel의 기본 전송은 더 이상 Libuv를 기반으로하지 않고 대신 관리 소켓을 기반으로합니다.