로컬 호스트가 아닌 요청을 수신하도록 kestrel 웹 서버를 얻으려면 어떻게해야합니까?


82

내 C #, asp.net 5, mvc 6 앱을 Windows 2008 서버에 배포했습니다. 나는 발사했고 dnx web포트 5000을 듣고 있으며 로컬 컴퓨터에서 액세스 할 때 잘 작동합니다.

비 localhost 요청을 수신하려면 어떻게해야합니까?

추신이 질문 은 이것 의 중복이 아닙니다 ... host.ini가 실제로 .ini 형식을 가지고있을 때 asp.net pre RC1을 참조합니다. 이제 JSON이고 실제로 무엇이 있어야하는지에 대한 문서를 찾을 수 없습니다.

PPS 실제 해결책은 큰 경고와 함께 연결된 질문에 대한 허용되지 않는 답변 에 있습니다. 단계 :

  1. 연결된 답변에 따라 project.json을 변경하십시오.
  2. 프로젝트를 서버에 게시합니다.
  3. 서버에서 ... \ approot \ src \ YourProject 폴더로 이동하여 명령 창을 엽니 다.
  4. 실행 dnx web-실패합니다
  5. 운영 dnu restore
  6. 'dnu build'실행
  7. 'dnx web'실행-이제 웹 서버가 정상적으로 시작됩니다.

추신 :이 질문에 찬성하는 사람들을위한 것입니다. 구식입니다. 매우 구식입니다!

.NET Core의 초기 버전에 적용되었습니다. 질문과 답변은 확실히 현재 버전의 프레임 워크 (예 : 2.x, 3.x)에는 적용되지 않습니다.



연결된 질문의 두 번째 대답은 JSON 형식을 참조합니다. 당신에게도 유용하지 않습니까?
chue x

@chuex 나는 그것을 시도했고 처음에는 시작시 웹 서버가 충돌했습니다. 이유를 모르겠습니다. 그 때 나는 한 dnu restore다음, dnu build다음 dnx web적절하게 웹 서버를 시작했다. 왜 그런지 모르겠지만 적어도 나는 그것을 작동시킬 수 있습니다. 최종 릴리스 전에 해결해야 할 버그가 있습니다. 현재로서는 이것이 해결 방법입니다.
AngryHacker

1
나는 해결책을 반영하기 위해 질문으로 편집했습니다.
AngryHacker

@AngryHacker : server.urls애플리케이션 구성 파일 또는 명령 줄 매개 변수에서 매개 변수를 지정할 수 있습니다 . 값은 세미콜론으로 구분 된 여러 값을 가질 수 있습니다 . 여기를 참조 하십시오 . 구성의 파일 이름은 hosting.json 일 수 있지만 json 일 수도 있습니다 . 문제를 참조하십시오 . --config구성 파일 이름을 지정하는 데 사용할 수 있습니다.
Oleg

답변:


114

Kestrel 서버에서 사용하는 기본 구성 파일은 hosting.json. 이름은 다른 베타 버전에서 여러 번 변경되었습니다. project.json다음 "command"섹션에서 지금 사용하는 경우

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
}

그런 다음 명령 줄에서 서버를 시작하는 동안

dnx web

파일 hosting.json을 읽습니다. 파일

{
    "server.urls": "http://0.0.0.0:5000"
}

모든 IP4 주소에서 5000을 수신하도록 서버를 구성합니다. 구성

{
    "server.urls": "http://::5000;http://0.0.0.0:5000"
}

IP4 및 IP6 주소 모두에서 5000을 수신하도록 알립니다.

사용 ASPNET_ENV환경 변수 또는 --config myconfig1.json(또는 config=myconfig1.json) 사용으로 대체 구성 파일을 지정할 수 있습니다 . 예를 들어 다음을 사용할 수 있습니다.

SET ASPNET_ENV=Development

hosting.Development.json특정 구성으로 파일 을 생성 합니다. 또는 다음 project.json과 함께 사용할 수 있습니다 .

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
    "webProd": "Microsoft.AspNet.Server.Kestrel --config prod.json"
}

사용법에 따라 서버를 시작하십시오.

dnx webProd

추가로 청취 및 등록 (시작하려면 dnx web) 을 허용해야 할 수 있음을 추가로 상기시켜야합니다 . 방화벽 및 새 TCP / HTTP 포트 수신의 로컬 보안 때문에 필요합니다. 다음과 같이 모든 사용자 (IPv4 및 IPv6)에 대해 5000 포트를 로컬로 등록하고 수신해야합니다.

