본문 바로가기

.Net

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

참조

https://docs.microsoft.com/ko-kr/dotnet/core/linux-prerequisites?tabs=netcore2x

https://docs.microsoft.com/en-us/aspnet/core/publishing/apache-proxy

Linux에서 .NET Core의 필수 구성 요소 설치 - .Net Core SDK 설치

CentOS 설치 내용 요약

1. 시스템에서 .NET Core의 이전 미리 보기 버전을 제거하세요.

2. Microsoft 서명 키를 등록합니다.

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc

3. Microsoft 제품 피드를 추가합니다.

sudo sh -c 'echo -e "[packages-microsoft-com-p rod]\nname=packages-microsoft-com-prod \nbaseurl=https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc"; > /etc/yum.repos.d/dotnetdev.repo'

4. .NET Core SDK를 설치합니다.

sudo yum update 
sudo yum install libunwind libicu 
sudo yum install dotnet-sdk-2.0.0

5. PATH에 dotnet 추가

export PATH=$PATH:$HOME/dotnet

6. dotnet --version 명령을 실행하여 설치 성공을 증명합니다.

dotnet --version

Apache 설정 확인

[root@api-test conf]# vi /usr/local/apache/conf/extra/httpd-vhosts.conf
START .net core virturalHost
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ServerAdmin test@test.com
ServerName netcore.test.com
ErrorLog "logs/netcore.test.com-error_log"
CustomLog "logs/netcore.test.com-access_log" common
END .net core

kestrel 서비스 셋팅 및 실행

[root@api-test home]# vi /etc/systemd/system/kestrel-netcore.service
[Unit]
Description=.NET Web API Application running on CentOS 7
[Service]
WorkingDirectory=/home/websvc/netcore.test.com
ExecStart=/usr/bin/dotnet /home/websvc/netcore.test.com/dotnetCoreSample.dll
Restart=always
Restart service after 10 seconds if dotnet service crashes
RestartSec=10
SyslogIdentifier=dotnet-netcore
User=websvc
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.target
[root@api-test home]# systemctl enable kestrel-netcore.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kestrel-netcore.service to /etc/systemd/system/kestrel-netcore.service.
[root@api-test home]# systemctl start kestrel-netcore.service
[root@api-test home]# systemctl enable kestrel-netcore.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kestrel-netcore.service to
/etc/systemd/system/kestrel-netcore.service.
[root@api-test home]# systemctl start kestrel-netcore.service
[root@api-test home]# systemctl status kestrel-netcore.service
● kestrel-netcore.service - netcore.test.com .NET Web API Application running on CentOS 7
Loaded: loaded (/etc/systemd/system/kestrel-netcore.service; enabled; vendor preset: disabled)
Active: active (running) since 금 2017-11-03 15:53:42 KST; 17min ago
Main PID: 21576 (dotnet)
CGroup: /system.slice/kestrel-netcore.service
└─21576 /usr/bin/dotnet /home/websvc/netcore.test.com/dotnetCoreSample.dll
11월 03 15:53:44 api-test dotnet-netcore[21576]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
11월 03 15:53:44 api-test dotnet-netcore[21576]: Request starting HTTP/1.1 GET http://netcore.test.com/home/index
11월 03 15:53:44 api-test dotnet-netcore[21576]: info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
11월 03 15:53:44 api-test dotnet-netcore[21576]: Executing action method netcore.api.Controllers.HomeController.Index (dotnetCoreSample) with arguments ((null)) - ModelState is Valid
11월 03 15:53:44 api-test dotnet-netcore[21576]: info: Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewResultExecutor[1]
11월 03 15:53:44 api-test dotnet-netcore[21576]: Executing ViewResult, running view at path /Views/Home/Index.cshtml.
11월 03 15:53:44 api-test dotnet-netcore[21576]: info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
11월 03 15:53:44 api-test dotnet-netcore[21576]: Executed action dotnetCoreSample.Controllers.HomeController.Index (dotnetCoreSample) in 48.6915ms
11월 03 15:53:44 api-test dotnet-netcore[21576]: info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
11월 03 15:53:44 api-test dotnet-netcore[21576]: Request finished in 139.6463ms 200 text/html; charset=utf-8

오류가 나는 경우 점검사항

1. 아래 주석 해제 처리

[root@api-test home]# vi /usr/local/apache/conf/httpd.conf
...
LoadModule proxy_http_module modules/mod_proxy_http.so
...

2. ExecStart=/usr/bin/dotnet /home/websvc/netcore.test.com/dotnetCoreSample.dll 에 있는 내용 실제 실행해본다.

[root@api-test home]# /usr/bin/dotnet /home/websvc/netcore.test.com/dotnetCoreSample.dll
info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
User profile is available. Using '/root/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
warn: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Error -99 EADDRNOTAVAIL address not available'.
Hosting environment: Production
Content root path: /usr/local/apache/conf
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

3. 아파치 로그 확인으로 오류 원인 확인

[root@api-test logs]# tail -5000f /usr/local/apache/logs/netcore.test.com-error_log

==> 오류 원인 확인

첫번째 오류 -> LoadModule proxy_http_module modules/mod_proxy_http.so 주석 제거후 해결

[Fri Nov 03 13:41:17.536279 2017] [proxy:warn] [pid 17437:tid 140528444241664] [client 118.128.33.118:50659] AH01144:
No protocol handler was valid for the URL /favicon.ico (scheme 'http').
If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

두번째 오류 ->

[root@api-test home]# /usr/share/dotnet /home/websvc/netcore.test.com/dotnetCoreSample.dll
-bash: /usr/share/dotnet: 디렉터리입니다
[root@api-test conf]# /usr/bin/dotnet /home/websvc/netcore.test.com/dotnetCoreSample.dll