Apache 리버스 프록시(Reverse Proxy) 설정

개념

클라이언트(브라우저)가 Apache 웹 서버(80번 포트)에 요청을 보내면, Apache가 그 요청을 대신 받아서 Next.js 개발 서버(예: 3000번 포트)로 전달해 주고, Next.js 서버에서 처리된 응답을 다시 받아서 클라이언트에게 전달해 주는 역할을 해요. 

준비물

  1. Apache 웹 서버: 컴퓨터에 Apache가 설치되어 있고 실행 중이어야 합니다.
    • Ubuntu/WSL: sudo apt update && sudo apt install apache2
    • Windows: Apache를 별도로 설치하거나 XAMPP 같은 툴을 사용할 수 있습니다.
  2. Next.js 개발 서버: 3000번 포트(또는 다른 포트)에서 Next.js 앱이 실행 중이어야 합니다.
    • npm run dev로 Next.js 앱을 실행해 주세요.

Apache 리버스 프록시 설정 단계

이제 단계별로 Apache를 설정해 볼게요! 이 설명은 Ubuntu/WSL 환경을 기준으로 작성되었지만, Windows 환경에서도 설정 파일 위치만 다를 뿐 유사하게 적용할 수 있습니다.

단계 1: 필요한 Apache 모듈 활성화

리버스 프록시 기능을 사용하려면 몇 가지 Apache 모듈이 활성화되어 있어야 해요. 터미널을 열고 다음 명령어를 입력해 주세요.

bash

sudo a2enmod proxy proxy_http headers
sudo systemctl restart apache2 # 또는 sudo service apache2 restart
  • proxy: 프록시 기능을 담당하는 핵심 모듈
  • proxy_http: HTTP/HTTPS 프록시 기능을 담당
  • headers: 응답 헤더를 조작하는 데 사용 (선택적이지만 유용해요)

모듈을 활성화한 후에는 Apache 서비스를 꼭 다시 시작해 줘야 변경사항이 적용됩니다.

단계 2: 가상 호스트(Virtual Host) 설정 파일 생성 및 편집

이제 Apache가 Next.js 앱으로 요청을 전달하도록 설정하는 파일을 만들 거예요.

  1. 새 설정 파일 생성: /etc/apache2/sites-available/ 디렉터리에 새로운 설정 파일을 생성합니다. 이름은 nextjs.conf 또는 your-project.conf 등으로 지정하는 것이 좋아요.sudo nano /etc/apache2/sites-available/nextjs.conf
  2. 설정 내용 추가: 파일을 열고 다음 내용을 붙여넣으세요.<VirtualHost *:80> ServerName localhost # 여기에 실제 도메인이나 IP 주소를 넣어주세요 (예: yourdomain.com 또는 127.0.0.1) ServerAdmin webmaster@localhost DocumentRoot /var/www/html # 필요 없지만, 기본값으로 두거나 Next.js 앱 경로로 지정해도 됩니다. ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # 리버스 프록시 설정 시작 ProxyRequests Off # Apache가 정방향 프록시로 동작하지 않도록 설정 ProxyPreserveHost On # 원본 요청의 Host 헤더를 그대로 백엔드 서버(Next.js)로 전달합니다. [【3】](https://dev.to/techwithhari/mastering-nextjs-deployment-on-ec2-direct-vs-apache-setup-1h3i) ProxyVia On # 프록시를 통해 요청이 전달되었음을 나타내는 Via 헤더를 추가합니다. # 다음은 퐁코님의 Next.js 앱이 3000번 포트에서 실행될 때의 설정이에요. # Apache가 받은 모든 요청("/")을 http://localhost:3000/으로 전달합니다. ProxyPass / http://localhost:3000/ # 백엔드 서버(Next.js)로부터의 응답 헤더를 재작성하여 외부 리디렉션 등이 올바르게 처리되도록 합니다. ProxyPassReverse / http://localhost:3000/ # 웹 소켓을 위한 프록시 설정 (Next.js HMR 등을 위해 필요할 수 있습니다) # ProxyPass /_next/webpack-hmr ws://localhost:3000/_next/webpack-hmr </VirtualHost>
    • ServerName localhost: 개발 환경에서는 localhost로 두셔도 되지만, 실제 도메인을 사용한다면 yourdomain.com 등으로 변경해야 합니다.
    • ProxyPass / http://localhost:3000/: 이 부분이 가장 중요해요! Apache 80번 포트로 들어오는 모든 요청(/)을 http://localhost:3000/으로 보내라는 뜻입니다.
    • ProxyPassReverse / http://localhost:3000/: 응답 헤더를 재작성하여 클라이언트가 원래 Apache 주소로 인식하도록 도와줍니다. 
    • ProxyPreserveHost On: 클라이언트가 접속한 원래 Host 헤더를 Next.js 서버에 전달해줍니다. 
  3. 설정 파일 저장 및 닫기: nano 에디터에서는 Ctrl+O를 눌러 저장하고, Ctrl+X를 눌러 닫습니다.