netsh http add iplisten ipaddress=0.0.0.0:5000
netsh http add iplisten ipaddress=::5000
netsh http add urlacl url=http://+:5000/ user=\Everyone

보안을 강화하기 위해 위의 구성을 조정하여 최소한의 권한을 부여 할 수 있습니다.

업데이트 : @BlaneBunderson 에게 감사드립니다. 하나는 * 대신 IP 주소 (처럼 사용할 수 있습니다 http://*:5000에 듣고) 어떤 어떤 인터페이스에서 IP4와 IP6 주소. 하나는 조심해서 사용하지 말아야합니다

  • http://*:5000;http://::5000
  • http://::5000;http://*:5000
  • http://*:5000;http://0.0.0.0:5000
  • http://*:5000;http://0.0.0.0:5000

IP6 주소 ::또는 IP4 주소를 0.0.0.0 두 번 등록해야하기 때문입니다 .

발표에 해당

기술적으로 "localhost"가 아닌 호스트 이름이나 유효한 IPv4 또는 IPv6 주소로 인해 Kestrel이 모든 네트워크 인터페이스에 바인딩됩니다.

앞으로 행동이 바뀔 수 있다고 생각합니다. 따라서 나는 사용하는 것이 좋습니다*:5000 모든 IT 주소 등록에는 , 0.0.0.0:5000::5000양식 .

업데이트 2 : ASP.NET Core RC2 변경 ( 공지 사항 참조) 는 기본값을로드하는 동작을 ). 하나는 변경할 필요가 Main에서 설정로드 hosting.json명령 줄 매개 변수를. 다음은 사용 예입니다.

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", optional: true)
        .AddEnvironmentVariables(prefix: "ASPNETCORE_")
        .AddCommandLine(args)
        .Build();

    var host = new WebHostBuilder()
        .UseUrls("http://*:1000", "https://*:1234", "http://0.0.0.0:5000")
        .UseEnvironment("Development")
        .UseConfiguration(config)
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

위의 코드 는 기본적으로 기본 포트 5000을 사용하는 대신 기본적으로 사용하는 세 가지 바인딩 ( "http://*:1000", "https://*:1234") "http://0.0.0.0:5000"을 사용합니다 http://localhost:5000. 의 호출을 .UseConfiguration(config)만든 .UseUrls . 따라서 hosting.json명령 줄 에서로드 된 구성 이 기본 옵션을 덮어 씁니다. 한 .SetBasePath(Directory.GetCurrentDirectory())줄을 제거 hosting.json하면 응용 프로그램 dll이 컴파일되는 동일한 디렉터리 (예 :)에서이 파일이로드됩니다 bin\Debug\netcoreapp1.0.

다음과 같은 실행을 사용할 수 있습니다.

dotnet.exe run --server.urls=http://0.0.0.0:5000

기본 설정을 덮어 쓰려면 UseUrls ) 및 "server.urls"속성의hosting.json 존재 하는 경우 ) .

같은 방법으로 환경 변수를 설정하여 ULR 설정을 덮어 쓸 수 있습니다.

set ASPNETCORE_SERVER.URLS=http://localhost:12541/

다음을 사용하여 응용 프로그램의 기본 시작 dotnet.exe runhttp://localhost:12541/ 바인딩에 됩니다 .

여기 에서 HTTPS 바인딩 사용 예를 찾을 수 있습니다 .

참고 : ASP.NET의 이후 버전 에서 환경 변수의 이름이에서 ASPNETCORE_SERVER.URLS로 변경되었습니다 ASPNETCORE_URLS( 여기 에서 ASP.NET Core 3.1 설명서 참조 ).


1
또한 "server.urls"대신 "server.urls": "http : // * : 5000"을 사용할 수 있습니다. " 0.0.0.0:5000 "(개인적으로 *가 좀 더 의미가 있다고 생각합니다.)
Blane Bunderson

