리눅스 기초 시리즈의 38번째 시간입니다! 지난 시간에는 우리가 정성껏 구축한 리눅스 환경을 통째로 보관하는 WSL2 이미지 백업을 통해 완벽한 복구 체계를 갖췄습니다. 이제 든든한 백업본도 있겠다, 본격적으로 우리가 만든 프로젝트들을 세상 밖으로 선보일 차례입니다.
하나의 서버에서 블로그도 운영하고, 포트폴리오 사이트도 보여주고, API 서버도 돌리고 싶은데 어떻게 해야 할까요? 포트 번호를 일일이 외워서 접속해야 할까요? 오늘은 웹 서버의 강자 Nginx를 활용해 도메인 하나로 여러 서비스를 매끄럽게 연결하는 가상 호스트(Virtual Host)와 리버스 프록시(Reverse Proxy) 설정법을 정리해 보겠습니다.
1. 나의 경험담: "포트 번호의 늪에서 구원받다"
처음 제 개인 블로그인 sunyjini.com 외에 개발용 API 서버를 구축했을 때, 저는 주소 뒤에 :8080이나 :3000 같은 포트 번호를 붙여서 접속하곤 했습니다. 나 혼자 쓸 때는 상관없었지만, 외부 사람들에게 프로젝트를 보여줄 때 "주소 뒤에 콜론 팔공팔공을 붙여주세요"라고 말하는 게 참 멋없게 느껴지더군요.
심지어 보안상 특정 포트를 열어두는 것도 찜찜했습니다. 그때 공부하게 된 것이 Nginx의 리버스 프록시였습니다. 모든 요청을 80번(HTTP)이나 443번(HTTPS)으로 통합하고, Nginx가 내부적으로 포트를 배분해 주니 주소창이 깔끔해진 것은 물론이고 서버 관리 효율성도 수직 상승했습니다. 이제는 도메인만 있으면 몇 개든 서비스를 늘릴 수 있는 자신감이 생겼습니다.
2. Before: "지저분한 URL과 보안 취약점"
리버스 프록시를 적용하기 전에는 각 서비스가 외부에 직접 노출되어 있었습니다. 이는 단순히 주소가 지저분한 문제를 넘어, 방화벽에서 여러 포트를 열어야 하므로 보안에도 취약했죠.
불편했던 접속 방식:
# 웹 사이트: http://myserver.com
API 서버: http://myserver.com:8080
관리자 도구: http://myserver.com:9000
(▲ Before: 사용자에게 포트 번호 노출은 불친절할 뿐만 아니라, 서비스의 내부 구조를 그대로 드러내는 위험한 방식이었습니다.)
3. Action: Nginx로 교통정리 시작하기
이제 Nginx를 설치하고, 특정 도메인으로 들어오는 요청을 내부의 특정 포트로 쏴주는 리버스 프록시 설정을 적용해 보겠습니다.
설정 코드 (/etc/nginx/sites-available/api.conf):
server { listen 80; server_name https://www.google.com/search?q=api.sunyjini.com;
location / {
# 내부에서 돌고 있는 8080 포트로 전달!
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
(▲ Action: 이제 https://www.google.com/search?q=api.sunyjini.com으로 접속하면 Nginx가 이를 낚아채서 내부의 8080 포트 서비스로 조용히 연결해 줍니다. 사용자는 8080의 존재조차 모르게 되죠.)
4. After: 전문적이고 안전한 웹 서비스 환경
Nginx를 앞단에 세우고 나니 제 서버는 진정한 '웹 서버'의 면모를 갖추게 되었습니다.
달라진 점들:
- 단일 도메인 다중 서비스: 하나의 IP에서도 서브 도메인을 통해 수십 개의 서비스를 운영할 수 있습니다.
- SSL 통합 관리: 각 앱에서 복잡하게 인증서를 세팅할 필요 없이, Nginx 한 곳에서만 HTTPS 설정을 하면 모든 내부 서비스가 보호받습니다.
- 보안 강화: 외부에는 오직 80/443 포트만 열어두면 되므로 서버 침투 경로가 획기적으로 줄어듭니다.
5. 실험 요약 및 팁
| 용어 | 역할 | 비유 |
| 가상 호스트 | 도메인에 따라 다른 폴더/파일 연결 | 한 건물에 여러 간판 달기 |
| 리버스 프록시 | 요청을 내부 서버/포트로 전달 | 안내 데스크 직원이 방 번호 연결해주기 |
| proxy_pass | 실제 요청을 보낼 목적지 설정 | 뒷문으로 연결되는 통로 |
| server_name | 요청을 구분할 도메인 주소 | 편지 봉투의 수신인 이름 |
6. 마치며: 당신의 서버에 전문성을 입히세요
리눅스 기초 38단계를 통해 우리는 이제 단순한 로컬 개발을 넘어, 실제 웹 인프라를 설계하는 능력을 갖추게 되었습니다. Nginx는 현대 웹 생태계에서 없어서는 안 될 가장 강력한 '교통 순경'입니다. 주소창에서 포트 번호를 지우는 사소한 변화가 여러분의 프로젝트를 훨씬 더 전문적으로 보이게 할 것입니다.
오늘의 인사이트: "사용자는 서버의 복잡한 뒷사정을 알 필요가 없다. Nginx로 우아한 입구만 보여주자."
38번째 이야기를 마칩니다. 이제 우리만의 '멀티 웹 스테이션'이 준비되었습니다. 다음 시간에는 이렇게 연결된 웹 서비스들에 무료로 보안 인증서를 입혀 자물쇠 마크를 달아주는 **'Let's Encrypt와 Certbot으로 1분 만에 HTTPS 무료 적용하기'**에 대해 다뤄보겠습니다.
이 글이 여러분의 프로젝트를 세상에 내보내는 데 도움이 되었나요? 혹시 Nginx 설정 후 502 Bad Gateway 에러를 만나 당황하고 계신가요?
502 에러의 주범인 'SELinux 보안 설정'이나 '내부 서비스 미가동' 확인법을 다음 포스팅 부록으로 준비해 드릴까요?
'IT' 카테고리의 다른 글
| [리눅스 기초 #40] 서버의 '무한 증식'을 막아라: logrotate로 로그 다이어트와 용량 확보하기 (0) | 2026.02.10 |
|---|---|
| [리눅스 기초 #39] "주의 요함"은 이제 그만: Let's Encrypt와 Certbot으로 HTTPS 무료 적용하기 (0) | 2026.02.09 |
| [리눅스 기초 #37] 시스템 통째로 보관하기: WSL2 이미지 백업과 복구로 '타임머신' 만들기 (0) | 2026.02.08 |
| [리눅스 기초 #36] 내 서버의 주치의: Glances와 Netdata로 실시간 건강검진하기 (0) | 2026.02.08 |
| [리눅스 기초 #35] 내 서버를 지키는 파수꾼: UFW 방화벽으로 요새화하기 (1) | 2026.02.07 |