
포트 80 충돌 문제: Nginx와 Apache 웹서버 충돌 재현 및 해결 방법
네트워크에서 **80번 포트(HTTP 기본 포트)**는 가장 많이 사용되는 자원 중 하나입니다.
하지만 동일한 서버에서 여러 웹 서버(Nginx, Apache)를 동시에 실행하려 하면 충돌이 발생할 수 있습니다.
이번 글에서는 포트 충돌 문제를 재현하고 해결하는 과정을 실습을 통해 정리해보겠습니다.
리눅스에서의 자원 관리와 시스템 콜
리눅스의 핵심 역할은 크게 두 가지입니다.
-
프로세스 관리 – 실행 중인 애플리케이션 관리
-
하드웨어 자원 관리 – CPU, 메모리, 네트워크 포트 등 자원 분배
모든 사용자 프로세스는 직접 자원을 사용하는 것이 아니라, **시스템 콜(System Call)**을 통해 리눅스 커널에 요청을 보내고 허락을 받아야 합니다.
대표적인 시스템 콜로는 open
, read
, write
가 있으며, 이를 통해 디스크, 네트워크, USB 같은 자원을 파일처럼 다루는 인터페이스를 제공합니다.
네트워크 포트도 예외는 아닙니다. 서버 프로그램이 특정 포트를 사용하려면 bind()
시스템 콜을 호출해 커널로부터 점유 허락을 받아야 합니다.
포트 점유와 충돌
예를 들어 Nginx가 80번 포트를 사용하려고 하면:
bind(socket_fd, 80)
라는 요청을 커널에 보냅니다.
커널이 허락하면 Nginx는 80번 포트를 점유하게 되고, 다른 프로세스가 동일 포트에 접근하면 거절됩니다.
이때 Apache(httpd)가 80번 포트를 쓰려고 하면 충돌이 발생합니다.
에러 메시지는 다음과 같습니다.
Address already in use Could not bind to address
이 메시지는 서버 운영 시 자주 접할 수 있는 대표적인 오류입니다. 반드시 기억해두면 좋습니다.
실습: Nginx와 Apache 충돌 상황 재현
실습은 RealLinux 레벨업 챌린지 환경에서 진행했습니다.
1. Nginx 설치 및 실행
dnf install nginx -y systemctl start nginx systemctl status nginx
이제 Nginx가 80번 포트를 점유하고 있는 상태입니다.
포트 점유 여부는 ss
또는 netstat
명령어로 확인할 수 있습니다.
ss -tnlp | grep 80
출력 예시:
LISTEN 0 128 *:80 *:* users:(("nginx",pid=3548,fd=6))
즉, 프로세스 nginx
가 PID 3548로 80번 포트를 사용 중임을 알 수 있습니다.
2. Apache(httpd) 설치 및 실행 시도
dnf install httpd -y systemctl start httpd systemctl status httpd
실행 결과:
Address already in use Could not bind to address
이미 Nginx가 포트를 차지하고 있어 httpd 실행이 실패합니다.
systemctl status httpd
에서 FAILED 상태를 확인할 수 있습니다.
충돌 해결 방법
충돌을 해결하는 방법은 여러 가지가 있습니다.
-
Nginx 중지 후 Apache 실행
systemctl stop nginx systemctl start httpd ss -tnlp | grep 80
-
이제 Apache가 정상적으로 80번 포트를 점유합니다.
2. 다른 포트 사용
Apache를 8080 포트 등으로 변경하여 Nginx와 동시에 실행할 수 있습니다.
3. 컨테이너/가상화 활용
Docker, Kubernetes 환경에서는 각 컨테이너 내부에서 동일한 80번 포트를 사용하더라도,
호스트와 포트 매핑만 충돌하지 않으면 문제가 없습니다.
마무리
이번 실습을 통해:
-
포트 점유와 시스템 콜(
bind
) 동작 원리 -
Nginx와 Apache의 충돌 상황 재현
-
포트 충돌 해결 방법(Nginx 중지, 포트 변경, 컨테이너 활용)
을 확인했습니다.
실무 환경에서는 “Address already in use” 메시지를 보게 되면,
먼저 ss
또는 netstat
명령어로 포트를 점유 중인 프로세스를 확인하는 습관이 중요합니다.
추가적으로 리눅스 기초 명령어 공부하고 싶다면도커/K8s/클라우드(AWS) 네트워크 완전 정복를 참고하세요. https://reallinux.co.kr/course/se_network