Web Programming/ASP .Net Core 3

ASP .Net Core 3.1 Apache 연동

안녕하세요 씨앤텍 시스템즈 최홍준 연구원입니다.

이번 포스트는 ASP. Net Core 3.1 버전

Apache와 연동입니다.

ASP .Net Core에서는 IIS 연동이 기본으로 합니다.

그림1. 리눅스 vs 윈도우서버 구글트렌드 결과
그림2. 윈도우서버에 대한 국가 관심도 구글트렌드 결과

하지만 전세계 트렌드로 보았을 경우 80%이상이 리눅스서버를 사용하고 있다는걸 보실 수 있습니다.

윈도우 서버를 사용하신다면 IIS로 바로 연결하면 되겠지만

씨앤텍시스템에서도 서버를 리눅스로 사용하고 있어 리눅스 구축으로 진행하겠습니다.

 

씨앤텍시스템은 다음과 같은 사양으로 진행했습니다.

Name Version
CentOS Linux release 1908 7.7
Apache 2.4.6
ASP .Net Core 3.1

[1. Kestrel과 역방향 프록시를 함께 사용하는 방식]

Kestrel은 ASP .Net Core의 플랫폼 간 웹 서버이고, 프로젝트 템플릿에 포함되어 있습니다.

Kestrel에서는 다음과 같은 기능을 지원합니다.

  • HTTPS
  • Websocket을 활성화하는데 사용되는 불투명 업그레이드
  • Nginx 뒤의 고성능을 위한 Unix 소켓
  • HTTP/2 (MAC OS+ 제외)

역방향 프록시와 함께 Kestrel을 구성했다면 다음과 같은 구성으로 동작합니다.

  • 클라이언트들이 Apache나 Nginx, IIS로 접속
  • 웹 서버가 Kestrel로 HTTP 요청을 전달
  • Kestrel 웹 서버가 Application Code 실행

그림3. Kestrel과 역방향 프록시 구성 MSDN자료

 

[2. Apache를 이용하여 ASP .Net Core 호스팅]

ASP .Net Core MSDN 공식 홈페이지에서는 프록시를 이용하여 서버를 구성하게 되어있습니다.

 

프록시 서버의 구성의 역방향 프록시는 동적 웹앱을 지원하기 의한 일반적인 설정이고, HTTP 요청을 종료하고
이 요청을 ASP .Net 앱에 전달하는 방식으로 동작합니다. ( Kestrel 참조 )

요청이 역방향 프록시를 통해 전달되므로 Microsoft.AspNetCore.HttpOverrides 패키지의 전달된 헤더 미들웨어를
사용해야 합니다.

이 미들웨어는 X-Forwarded-Proto 헤더를 사용하여 Requset.Scheme을 업데이트하므로 리디렉션 URL 및 기타
보안 정책이 제대로 작동합니다.

 

https://docs.microsoft.com/ko-kr/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1

 

Apache를 사용하여 Linux에서 ASP.NET Core 호스트

CentOS에서 Apache를 역방향 프록시 서버로 설정하여 Kestrel에서 실행되는 ASP.NET Core 웹앱에 HTTP 트래픽을 리디렉션하는 방법을 알아봅니다.

docs.microsoft.com

 

[3. ASP .Net Core 프로젝트 Startup.cs 수정]

프로젝트에 해당 패키지를 선언합니다.

using Microsoft.AspNetCore.HttpOverrides;

 

그리고 ConfigureServices 부분에 Services.Configure<ForwardeHeadersOptions> 옵션 ForwardedHeaders에 XForwardedFor와 XForwardedProto 대입합니다.

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders =
                ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            });
     	}

XForwardedFor는 HTTP Server에 요청한 Client IP를 식별하기 위한 표준 헤더

XForwardedProto는 프록시 또는 로드 밸런서에 접속하는데 사용했던 프로토콜이 무엇인지 확인하는 표준 헤더?

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
	 app.UseForwardedHeaders();
}

그리고 Configure에 app.UseForwardeHeaders()를 추가하고 해당 파일을 배포하여 리눅스 서버에 올립니다.

 

[4. Apache를 환경설정]

리눅스 서버에서 Apache 환경설정은 다음과 같은 경로에 프로젝트 이름으로 만들어 진행해야합니다.

※ /etc/httpd/conf.d/ProjectName.conf

<VirtualHost *:*>
        RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}e
</VirtualHost>

<VirtualHost *:80>
        ServerName ServerDomain
        ServerAlias ServerDomain(www)
        ProxyPreserveHost On
        <Location />
                ProxyPass http://127.0.0.1:ServicePort/
                ProxyPassReverse http://127.0.0.1:ServicePort/
        </Location>
        ErrorLog logs/ProjectName-error.log
        CustomLog logs/ProjectName-access.log common
</VirtualHost>

 

[5. Kestrel 설정]

프록시를 사용하기 위해 Kestrel를 구성해야하는데 해당 Kestrel은 해당 경로에 각각 프로젝트 이름으로 만들어야합니다.

※ /etc/systemd/system/kestrel-ProjectName.service

[Unit]
Description=Example .NET Web API App running on CentOS 7

[Service]
WorkingDirectory=Project Path
ExecStart=/usr/bin/dotnet/*Dotnet 경로*/ Project Path/ProjectName.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=apache
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

 

[6. Apache 실행 및 Kestrel 실행]

 

그림4. Apache 서버 실행 후 상태확인

다음과 같이 2개의 서비스가 active(running)중이라면 ASP .Net Core 프로젝트를 접속하시면 됩니다.

 

감사합니다.

728x90

'Web Programming > ASP .Net Core 3' 카테고리의 다른 글

SignalR  (0) 2021.03.16
ASP.Net Core 3.1 과 Nginx 연동  (0) 2020.11.18
ASP .Net Core 3.1 - MySQL 사용  (4) 2020.06.03
ASP .Net Core 3.1 - Razor  (0) 2020.04.23
ASP .Net Core 3 - MVC  (0) 2020.04.06