Ubuntu에서 ASP.net Application을 publish하기 (with NGINX)

2021. 8. 17. 14:03프로그래밍/서버, 퍼블리싱

728x90

이 퍼블리싱을 하는데 약 5일정도 걸렸던 것 같다.

이것저것 공부도 하고, 조사도 하면서 열심히 했던 것 같다.

참고용 링크는 맨 아래에 있다.

이런 저런 사이트를 찾아보면서 해봤지만, 다들 자세하게 안 알려주거나
어디에 추가하는지 잘 안 써놓는 등의 경우가 많았다.

그래서 처음 하는 사람이 이 글을 본다고 생각하고 적어보도록 하겠다.


Stack (기술 스택) 및 버전

API Appliction: ASP.net V5.0.*

AWS EC2 Instance: Ubuntu 20.04 LTS AMD 64

NGINX: 1.18.0 (Ubuntu)

git: 2.25.1


사전 준비물

- 빌드와 실행이 가능한 ASP.net 어플리케이션

- Ubuntu 20.04 LTS로 생성한 AWS 인스턴스

- PUTTY 또는 SSH를 통해 인스턴스에 접속할 수 있는 프로그램

- 위의 ASP.net어플리케이션을 포함하는 git 레포지토리 (선택 사항)


전체 과정 설명

1. 인스턴스 접속

2. 프로젝트 복사 또는 Git Clone

3. dotnet 설치

4. nginx 설치 및 세팅

5. supervisor 설치 및 세팅

6. dotnet publish 및 폴더 이동

7. supervisor 실행

8. 보안그룹 설정

9. 테스트


1. 인스턴스 접속하기

우선 인스턴스를 생성했다는 전제하에, PUTTY를 통해서 접속을 하도록 한다.

(다른 접속 방식을 사용할 수 있다면 사용해도 좋다)

https://goldfishdiary.tistory.com/75

 

[취준일기] 2021-08-10: PuTTY로 EC2에 접속하기

키 페어 (.pem) 발급 받기 우선 EC2에 접속하려면 키 페어를 받아야 한다. EC2를 생성할 때 어떤 키 페어를 쓸거냐고 물어보는데, 키가 없다면 생성하면 된다. 새 키 페어 생성 -> 키 페어 이름 정하기

goldfishdiary.tistory.com

자세한 접속 방식, 키 페어 생성 방식, 등록 방식에 대해 적은 글이다. PuTTY 사용법을 잘 모른다면 참고해보자

HostName을 뭐로 적어야 할지 모르겠다면, 위의 글을 들어가 읽어보자.


2. Git Clone (또는 프로젝트 복사하기)

이제 프로젝트를 복사해올 것이다.

ubuntu 인스턴스에는 기본적으로 git이 설치되어있다.
git이 실제로 설치되어있는지 확인하기 위해서 다음의 커맨드를 입력해보자.

git --version

git의 버전을 보는 커맨드이다.
git이 설치가 되지 않았다면, 구글링해서 설치해보자.

이제 git 레포지토리를 클론해보자.

git clone 자신의_프로젝트_URL

예시 사진의 URL은 내 깃허브 프로젝트의 URL이다.

깃허브로 들어가서 자신의 프로젝트 페이지로 들어간 다음,
URL을 복사하면 된다.

clone이 끝났다면, 잘 다운로드 되었는지 확인해보자.

(ls는 폴더 내의 파일들의 목록을 보여주는 명령어다)


3. dotnet 설치

다음의 커맨드를 PuTTY에서 실행해보자

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

sudo는 관리자 권한으로 실행하는 명령어이고,
apt-get은 패키지를 관리해주는 명령어다. (yarn, brew, npm과 비슷한 역할을 한다)

우선 패키지를 다운로드한 다음, 설치하는 명령어 모음이다.


4. nginx 설치 및 세팅

nginx는 웹 요청을 받아서 처리해주는 웹서버다.

우리의 눈 앞에 있는 컴퓨터에서 AWS의 서버에 요청을 할 수 있기 위해서 필요한 친구다.

다음의 명령어로 nginx를 설치한다.

sudo apt-get update
sudo apt-get install -y nginx

