최근 들어 많은 개발자들이 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 |