@BlaneBunderson : 제안 해 주셔서 감사합니다! 나는 그것 과 http://*:5000동일 http://::5000;http://0.0.0.0:5000하지 않은 것을 추가해야한다 http://0.0.0.0:5000. IPv4 및 IPv6 모두를 강제로 수신합니다. 사용법 http://*:5000;http://::5000또는 http://::5000;http://*:5000. 두 번째 주소를 등록하는 동안 "Microsoft.AspNet.Server.Kestrel.Networking.UvException : 오류 -4091 EADDRINUSE 주소가 이미 사용 중입니다."라는 오류가 발생합니다. 일부 시나리오에서는 IPv4와 IPv6을 모두 등록하는 것이 좋지만 다른 시나리오에서는 좋지 않습니다. 어떤 식 으로든 방법을 언급하는 것이 좋습니다.
Oleg

RC2에 대한 우수한 업데이트, 자세한 설명에 감사드립니다
Trygve

"업데이트 2"예제에서 .UseStartup<Startup>()재정의 하지 .UseConfiguration(config)않습니까?
nicks dec

해당 환경 변수에 오타가 있습니다. ASPNETCORE_URLS
nrjohnstone

33

RC2에서는 project.json의 명령 섹션이 더 이상 사용되지 않습니다. 아직 Kestrel이 hosting.json을 선택하지는 않았지만 새 WebHostBuilder가 생성되고 구성되는 애플리케이션의 Main에서 프로그래밍 방식으로 포트를 설정할 수 있습니다. 아래 샘플과 같이 .UseUrls () 메서드를 추가하십시오.

    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseUrls("http://0.0.0.0:5000/")
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }

3
이것은 큰 도움이되었습니다. .UseUrls("http://*:5000")대신 사용 하고 VirtualBox에서 빈 호스트 IP로 5000을 포트 포워딩했으며 마지막으로 Mac에서 Docker 호스팅 .NET Core 엔드 포인트에 액세스 할 수 있습니다. 단!
Mark Larter 2016 년

RC2에서 hosting.json 사용에 대한 정보와 더 자세한 설명은 위의 Oleg의 답변, 특히 "Updated 2"
Trygve

2
또한 적용 1.0.0-preview2-003121에, 고정 표시기 이미지
linquize

18

asp.net core 2.1 이상을 사용하는 경우 appsettings.json에서 구성 섹션을 수정하십시오.

"Kestrel": {
  "EndPoints": {
    "Http": {
      "Url": "http://0.0.0.0:5002"
    }
  }
},

이 제품은 VS Code 또는 Mac 용 Visual Studio에서 실행할 때도 일관되게 작동했습니다. ASPNETCORE_URLS나를 위해 작동하지 않았다
JSancho

10

ASP.NET Core 애플리케이션을 docker 컨테이너 (비 localhost 주소를 수신해야하는 사용 사례)에 넣으려는 경우이 사용 사례는 Microsoft에서 이미 통합했습니다. https://hub.docker.com/r/microsoft/aspnetcore/ 에서 전체 영광을 볼 수 있습니다.

현재 (v1.0.1)에서이 문제를 해결하기위한 핵심 마법은 소스 Dockerfile에 url 환경 변수 설정이 포함되어 있으며 애플리케이션이이를 재정의하지 않는다는 것입니다. (실제로 컨테이너화 된 애플리케이션은 실행될 환경에 대해 내부적으로 가능한 한 적게 주장해야합니다.)

ENV ASPNETCORE_URLS http://+:80

별표가 아닌 더하기 기호에 유의하십시오. 실제로 링크가 좋은 한 내 대답을 읽는 것보다 위의 dockerhub 링크를 방문하는 것이 좋습니다. 버전 1.1이 곧 출시되며 향후 상황이 다시 변경 될 수 있습니다.

컨테이너를 실행할 때 환경 변수 설정에 따라 게스트 포트 80을 노출해야합니다. 예를 들면 :

docker run -d -p 8000:80 myapp
curl localhost:8000

1
이것은 내 사용 사례였으며 링크는 매우 유용했습니다. 감사합니다.
Oxymoron

3

들어 AspNetCore 3.1 단지 파일에 다음 줄을 추가합니다 appsettings.json:

"Urls": "http://*:80"

1
매력처럼 작동합니다. 솔루션이 hosting.json작동하지 않는 이유를 찾을 수 없습니다 .
Machado

0

환경 변수 ASPNETCORE_URLS를로 설정합니다 http://0.0.0.0:5000/.

Visual Studio에서 실행하는 경우 프로젝트 속성의 디버그 탭에서 환경 변수를 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.