설치가 끝나면 다음의 명령어로 잘 설치되었는지 확인해보자

nginx -v

잘 설치가 되었다면 다음의 명령어로 nginx 서비스를 시작한다

sudo service nginx start

이제 우리의 콘솔창은 자유롭지만 뒤에서는 nginx가 열심히 일을 하고 있다.

nginx는 우리의 ASP.net 어플리케이션이 아니기 때문에, 요청을 받아서 서버에 전달해줄 것이다.

그렇기 때문에 80번 포트로 받은 요청을 ASP.net 어플리케이션인 5000번 포트로 전달해줄 것이다

다음의 명령어로 작성해보자.

sudo rm /etc/nginx/sites-available/default
sudo vi /etc/nginx/sites-available/default

그러면 VI에디터가 나오는데, 다음의 내용을 붙여넣는다.

server {
    listen 80;
    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

VI 에디터에서 쓰고 나가는 법을 모른다면 구글링 해보자. (검색: linux vi write quit)

자, 이제 설정을 바꿨지만 백그라운드에서 실행중인 nginx 서비스에는 적용이 되지 않았다.

다음의 명령어로 설정을 적용해주자.

sudo nginx -s reload

5. Supervisor 설치 및 세팅

우선 Supervisor란, 우리의 ASP.net 어플리케이션을 자동으로 실행시켜주고, 관리해주는 프로그램이다.

말 그대로 관리자 프로그램이다.

다음의 명령어로 설치해보자

sudo apt-get install -y supervisor

이제 Supervisor 프로그램의 설정을 변경해보자.

sudo vi /etc/supervisor/conf.d/자기_프로젝트_이름.conf

VI 에디터가 나오면, 다음의 내용을 붙여넣는다.

[program:자기_프로젝트_이름]
command=/usr/bin/dotnet /var/aspnetcore/자기_프로젝트_이름/자기_프로젝트_이름.dll
directory=/var/aspnetcore/자기_프로젝트_이름/
autostart=true
autorestart=true
stderr_logfile=/var/log/자기_프로젝트_이름.err.log
stdout_logfile=/var/log/자기_프로젝트_이름.out.log
environment=ASPNETCORE__ENVIRONMENT=Production
user=www-data
stopsignal=INT

설정 파일의 command 항목을 한번 보면, 'dotnet 자기_프로젝트_이름.dll'을 실행하는 것을 알 수 있다.

(/usr/bin/dotnet = dotnet 실행 커맨드)

그렇다면 /var/aspnetcore 폴더에 자기_프로젝트_이름으로 된 폴더가 있어야 한다.
그 부분은 뒤에서 하기로 하고, 자기 프로젝트 이름을 어떻게 지어야 할지 모르는 사람들을 위해 예시를 적어봤다.

[program:chrome-memo-server]
command=/usr/bin/dotnet /var/aspnetcore/chrome-memo-server/chrome-memo-server.dll
directory=/var/aspnetcore/chrome-memo-server/
autostart=true
autorestart=true
stderr_logfile=/var/log/chrome-memo-server.err.log
stdout_logfile=/var/log/chrome-memo-server.out.log
environment=ASPNETCORE__ENVIRONMENT=Production
user=www-data
stopsignal=INT

자기_프로젝트_이름을 git 레포지토리 이름으로 하면 편하다.
왜냐하면 후에 dotnet publish를 하게 되면 실행한 폴더의 이름으로 dll파일이 생기기 때문이다

즉, chrome-memo-server폴더에서 dotnetpublish를 하면
chrome-memo-server.dll파일이 생긴다.


6. dotnet publish 및 폴더 이동

우선 자신의 프로젝트 폴더로 이동한다.

그 다음, dotnet publish를 합니다.

cd ~/자기_프로젝트_폴더
dotnet publish -c Release

이제 프로젝트폴더/bin/Release/net5.0/publish 폴더에 결과물이 생기게 된다

이 결과물을 '5. Supervisor 설치 및 세팅'에서 설정한 대로 이동시켜보자.'

sudo mkdir /var/aspnetcore
sudo cp -r ~/자기_프로젝트_이름/bin/Release/net5.0/publish/ /var/aspnetcore/
sudo mv /var/aspnetcore/publish/ /var/aspnetcore/자기_프로젝트_이름

cp 명령어는 복사하는 명령어고,

mv명령어는 이동 명령어지만, 같은 폴더 내에서 이름을 바꿔서 이동하는 식으로
폴더 이름을 바꿀때도 쓴다.

이제 보다시피 /var/aspnetcore에 내 프로젝트가 복사되었다.


7. Supervisor 실행

이제 Supervisor 설정도 했고, 설정대로 파일도 준비했으니 실행만 시키면 된다.

다음의 명령어로 Supervisor를 실행해보자.

sudo service supervisor stop
sudo service supervisor start

이제 Supervisor가 정상적으로 돌아가는지 보자.

다음의 명령어로 supervisor의 로그를 확인해보자.

sudo tail -f /var/log/supervisor/supervisord.log

그만보고 싶으면 Ctrl + C를 누르자

로그를 보면 chrome-memo-server가 잘 돌아가고 있을을 볼 수 있다.

그럼 이 ASP.net 서버 내의 로그도 볼 수 있을까?

다음의 명령어로 서버 로그도 확인하자.

tail -f /var/etc/자기_프로젝트_이름.out.log

이 로그 파일의 이름은 위에서 Supervisor 설정파일에 써놓은 이름과 같다.


8. 보안 그룹 설정

이제 서버 세팅은 다 끝났다.

하지만 제일 중요한 부분이 있다.

바로 AWS 보안그룹 설정이다.

이 AWS 보안그룹은 방화벽 역할을 하면서 특정 포트의 요청만 받도록 보통 처리한다.

기본적으로는 SSH 22번 포트, 우리가 PuTTY로 접속할 수 있는 포트만 열어놓는데,

우리의 서버에 접속할 수 있도록 포트를 추가적으로 열어주도록 하자.

https://goldfishdiary.tistory.com/77

 

[취준일기] 2021-08-12: AWS에서 인스턴스 생성 이후 Nginx 구동하기

포스팅하다가 너무 내용이 길어져서 새로 글을 하나 쓰기로 했다. 보안 그룹 설정 우선 AWS에서 인스턴스를 생성할 때, 보안그룹이란 걸 설정하게 된다. 그냥 확인만 눌렀다면 보지 못했을 수도

goldfishdiary.tistory.com

이 게시글의 보안그룹 설정을 보도록 하자

TCP - 80번 포트를 열면 된다.


9. 테스트

https://reqbin.com/

 

Online API Testing Tool | Test Your API Online

ReqBin is the world's most popular online API testing tool for REST, SOAP and HTTP APIs. Test your APIs right from your browser. No coding. No desktop app. See why 850'000 of users use ReqBin for testing their APIs online!

reqbin.com

그냥 chrome창에서 해도 되지만, 나는 이 API 테스팅 사이트를 선호한다.


마무리하며

이렇게 길게 설명을 써서 마무리 했지만,
실제로 세팅을 할 때에는 bash파일(.sh)를 이용해서 순차적으로 진행되도록 하는게 좋다.

다음 포스팅에서는 인스턴스 딱 들어와서 bash파일 실행하면 딱 진행되도록 파일을 만들어보도록 해본다.


참고 자료

https://jakeydocs.readthedocs.io/en/latest/publishing/linuxproduction.html

 

Publish to a Linux Production Environment — ASP.NET documentation

A reverse proxy is a common setup for serving dynamic web applications. The reverse proxy terminates the HTTP request and forwards it to the ASP.NET application. Why use a reverse-proxy server? Kestrel is great for serving dynamic content from ASP.NET, how

jakeydocs.readthedocs.io

'프로그래밍 > 서버, 퍼블리싱' 카테고리의 다른 글

URL 해체하기  (0) 2021.09.20
Bash로 원타치 세팅하기  (0) 2021.08.17
AWS에서 인스턴스 생성 이후 Nginx 구동하기  (0) 2021.08.12
PuTTY로 EC2에 접속하기  (0) 2021.08.10
ASP.net로 웹 API 만들기  (0) 2021.07.24