본문 바로가기
ASP.NET

Nginx와 .NET API를 연결하는 방법

by 대박플머 2024. 11. 18.

최근 들어 많은 개발자들이 Nginx.NET Core 를 함께 사용하여 애플리케이션을 배포하는 사례가 늘고 있습니다. 저도 이러한 환경을 설정할 때 많은 고민을 했었고, 이번 글을 통해 Nginx.NET API 를 어떻게 연결하는지, 그리고 설정 과정에서 주의해야 할 점들을 상세히 설명해드리려 합니다.이 글을 통해 여러분은 Nginx리버스 프록시 로 설정하고, 외부에서 들어오는 요청을 Kestrel 서버 에서 구동 중인 .NET API 로 전달하는 방법을 배우게 될 것입니다. 


왜 Nginx와 .NET API를 함께 사용하는가?

제가 처음 .NET Core 로 API를 개발했을 때는 로컬에서 Kestrel 서버 를 이용해 구동하는 것만으로 충분했습니다. 하지만 실제 서버에 배포할 때는 좀 더 확장 가능하고 성능 좋은 웹 서버가 필요하다는 고민에 부딪혔습니다.Kestrel 은 .NET 애플리케이션을 위한 기본 웹 서버로 훌륭하지만, 단독으로 외부 요청을 처리하기에는 보안과 성능 면에서 한계가 있습니다. 따라서 외부로부터의 요청을 프록시하는 Nginx 를 앞단에 두는 구조를 선택하게 되었습니다. Nginx 는 리버스 프록시로 설정되어, 외부에서 들어오는 요청을 처리한 후, Kestrel 로 전달하는 역할을 하게 됩니다. 이로써 성능과 보안, 확장성에서 많은 이점을 얻을 수 있었습니다.


1. .NET API 배포 준비

먼저, 여러분이 서버에 .NET API 를 배포할 준비가 되어 있어야 합니다. .NET SDK 를 서버에 설치하고, API 를 배포한 후 실행하는 과정을 진행하겠습니다.

.NET SDK 설치

우선, 서버가 Ubuntu 환경일 경우 .NET SDK 를 설치해야 합니다. 이를 통해 서버에서 .NET 애플리케이션 을 구동할 수 있는 환경을 준비합니다.

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
sudo apt update
sudo apt install -y apt-transport-https
sudo apt install -y dotnet-sdk-6.0

이 명령어는 Ubuntu 20.04 버전을 기준으로 합니다. 다른 버전을 사용하는 경우, 해당 운영체제에 맞는 SDK 패키지를 설치해야 합니다.

.NET API 빌드 및 배포

로컬에서 .NET API 를 빌드하고 서버에 배포하는 과정입니다.

1) 로컬에서 API 빌드

dotnet publish --configuration Release

이 명령어는 여러분의 .NET 프로젝트Release 모드로 빌드한 후, 빌드된 파일들을 publish 폴더에 저장합니다.

2) 서버로 빌드된 파일 전송

이제 빌드된 파일을 서버에 복사해야 합니다. 이를 위해 scp 명령어를 사용합니다.

scp -r {{/path/to/publish}} {{user}}@{{your_server}}:/{{path/to/your/api}}
  • {{/path/to/publish}}: 로컬 컴퓨터에서 빌드된 파일이 저장된 경로입니다. 예를 들어 ~/projects/MyApp/bin/Release/net6.0/publish와 같은 경로를 사용합니다.
  • {{user}}: 서버에 접속할 때 사용하는 사용자 이름입니다. 보통 ubuntu, admin과 같은 계정을 사용합니다.
  • {{your_server}}: 서버의 IP 주소나 도메인을 입력합니다. 예를 들어, 203.0.113.1이나 example.com을 사용할 수 있습니다.
  • {{/path/to/your/api}}: 서버에서 배포된 API 파일이 위치할 경로입니다. 보통 /var/www/myapp과 같은 경로를 지정합니다.

Kestrel로 API 실행

이제 서버에 .NET API 를 실행해야 합니다. Kestrel 서버는 .NET API 를 호스팅하는 기본 웹 서버로, 외부 요청을 처리하는 중요한 역할을 합니다. 배포한 위치로 이동한 후 API 를 실행합니다.

cd {{/path/to/your/api}}
dotnet {{YourApi.dll}}
  • {{/path/to/your/api}}: 배포된 API의 실제 경로입니다.
  • {{YourApi.dll}}: 빌드된 .NET API 실행 파일의 이름입니다. 보통 프로젝트 이름과 동일합니다. 예를 들어 프로젝트 이름이 MyApp이라면 MyApp.dll이 됩니다.
    이제 Kestrel 이 기본적으로 http://localhost:5000에서 API 를 실행하게 됩니다. 여기까지 .NET API 배포와 실행이 완료되었습니다.

