맥미니 홈서버 구축하기 (1) - 로컬 환경 프로젝트 실행

jinvicky·2025년 1월 10일

개발 환경 셋팅

목록 보기
1/6

Intro


새로 구입한 맥미니로 로컬 환경에서 웹서버와 WAS, DB를 실행 테스트했다. 정말 아무것도 안 깔린 맥미니에서 시작합니다.

개발 환경 셋팅

Homebrew

macOS 환경이므로 편리성을 위해 Homebrew를 설치한다.
👉 https://gymdev.tistory.com/91

프로젝트 로컬 실행에 필요한 것들을 설치한다.

nginx, mysql, node
brew install nginx

개발 Tool

VScode와 Intellij를 설치했다. mysql은 workbench대신 Intellij 내부 console를 연결해서 사용했다.

mysql은 최초 접속시 root 패스워드가 없다. 패스워드를 설정하고 재시작을 해준다. mysqladmin 명령어를 사용.
👉 https://brian3632.tistory.com/entry/Dr3632-Mysql-설치-후-root-초기-비밀번호-설정

그 외에 프로젝트 yml, env 파일들을 설정해주고 문제없이 동작시킨다. 이제 설치한 nginx를 프론트엔드 프로젝트와 연동해야 한다.

Nginx 설정

Short History

웹 서버하면 Nginx가 많이 언급된다. Apache 구조상 요청에 따른 cpu 코어가 프로세스를 바꾸는 context-switching 이 계속 발생하면서 cpu의 부담이 늘어나게 되었다. 결과적으로 대용량 트래픽을 감당하기 어려운 구조인 것이다.

이벤트 기반의 구조인 NginX

NginX는 Master,Worker 프로세스로 이루어져 있는데 master가 설정 파일을 읽고, worker들을 생성하면, worker들이 배정받은 listen socket으로 클라이언트와 커넥션을 형성한다.

  • worker 프로세스가 방치되지 않고 작업할 수 있다. 컴퓨터 자원을 Apache보다 더 효율적으로 쓴다.
  • 시간이 오래 걸리는 요청들은 별도의 쓰레드 풀(Thread Pool)로 작업을 위임한다.
  • worker 프로세스는 보통 cpu의 코어 갯수만큼 생성되기 때문에 cpu의 context-switching 사용이 줄어든다.

동시 연결 수가 많을 때 Apache vs. Nginx

NginX가 각광받은 계기는 모바일의 도입으로 트래픽과 동시 커넥션 수의 폭발적인 증가다.

Apache는 연결 수가 많아질 수록 메모리 사용이 선형적(linear)으로 증가한다. 100개 동시 연결이라면 100개의 프로세스를 생성해야 한다.
반면 Nginx는 단일 워커 프로세스가 여러 연결을 처리하므로, 100개 연결에도 전체 메모리 소비는 하나의 워커 프로세스 정도로 유지된다.
이에 비동기 이벤트 모델 또한 성능에 기여한다.

다만 NginX는 서버자체 호환성이 Apache보다 낮다고 한다;

실습

이제 nginx.conf를 고쳐서 프론트와 연동해보자.
나는 vim 에디터보다 조작이 편한 vscode를 사용했다. vscode에서 커맨드 팔레드(cmd+shift+p)를 열고 Shell Command: Install 'code' command in PATH 를 실행한다.

이제 아래와 같이 특정 파일을 code 명령어로 바로 열 수 있다.

code /opt/homebrew/etc/nginx

😌 처음에 구글링한 경로는 /usr/local/etc/nginx/nginx.conf 였는데 열어보니 내용이 텅 비어있었다. 내용이 숨겨져 있나?했는데 그냥 경로 틀린 거였다;; Homebrew로 깔았으면 경로가 /opt/homebrew/etc/nginx인듯.

이제 location을 고치고 port는 백엔드와 겹치지 않게 8082로 변경한뒤 재시작했는데? 여전히 nginx 기본화면이다. 그럴 때는 아래 명령어로 conf 파일을 검사해본다.

sudo nginx -t

아니나 다를까 location이 중복이라고 친절히 알려준다.

duplicate location "/" in opt/homebrew/etc/nginx/nginx.config:53

nginx.conf

location / {
  proxy_pass http://localhost:3000; # localhost:3000으로 요청을 전달
  proxy_http_version 1.1; # HTTP/1.1 사용
  proxy_set_header Upgrade $http_upgrade; # 웹소켓 지원
  proxy_set_header Connection 'upgrade'; # 웹소켓 지원
  proxy_set_header Host $host; # 원래의 호스트 헤더 전달
  proxy_cache_bypass $http_upgrade; # 캐시 우회
}

brew services restart nginx로 nginx를 재시작한 다음에 8082 포트로 접근하면 원하는 화면을 볼 수 있다 😄

TMI


  • 작게 시작해서 대수 늘리느니 최고 좋은 녀석을 사서 인프라 걱정을 덜고 싶었다. 아마 채팅방 만들면서 DB 공간 부족해지면 외장하드를 살 것 같다.
  • 맥미니 120만원 나왔는데 생활비 건드리기 싫어서 2달동안 커미션 캐릭터 1nn명과 배경 n개로 악깡으로 벌었다. 어려워서 짜증도 내고 그랬는데 때마침 커미션 이벤트가 팔려서 싫증이 사르르 녹았다.
profile
개발, 그림, 기록

0개의 댓글