단계 3: 가상 호스트 활성화 및 Apache 재시작

새로 만든 설정 파일을 Apache에 알려주고 적용해야 합니다.

bash

sudo a2ensite nextjs.conf
sudo systemctl restart apache2 # 또는 sudo service apache2 restart
  • a2ensitesites-available 디렉터리의 설정 파일을 sites-enabled 디렉터리에 링크하여 활성화합니다.
  • systemctl restart apache2: Apache 서비스를 재시작하여 변경 사항을 적용합니다.

확인 방법

  1. Next.js 개발 서버가 3000번 포트에서 실행 중인지 확인합니다.npm run dev
  2. 웹 브라우저를 열고 http://localhost/ 또는 http://127.0.0.1/ 로 접속해 보세요.
  3. 성공적으로 설정되었다면, Next.js 앱이 80번 포트로 보이게 될 거예요!

윈도우 환경에서 Apache 설정 시 유의사항

  • 설정 파일 위치: 윈도우용 Apache(또는 XAMPP/WAMP)를 사용하신다면 httpd.conf 또는 httpd-vhosts.conf 파일을 찾아 편집해야 할 수 있습니다. 일반적으로 conf/extra/httpd-vhosts.conf에 가상 호스트 설정을 추가하고, httpd.conf에서 이 파일을 include하도록 되어 있어요.
  • Wslrelay.exe 문제: 앞서 wslrelay.exe가 80번 포트를 점유하고 있었던 문제는 Apache를 80번 포트에 띄우면 해결됩니다. Next.js 앱은 3000번 포트에서 돌아가고, Apache가 80번 포트를 맡아 처리하게 되니까요.

WSL 외부 IP 연결문제 해결 방법

  • 127.0.0.1:80을 점유한 wslrelay.exe 입니다. → 이건 WSL의 자동 localhost 포워딩 기능입니다. WSL에서 80/tcp가 열려 있으면 Windows의 localhost:80을 자동으로 WSL로 중계해 줍니다. → 즉, localhost:80은 wslrelay가 맡고 있고, 우리가 따로 portproxy 만들 필요가 없습니다.

A) 로컬(이 PC)에서만 http://localhost 로 쓰고 싶다

  1. 그냥 테스트만 해보세요: C:\Windows\System32\curl.exe http://127.0.0.1
    • 정상 HTML이 나오면 입니다. (wslrelay가 잘 중계 중)
    • 혹시 안 나오면 한번 재기동: wsl --shutdown Restart-Service LxssManager wsl C:\Windows\System32\curl.exe http://127.0.0.1
    이미 curl http://127.0.0.1:8080 은 정상이고, wslrelay가 80을 잡고 있으므로 http://127.0.0.1 도 이제 정상일 가능성이 높습니다.

B) 같은 LAN의 다른 기기에서도 접속하고 싶다 (예: 휴대폰/다른 PC)

wslrelay가 127.0.0.1:80을 사용 중이라서, 0.0.0.0:80 로 또 바인딩하면 충돌납니다.
대신 Windows의 LAN IP로만 portproxy를 만들어 주세요.

  1. Windows의 LAN IP 확인: $lanIp = (Get-NetIPAddress -AddressFamily IPv4 ` | Where-Object { $_.InterfaceAlias -notmatch 'Loopback|WSL|vEthernet' -and $_.IPAddress -notlike '169.254.*' } ` | Sort-Object -Property SkipAsSource ` | Select-Object -First 1 -ExpandProperty IPAddress) Write-Host "LAN IP = $lanIp"
  2. 해당 LAN IP:80 → WSL:80 포워딩 생성(127.0.0.1:80은 wslrelay가 계속 담당): $wslIp = "172.26.10.217" # 현재 WSL IP netsh interface portproxy add v4tov4 listenaddress=$lanIp listenport=80 connectaddress=$wslIp connectport=80
  3. 방화벽 규칙 추가(그 LAN IP로만 80 허용): New-NetFirewallRule -DisplayName "WSL Apache 80 (LAN only)" ` -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80 -LocalAddress $lanIp

→ 이제 같은 네트워크의 다른 기기에서 http://<Windows_LAN_IP> 로 접속 가능해집니다.
(내부에서 공인 IP로 테스트하면 NAT 루프백 미지원 공유기에서는 실패할 수 있으니, 반드시 LAN IP로 테스트하세요.)


C) 외부 인터넷에서도 접속하고 싶다

  • 공유기에서 외부 80 → (Windows LAN IP):80 으로 포트포워딩 설정
  • ISP가 80 인바운드 차단 시, 외부 8080 → 내부 80 으로 매핑하고 http://공인IP:8080 사용