2. Nginx 설치 및 리버스 프록시 설정

이제 Nginx 를 설치하고, 외부 트래픽을 Kestrel 로 전달할 리버스 프록시로 설정하는 방법을 알아보겠습니다.

Nginx 설치

먼저 Nginx 가 설치되어 있지 않다면, 다음 명령어로 설치할 수 있습니다.

sudo apt update
sudo apt install nginx

설치가 완료되면 Nginx 는 자동으로 시작됩니다.

Nginx 기본 설정

Nginx 설정 파일을 수정하여, 들어오는 HTTP 요청을 .NET API 로 전달하도록 설정합니다.

sudo nano /etc/nginx/sites-available/default

기본 설정 파일을 열면, 아래와 같은 설정을 추가합니다.

server {
    listen 80;
    server_name {{your_domain.com}};

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • {{your_domain.com}}: 여러분의 실제 도메인 이름을 입력해야 합니다. 도메인이 없다면 서버의 IP 주소를 사용할 수 있습니다.

SSL 지원 (HTTPS 설정)

만약 HTTPS를 지원하려면, SSL 인증서를 적용해야 합니다. 이를 위해 Let's Encrypt 와 같은 무료 SSL 인증서를 사용할 수 있습니다.

server {
    listen 80;
    server_name {{your_domain.com}};
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name {{your_domain.com}};

    ssl_certificate /etc/letsencrypt/live/{{your_domain.com}}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{{your_domain.com}}/privkey.pem;

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • {{your_domain.com}}: 여러분의 도메인 이름을 입력합니다.
  • /etc/letsencrypt/live/{{your_domain.com}}/fullchain.pem/etc/letsencrypt/live/{{your_domain.com}}/privkey.pem은 인증서와 개인 키 파일의 경로입니다.

Nginx 설정 테스트 및 적용

설정을 완료한 후에는 Nginx 설정 파일이 올바른지 확인하고, 설정을 적용해야 합니다.

sudo nginx -t
sudo systemctl restart nginx

nginx -t 명령어로 설정 파일에 오류가 있는지 확인한 후, 문제가 없다면 Nginx 를 재시작하여 설정을 적용합니다.


3. 방화벽 설정

서버의 방화벽이 활성화되어 있다면, Nginx 가 사용하는 포트(80, 443)를 열어야 외부에서 접근할 수 있습니다.

sudo ufw allow 'Nginx Full'

이 명령어는 Nginx 가 사용하는 80번과 443번 포트를 허용합니다.


4. 도메인 및 DNS 설정

Nginx 설정에서 지정한 {{your_domain.com}}이 실제로 작동하도록 하기 위해서는, 여러분이 도메인에 대해 DNS 설정을 완료해야 합니다. 도메인의 A 레코드 또는 CNAME 레코드 가 서버의 IP 주소를 가리키도록 설정하세요.


5. .NET API 자동 실행 설정

서버가 재부팅되거나, .NET API 가 다운되었을 때 자동으로 다시 실행되도록 설정하는 방법을 알아보겠습니다. 이를 위해 systemd 서비스를 설정합니다.

systemd 서비스 파일 생성

sudo nano /etc/systemd/system/kestrel-{{yourapi}}.service

서비스 파일 내용은 다음과 같습니다.

[Unit]
Description=Your .NET API
After=network.target

[Service]
WorkingDirectory=/{{path/to/your/api}}
ExecStart=/usr/bin/dotnet {{YourApi.dll}}
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-{{yourapi}}
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target
  • {{yourapi}}: 여러분의 API 이름을 입력합니다.
  • {{/path/to/your/api}}: API가 배포된 경로를 입력합니다.
  • {{YourApi.dll}}: API 실행 파일의 이름을 입력합니다.

서비스 활성화 및 시작

sudo systemctl enable kestrel-{{yourapi}}.service
sudo systemctl start kestrel-{{yourapi}}.service

이제 서버가 재부팅되더라도 .NET API 가 자동으로 실행됩니다.


결론

이 글을 통해 Nginx.NET API 를 연결하는 방법을 소개했습니다. 실제 설정 과정에서 사용자가 넣어야 할 값들은 {{}}로 표시하여, 여러분의 환경에 맞게 쉽게 수정할 수 있도록 했습니다.설정 과정에서 문제가 발생할 수 있지만, 이는 대부분 경로나 도메인 설정 오류에서 비롯됩니다. 설정한 경로와 파일명이 정확한지 항상 확인하는 것이 중요합니다. 여러분이 이 글을 통해 쉽게 설정을 완료하고, Nginx.NET API 를 성공적으로 연결하시길 바랍니다.

'ASP.NET' 카테고리의 다른 글

[ASP.NET]TextBox의 AutoPostBack과 TextChanged 속성에 대해....  (1) 2015.01.09
[ASP.NET] AutoEventWireu  (0) 2014.07.16