안녕하세요 씨앤텍 시스템즈 최홍준 연구원입니다.
이번 포스트는 ASP. Net Core 3.1 버전
Apache와 연동입니다.
ASP .Net Core에서는 IIS 연동이 기본으로 합니다.
하지만 전세계 트렌드로 보았을 경우 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 실행
[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
[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 실행]
다음과 같이 2개의 서비스가 active(running)중이라면 ASP .Net Core 프로젝트를 접속하시면 됩니다.
감사합니다.
'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 |