개요
Apache Airflow는 강력한 워크플로우 스케줄링 도구이지만, ALB 뒤에서 특정 서브 경로(/batch
)로 접근하려고 할 경우 예상치 못한 문제들이 발생할 수 있습니다. 본 포스트에서는 ALB → Nginx → Airflow 구조에서 301 Redirect 문제를 해결하고 /batch
경로로 안정적으로 서비스한 실제 사례를 공유합니다.
구성 개요
- ALB: 사용자로부터의 요청을 수신하고, EC2 인스턴스의 Nginx(8080 포트)로 전달
- Nginx:
/batch
경로를 감지하고 내부 포트 10080에서 실행 중인 Airflow Webserver로 리버스 프록시 전달 - Airflow Webserver: 루트(
/
) 경로 기준으로 동작
문제 발생
초기 구성은 다음과 같았습니다:
- Airflow Webserver는
-url-prefix /batch
로 설정 - ALB에서
https://domain.com/batch
요청을 8080 포트로 전달 - Airflow 설정은 다음과 같이 구성:
airflow webserver \\
--port 10080 \\
--url-prefix /batch
그럼에도 불구하고 웹 접근 시 다음과 같은 문제가 발생:
🔁 301 Moved Permanently
요청한
/batch
가 루트(/
)로 리다이렉션되어 Airflow UI가 제대로 로드되지 않음
이는 Airflow 내부에서 정적 리소스 경로나 링크가 여전히 /
를 기준으로 생성되기 때문에 발생한 현상입니다.
해결 방법: Nginx 리버스 프록시 도입
Airflow가 루트(/
)에서 동작한다고 속이기 위해, Nginx를 리버스 프록시로 활용하였습니다.
변경된 구성
구성 요소 | 포트 | 설명 |
---|---|---|
ALB | 외부 사용자 → 8080 | /batch 요청을 전달 |
Nginx | 8080 | /batch → localhost:10080 으로 프록시 |
Airflow | 10080 | 루트(/ )에서 실행됨 |
Nginx 설정 예시
server {
listen 8080;
server_name domain.com;
location /batch/ {
proxy_pass <http://localhost:10080/>;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# /batch를 제거하여 Airflow는 루트로 인식하게 함
rewrite ^/batch/(.*)$ /$1 break;
}
}
이 설정을 통해 /batch
로 접속된 모든 요청은 내부적으로 /
로 전달되며, Airflow는 이를 루트 경로 요청으로 인식합니다.
결과
https://domain.com/batch
접속 시 Airflow UI가 정상적으로 표시됨- 리다이렉션 없이 정적 리소스, URL 모두 정상 처리됨
- Nginx 로그 및 Airflow 로그에서도 오류 없이 경로 일치 확인
교훈 및 정리
Airflow는 기본적으로 /
경로에 강하게 의존하기 때문에, ALB나 프록시 뒤에서 경로 기반 라우팅을 사용하려면 다음 사항을 유의해야 합니다:
- Airflow에
-url-prefix
를 지정해도 완전한 경로 처리 대응이 되지 않는다. /batch
처럼 경로가 분기된 경우에는 중간에 Nginx 같은 리버스 프록시를 둬서 rewrite 처리를 해야 한다.- ALB는 Nginx와 함께 사용할 때 더욱 유연하게 경로 라우팅이 가능해진다.
참고 자료
- Airflow 공식 문서: Webserver Options
- NGINX Reverse Proxy 설정
- AWS ALB 라우팅 구성
마무리
다중 서비스가 하나의 도메인에서 운영되는 환경에서, 특정 경로(/batch
)에 Airflow를 안전하게 배치하려면 Nginx를 통한 경로 재작성이 효과적인 방법입니다. WordPress나 여러 SaaS 환경에서도 유사한 문제가 발생할 수 있으니, 리버스 프록시 구조를 염두에 두고 설계하는 것이 좋습니다.