JAN's History
서버 1대에서 여러 서비스 운영하기: 포트별 관리와 방화벽 설정 완전 가이드 본문
서버 한 대에 여러 서비스를 띄우면서 보안도 챙기고 싶을 때 어떻게 해야 할까요?
이번 글에서는 단일 서버에서 여러 포트를 활용해 웹서버, 백엔드, DB를 분리 운영하고, 리눅스 방화벽(ufw, iptables)으로
포트별 접근 제어하는 방법을 예시와 함께 알아보겠습니다!
왜 포트별 서비스 운영과 방화벽 설정이 중요한가?
- 서버 비용 절감 (서버 1대만 사용)
- 보안 강화 (필요한 포트만 외부 개방)
- 서비스 안정성 향상 (내부 DB에 외부 접근 차단)
서비스별 포트는 어떻게 관리할까
예시) 3가지 서비스 포트
서비스포트 번호 역할
웹서버 (Nginx/Apache) | 80, 443 | 외부 사용자 접속용 |
백엔드 API (Node.js 등) | 8080 | API 요청 처리용 |
데이터베이스 (MySQL) | 3306 | 내부 데이터 저장, 외부 차단 |
일반적으로 사용되는 서비스 포트인데요!
서버에서는 각 서비스가 해당 포트에서 동작하도록 설정해야 합니다.
방화벽 설정하기 (UFW 기준)
sudo ufw default deny incoming # 모든 수신 연결 차단
sudo ufw default allow outgoing # 모든 발신 연결 허용
sudo ufw allow 80/tcp # HTTP 허용
sudo ufw allow 443/tcp # HTTPS 허용
sudo ufw allow 8080/tcp # 백엔드 API 허용 (필요 시)
# DB 포트 3306은 허용하지 않아 외부에서 차단됨
sudo ufw enable # 방화벽 활성화
sudo ufw status verbose # 설정 확인
방화벽 활성화란 기본적으로 서버로 들어오고 나가는 네트워크 트래픽을 기본적으로 모두 차단하고, 허용할 것만 따로 열어주는 상태로 만드는 것입니다.
MySQL DB는 로컬에서만 접근하도록 설정하기
/etc/mysql/mysql.conf.d/mysqld.cnf 에서 아래와 같이 설정
bind-address = 127.0.0.1
아까 방화벽을 활성화해서 트래픽을 차단했었죠?
이렇게 하면 DB는 서버 내부에서만 접속 가능해집니다.
실제 서비스 포트 확인하기
sudo ss -tulpn | grep LISTEN
출력 예시
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=5678,fd=10))
tcp LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("node",pid=9012,fd=11))
주의사항
- 포트별로 서비스 분리하면 관리가 쉽고 보안에도 효과적입니다.
- 방화벽은 꼭 활성화해서 외부 불필요한 접근 막아야해요.
- DB는 가능하면 로컬 바인딩하거나 내부 네트워크에서만 접근 가능하도록 설정해야합니다.
- 서버가 한 대일 때는 장애 대비 백업 계획도 중요합니다!
이렇게 한 대의 서버에서 여러 서비스를 안전하게 운영하는 방법을 알아봤습니다.
더 복잡한 구조나 트래픽이 많아지면 멀티 서버, 로드밸런서, 컨테이너 오케스트레이션 등을 고려해보세요!
'개발용어' 카테고리의 다른 글
서버 부하가 많이 걸린다면 어떤 방식으로 아키텍처를 구성, 변경해야할까? (2) | 2025.08.28 |
---|---|
메시지 큐 시스템 완전 정복: Pub/Sub과 Producer/Consumer 패턴의 차이와 활용법 (3) | 2025.08.23 |
3 tier 환경의 전반적인 프로세스 심화과정 (DNS, L7, LB, CDN까지) (0) | 2025.08.21 |
React 앱을 Nginx로 배포하는 방법 과정 (3) | 2025.08.15 |
기본적인 웹 환경의 아키텍처 설명하기 (이것만 알아도 아키텍처는 끝!!) (2) | 2025.08.11 |