우분투에서 .ASP NET core Apache 연동

그동안 플랫폼에 구애를 받지않는 Java 기반을 많이 활용하였는데, net core도 리눅스, 맥에서도 구동가능하여
우분투 환경에서 MSA 기반의 인증서버를 구현하여 보았다.

본 내용은 마이크로 소프트의 아래 링크를 참조하여 현재 프로젝트 상황에 맞게 수정하였다.
https://docs.microsoft.com/ko-kr/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1

1. 환경
-NET Core 우분투 설치는 인터넷에 많이 나와있으므로 생략함
-Apache는 개발서버에 설치되어 있는 것을 활용하므로 설치 과정 문서는 생략함

2. 배포
– 비쥬얼 스튜디오 게시를 통해 게시된 폴더를 알집으로 압축하여 우분투에 FTP로 업로드.
– /home/idr/Service/Identity/Identity.WebApi 폴더에 압축을 풀어 배포
– unzip Identity.WebApi.zip -d Identity.WebApi

3. 프록시 서버구성
– 사용자가 Apache를 통해 요청을 하면 .net core의 Kestrel 서버로 전달해주기 위해서는 역방향 프록시 서버를 구성해야 함.
– 정뱡향 또는 역방향프록시에 대한 기술문서는 구글검색을 참고.
– 프로그램상 Startup.cs 파일에 아래와 같이 추가해 준다.
* 테스트해보니 아래처럼 안해도 동작은 한다.

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

	app.UseRouting();

	// Apache 또는 IIS 역방향 프록시
	// using Microsoft.AspNetCore.HttpOverrides;을 해야함
	app.UseForwardedHeaders(new ForwardedHeadersOptions {
			ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
	});
}

4. Apache 구성

4.1 환경설정

cd /etc/apache2/sites-available
vi identity.mbizok.com.conf
RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}

ProxyPreserveHost On
ProxyPass / http://127.0.0.1:6002/
ProxyPassReverse / http://127.0.0.1:6002/
ServerName identity.mbizok.com
ServerAlias identity.mbizok.com
ErrorLog /var/log/apache2/error-identity.mbizok.com.log
CustomLog /var/log/apache2/access-identity.mbizok.com.log common

4.2 사이트활성화

a2ensite identity.mbizok.com.conf
service apache2 restart

4.3 로그 확인
– 에러가 발생하여 로그 확인

systemctl status apache2.service

3m<94> 19 16:36:06 moramlinux apache2[19883]: AH00526: Syntax error on line 2 of /etc/apache2/sites-enabled/identity.mbizok.com.conf:
3m<94> 19 16:36:06 moramlinux apache2[19883]: Invalid command 'RequestHeader', perhaps misspelled or defined by a module not included in the server configuration

– 아파치 모듈 설치 및 아파치 재시작

a2enmod headers
service apache2 restart

5. Kestrel 서비스
6002 포트로 도는 API 서버를 실행하기 위해 kestrel 서비스를 만들어야 함.

5.1 설정화일
vi /etc/systemd/system/kestrel-identity.mbizok.com.service

[Unit]
Description= Identity Web Api

[Service]
WorkingDirectory=/home/idr/Service/Identity/Identity.WebApi
ExecStart=/usr/bin/dotnet /home/idr/Service/Identity/Identity.WebApi/Identity.WebApi.dll --urls="http://127.0.0.1:6002"
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=idr
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

5.2 서비스 활성화

systemctl enable kestrel-identity.mbizok.com.service

5.3 서비스 시작

systemctl start kestrel-identity.mbizok.com.service

5.4 서비스 상태확인

systemctl status kestrel-identity.mbizok.com.service

C# Winform 또는 Console App에서 Log4Net 사용

Java에서 많이 사용하는 Log4J의 닷넷버전인 Log4Net을 이용하여 로그를 남길 경우 아래와 같이
사용하면 된다.

1. Log4Net 다운로드
– http://logging.apache.org/log4net/download_log4net.cgi

2. 참조 추가
Visual Studio의 프로젝트에서 log4net.dll을 참조로 추가한다.

3. app.config
어플리케이션의 환경설정파일인 app.config파일에 아래와 같이 수정한다.
※ 참고로 configSections은 대소문자를 정확히 구분해 써야한다.
처음에 인터넷검색을 통해 카피해온 내용중에 configsections이라고 적혀 있어서 그 덕에 고생좀 한것같다.



	
		

4. AssemblyInfo.cs
– Properties 파일의 AssemblyInfo.cs에 아래 내용을 추가

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

5. 프로그램 메인
BasicConfigurator.Configure()를 안하고 log.Debug만 했을경우 로그가 파일로 안남겨질수 있으므로 주의해야 한다.

        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

	[STAThread]
        static void Main(string[] args)
	{
		log4net.Config.BasicConfigurator.Configure();
		log.Debug("모람씨앤티 (moramcnt)");
        }

IIS 7에서 “요청 콘텐츠 길이 제한을 초과하는 요청을 거부하도록 요청 필터링 모듈이 구성되어 있습니다.” 에러 처리 방안

IIS 7에서 “요청 콘텐츠 길이 제한을 초과하는 요청을 거부하도록 요청 필터링 모듈이 구성되어 있습니다.” 에러 처리 방안
1) IIS에서 해당사이트의 “요청필터링” 선택
2) “숨겨진 세그먼트” 탭으로 이동
3) 마우스 오른쪽 버튼을 클릭하여 “기능 설정 편집” 선택
4) 아래와 같이 “허용되는 최대 콘텐츠 길이(바이트)를 기본이 30메가로 되어있는것을 원하는 크기로 조절
iis_upload_max_size

브라우져에서 exe.config 파일을 다운로드 받을수 있게 설정

WinForm으르 만든 프로그램을 만들고 자동업데이트받을수 있게 자동업데이트사이트를 만들경우 발생한 문제이다.

가령 윈폼의 환경설정파일(exe.config)도 자동업데이트를 통해 배포하고자 할때는 권한문제로 404 에러가 발생하게 된다.

이떄 404에러를 발생하지 않게 하려면 다음과 같이 하면 된다.

1. iis를 오픈

2. 해당 사이트에서 "요청 필터링" 메뉴 클릭

3. 아래와 같이 config 파일을 true로 설정하여  요청필터링에서 허용한다.

 

ii7-allow-config-file-download

 

Silverlight 에서 Socket 통신시 주의사항

– 실버라이트에서 사용가능한 TCP 소켓의 포트 범위도 4502 – 4534으로 한정되어 있음.

 

– 해당포트의 권한을 부여하기 위해서는 웹에서 clientaccesspolicy.xml 사용할때와 유사하게 소켓사용시에도 Policy파일이 필요.

   즉, clientaccesspolicy.xml 을 내려보내주는 Policy서버(포트는 반드시 943)를 만들어주어야 함.

   폴리시 서버의 구축은 구글에서 Silverlight Policy Server로 찾아보면 많이 나오므로 참고 바람.

 

– Policy서버를 만들기 싫다면 구동서버의 기본 웹포트인 80포트에 clientaccesspolicy.xml을 넣어주면 됨

  그리고 Connect시에 ConnectAsync전에 SocketClientAccessPolicyProtocol의 값에 Http를 넣어주면 됨.

   var args = new SocketAsyncEventArgs();
   args.SocketClientAccessPolicyProtocol = SocketClientAccessPolicyProtocol.Http;

   ….
   this.Socket.ConnectAsync(args);

   (enlightened  테스트결과 유사한 8080포트는 안되므로, 반드시 80포트에 넣어야 함)

 

–  clientaccesspolicy.xml 의 내용