참고(유지보수)

  • WSL 쪽 80 허용 규칙은 재시작 시 사라질 수 있습니다. 영구 적용하려면: sudo apt install -y iptables-persistent sudo netfilter-persistent save
  • WSL IP는 재부팅/재시작 시 바뀔 수 있습니다. 바뀌면 위 portproxy의 connectaddress 를 새 IP로 갱신해야 합니다.

WSL2를 설치하는 방법

가장 간단하게 WSL2를 설치하는 방법.

1. 자동 설치 (가장 간단한 방법)

대부분의 경우 이 명령 한 줄이면 WSL2와 기본 Ubuntu 배포판이 설치되고 설정됩니다.

  1. 관리자 권한으로 PowerShell 또는 명령 프롬프트 열기:
    • 시작 메뉴에서 ‘powershell’ 또는 ‘cmd’를 검색하고, 마우스 오른쪽 버튼을 클릭해서 “관리자 권한으로 실행”을 선택해주세요.
  2. 설치 명령 실행:
    • 다음 명령어를 입력하고 엔터를 누르세요.wsl --install
    • 이 명령어는 필요한 가상 머신 플랫폼 구성 요소를 활성화하고, Linux 커널 패키지를 다운로드 및 설치하며, WSL2를 기본값으로 설정하고, Ubuntu 배포판을 설치합니다. 
  3. 시스템 재부팅:
    • 설치가 완료되면 시스템을 재부팅해야 합니다.
  4. 사용자 이름 및 비밀번호 설정:
    • 재부팅 후 Ubuntu가 자동으로 실행되면, 사용자 이름과 비밀번호를 설정하라는 메시지가 나타날 거예요. 여기에 원하는 정보를 입력하면 됩니다.

2. 수동 설치 (필요한 경우)

wsl --install 명령어가 제대로 작동하지 않거나, 특정 구성 요소를 직접 제어하고 싶을 때 수동으로 설치할 수도 있어요.

2.1. WSL 활성화

먼저 WSL을 활성화해야 해요. PowerShell을 이용하는 방법이 간단하다고 하네요. 

  1. 관리자 권한으로 PowerShell 열기:
    • wsl --install 할 때처럼 관리자 권한으로 PowerShell을 열어주세요.
  2. WSL 활성화 명령어 실행:
    • 다음 두 명령어를 순서대로 입력하고 엔터를 눌러 WSL 및 가상 머신 플랫폼 기능을 활성화합니다.dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  3. 시스템 재부팅:
    • 두 명령어를 실행한 후 컴퓨터를 재부팅해주세요.

2.2. Linux 커널 업데이트 패키지 설치

WSL2를 사용하려면 최신 Linux 커널 업데이트 패키지가 필요해요.

  1. 패키지 다운로드:
    • 마이크로소프트 공식 웹사이트에서 “WSL2 Linux 커널 업데이트 패키지”를 다운로드하고 설치해주세요. (보통 .msi 파일이에요)

2.3. WSL2를 기본 버전으로 설정

새로 설치하는 모든 Linux 배포판이 WSL2 모드로 실행되도록 기본 버전을 설정해줍니다.

  1. 관리자 권한으로 PowerShell 열기:
    • 다시 관리자 권한으로 PowerShell을 열어주세요.
  2. WSL2 기본 설정 명령어 실행:
    • 다음 명령어를 입력하고 엔터를 누릅니다.wsl --set-default-version 2

2.4. Linux 배포판 설치

이제 마이크로소프트 스토어에서 원하는 Linux 배포판(예: Ubuntu)을 설치하면 돼요.

  1. Microsoft Store 열기:
    • 시작 메뉴에서 ‘Microsoft Store’를 검색해서 엽니다.
  2. Linux 배포판 검색 및 설치:
    • 검색창에 ‘Ubuntu’를 입력하고 원하는 버전(예: Ubuntu 22.04 LTS)을 선택하여 “설치” 버튼을 클릭합니다.
  3. 사용자 이름 및 비밀번호 설정:
    • 설치가 완료된 Ubuntu 앱을 실행하면, 사용자 이름과 비밀번호를 설정하라는 메시지가 나타납니다.

마지막으로 확인하기

  • WSL 상태 확인: PowerShell에서 wsl -l -v 명령어를 입력하면 설치된 리눅스 배포판과 어떤 버전(WSL1 또는 WSL2)으로 실행 중인지 확인할 수 있어요.
error: Content is protected !!