logo
Published on

안쓰는 컴퓨터를 배포 서버로 만들기 (1)

Authors
  • avatar
    Name
    MJ
    Twitter

안쓰는 컴퓨터를 서버로 쓰자!

그간 개발을 하면서 처음에는 aws s3 + cloudfront로 배포를 했었고, 이후에는 netlifyvercel로 배포를 했었습니다. 하지만 플랫폼을 사용하는 것은 비용이 발생하고, 무료로 사용할 수 있는 횟수가 제한되어 있습니다. (aws같은 경우는 방심하면 인스턴스를 종료해도 비용이 발생하기 때문에 더 조심해야 합니다.)

React로 개발한 경우는 html 파일과 js만 서빙하면 되고, Next.js를 사용한 경우는 Node.js 서버만 띄우면 되기 때문에 된다고 생각했기 때문에 안쓰는 컴퓨터를 서버로 사용하기로 결정했습니다.

물론, CDN같은 기능을 자동으로 연결해주지 않아서 추가적인 작업이 필요합니다. 하지만, 개발자에게 자유로움을 주기 때문에 선택했습니다. (vercel 같은 경우는 organization 레포지토리인 경우에 제약이 생기기도 합니다.)

Iptime 공유기와 ubuntu를 기준으로 작성되었습니다.

DDNS 설정

DDNS란? Dynamic Domain Name System의 약자로, 동적 IP 주소를 가진 네트워크 장치들을 위해 도메인 이름을 동적으로 업데이트하는 시스템을 말합니다.

우선 가정용 공유기는 외부에서 접속할 수 없기 때문에 DDNS를 설정해야 합니다. 또한, 공유기의 IP는 동적으로 할당되기 때문에 고정적으로 접속할 수 있는 도메인이 필요합니다.

192.168.0.1에 접속하면 공유기 설정 페이지로 이동할 수 있습니다. (기본값) 관리도구 > 고급설정 > 특수기능 > DDNS 설정으로 이동해서 [user-domain].iptime.org와 같은 도메인을 설정해줄 수 있습니다.

예시 이미지

접속상태가 정상 등록이 아니라면 이미 등록됐거나 잘못된 정보를 입력했을 수 있습니다. 다른 도메인을 사용해보세요.

포트포워딩 설정

포트포워딩이란? 외부에서 내부 네트워크로 접속할 수 있도록 포트를 열어주는 것을 말합니다.

Iptime 공유기는 기본적으로 80포트만을 열어두고 있기 때문에 추가적인 포트를 열어줘야 합니다.

저는 아래와 같은 것들을 위해 3가지 포트를 추가적으로 열어주었습니다.

  • ssh 접속을 위한 22번 포트 (22번 포트는 ssh를 위한 포트이기 때문에 바꿀 수 없습니다.)
  • https 접속을 위한 443번 포트 (443번 포트도 https를 위한 포트이기 때문에 바꿀 수 없습니다.)
  • 블로그를 위한 3000번 포트 (원하는 포트를 열어주면 됩니다.)

이제 외부에서 [user-domain].iptime.org:[port]으로 접속할 수 있습니다. 하지만, 도메인이 예쁘지 않기 때문에 도메인을 구입해서 연결해 수정해보도록 하겠습니다.

가비아에서 도메인 연결

가비아에서 도메인 구매해 적용해보기

위의 게시글과 같이 도메인을 구입하고, 가비아에서 DNS설정을 통해 [user-domain].com으로 연결할 수 있습니다.

가비아 dns

저는 ip와 ddns를 모두 사용했기 때문에 A 레코드와 CNAME 레코드를 모두 사용했습니다.

서버 설정

이제는 mj-dev.site와 같이 내가 원하는 도메인으로 접속할 수 있습니다. 실제로 ubuntu pc에서 3000번 포트로 서버를 띄우면 mj-dev.site:3000으로 접속할 수 있습니다.

하지만, 3000번 포트를 사용하지 않고 80포트나 443 포트로 사용하고 싶다면 nginx를 사용해야 합니다.

nginx란? 웹 서버 소프트웨어로, 웹 서버의 기능 외에도 리버스 프록시, 캐시 서버, 로드 밸런서, 미디어 스트리밍 등의 기능을 제공합니다.

그리고 https 적용을 해야 하기 때문에 let's Encrypt를 사용해 인증서를 발급받아야 합니다.

# 인증서 설정
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
sudo certbot renew --dry-run # 90일마다 갱신

# 방화벽 설정
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

- sudo ufw allow 'Nginx Full': 이 명령어는 방화벽을 설정하여 'Nginx Full' 프로파일을 허용합니다. 'Nginx Full'은 Nginx가 사용하는 모든 포트(80(HTTP)443(HTTPS))를 열어서 외부에서 Nginx 웹 서버에 접근할 수 있도록 합니다.

- sudo ufw delete allow 'Nginx HTTP': 이 명령어는 이전에 설정한 'Nginx HTTP' 규칙을 삭제합니다. 'Nginx HTTP' 규칙은 기본적으로 포트 80(HTTP)에 대한 접근을 허용하도록 설정되어 있으나, 이 명령어를 사용하면 이 규칙을 삭제하게 됩니다.

이제 nginx 설정을 할 수 있습니다. /etc/nginx/sites-available/defaultvinano로 열어서 아래와 같이 설정해줍니다.

# http 요청을 https로 리다이렉트 해줍니다.
server {
    listen 80;
    listen [::]:80;
    server_name mj-dev.site www.mj-dev.site;
    return 301 https://$host$request_uri;
}

# https 설정
server {
    # 443 포트(HTTPS)에서 SSL과 HTTP/2를 사용하여 요청을 처리합니다.
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mj-dev.site www.mj-dev.site;

    # SSL 인증서 파일 경로를 설정합니다.
    ssl_certificate /etc/letsencrypt/live/mj-dev.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mj-dev.site/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # project의 root 설정을 해줍니다. (프로젝트에 맞게 설정해줘야 합니다. 저는 Next.js를 사용했기 때문에 프로젝트 경로로 지정해줬습니다)
    root [root];
    index index.html index.htm index.nginx-debian.html;

    # 모든 동적 요청을 로컬호스트의 3000 포트로 프록시합니다(Next.js 서버)
    location / {
        proxy_pass http://127.0.0.1:3000;
        ...
    }
}

이제 nginx를 재시작하면 mj-dev.site로 접속하면 80번 포트나 443번 포트로 접속해도 3000번으로 연결됩니다.

sudo nginx -t # 테스트가 정상적이어야 restart 할 수 있습니다.
sudo systemctl restart nginx

이제 외부에서 mj-dev.site로 접속하면 서버에 접속할 수 있습니다.

외부에서 접속

마치며

이제 안쓰는 컴퓨터를 서버로 사용할 수 있게 되었습니다. 하지만, 아직 다음과 같은 문제들이 남아 있습니다.

  • ddos 공격에 대비하기
  • cdn 기능 추가하기
  • 서버 자동화 스크립트 추가하기(code push 됐을 때 자동으로 서버 재시작)

이런 문제들을 해결하면 더 안정적으로 서버를 운영할 수 있을 것 같습니다. 직접 온프레미스로 서버를 운영해보니 재미있었고, 더 많은 것을 배울 수 있었습니다.