앞단 프록시 주의
CDN 이나 리버스 프록시 뒤에 둘 때 챙길 한도(요청 본문 100MB, 응답 100초 등)와 대용량 업로드 방법
앱을 인터넷에 내놓을 때 HTTPS 를 붙이려고 CDN 이나 리버스 프록시를 앞에 두는 경우가 많습니다. 이때 실제 한도는 서버가 아니라 프록시가 정합니다. 서버는 파일 하나에 2 GiB 까지 받도록 되어 있어도, 요청은 프록시를 먼저 지나야 하기 때문입니다.
프록시의 두 한도
아래 숫자는 흔히 쓰는 CDN 프록시의 기본 한도 예입니다. 실제 값은 쓰는 프록시와 요금제에 따라 다르니 확인하세요. 플랫폼이 요청을 잘라 보내는 크기와 시간은 이 한도 아래로 들어가도록 정해져 있습니다.
| 한도 | 서버 설정 | 프록시 기본 한도 예 | 넘으면 |
|---|---|---|---|
| 요청 본문 | 파일당 2 GiB (GEO_MLOPS_DATASET_MAX_UPLOAD_BYTES) | 100 MB | 413: 프록시가 낸 HTML 오류 페이지. 요청이 서버에 닿지도 않음 |
| 응답 대기 | 없음 | 100초 | 524(프록시에 따라 504): 프록시가 응답 기다리기를 포기함. 서버는 끝까지 처리함 |
오류 본문이 JSON({"detail": …})이면 서버가 낸 것이고, HTML 오류 페이지면 프록시가 낸 것입니다. 이 구분이 진단의 출발점입니다.
524·504 는 "실패" 가 아니라 "클라이언트가 결과를 못 받았다" 는 뜻입니다. 서버 쪽에는 이미 반영되어 있을 수 있습니다. 액세스 로그에 없다고 요청이 안 온 것도 아닙니다.
플랫폼이 이미 한도 아래로 자르는 것
아래 경로는 요청 하나를 한도보다 작게 잘라 보내도록 만들어져 있어, 프록시 뒤에서도 그대로 동작합니다.
| 경로 | 한 번에 보내는 크기 |
|---|---|
| 웹 화면·CLI 의 데이터셋 업로드(청크 세션) | 32 MiB 청크. 끝나면 서버가 뒤에서 합치고 풀므로 응답이 바로 돌아옴 |
화면의 이미지 반입(docker save tar) | 32 MiB 청크 |
| 엣지 장비의 오프라인 파일 업로드 | 청크당 최대 50 MB |
| 엣지 장비의 명령 대기(롱폴: 응답이 올 때까지 요청을 열어 두고 기다리는 방식) | 최대 30초(응답 한도보다 짧게) |
대용량 데이터셋은 CLI 로
수천 개 파일을 올릴 때는 브라우저보다 클라이언트 CLI(geo-mlops-client, 서버 소스 디렉터리에서는 ./client)가 편합니다. datasets upload-archive 는 파일들을 16 MiB 짜리 무압축 ZIP 묶음으로 만들고, 묶음마다 재개 가능한 청크 세션으로 보냅니다. 끊긴 청크는 스스로 세 번까지 다시 보냅니다.
-
로그인합니다. 서버 주소와 테넌트를 한 번 넣으면 캐시됩니다.
geo-mlops-client login [email protected] --base-url https://api.mlops.example.com --tenant DEMO -
데이터셋 ID 와 올릴 디렉터리(하위 폴더 포함)를 줍니다.
--skip-existing은 이미 올라간 파일 이름을 먼저 조회해 건너뜁니다.geo-mlops-client datasets upload-archive <DATASET_ID> ~/corpus --skip-existing \ 2>&1 | tee -a ~/upload.log -
노트북 절전 등으로 명령이 멈췄다면 같은 명령을 다시 실행합니다.
--skip-existing덕분에 끊긴 곳부터 이어집니다.
- 진행 로그는 표준 오류로, 끝난 뒤의 요약 JSON 은 표준 출력으로 나옵니다.
- 서버는 파일을 파일 이름(basename) 기준으로 저장합니다. 다른 폴더에 같은 이름의 파일이 있으면 겹치므로, 명령이 보내기 전에 경고합니다.
- 묶음 하나를 만들 임시 공간이
TMPDIR에 필요합니다. 모자라면TMPDIR=/여유/경로를 앞에 붙입니다. datasets upload(파일 하나 = 요청 하나)는 청크로 나누지 않습니다. 그래서 프록시 한도(예: 100 MB)를 넘는 파일은 프록시에서 막힙니다. 큰 파일도upload-archive로 보내세요.
그 밖에 프록시 뒤에서 챙길 것
- HTTPS 와 쿠키: 프록시가 HTTPS 를 풀어 앱에 넘긴다면
GEO_MLOPS_AUTH_COOKIE_SECURE=true(기본값)를 유지합니다. 앱은--forwarded-allow-ips '*'로 떠서 프록시가 넘겨준X-Forwarded-*헤더를 믿습니다. 따라서 앱 포트(10000)는 프록시 외에는 밖에서 닿지 않게 방화벽으로 막으세요. - MLflow Host 검사: 도메인으로
/mlflow를 쓰면GEO_MLOPS_MLFLOW_ALLOWED_HOSTS에 그 도메인을 넣습니다(Docker Compose 로 설치 참고). - Alertmanager 웹훅: 프록시 뒤라면 웹훅 주소도 인터넷에 노출됩니다.
GEO_MLOPS_ALERTMANAGER_WEBHOOK_TOKEN을 꼭 설정합니다. 비어 있으면 앱이 웹훅을 닫아(503) 위조된 경보 주입을 막습니다. docker push: Docker 클라이언트는 이미지 레이어를 큰 요청으로 보냅니다. 그래서 프록시 한도(예: 100 MB)를 넘는 레이어는 프록시에서 막힐 수 있습니다. 큰 이미지는 사내망에서 레지스트리에 직접 push 하거나,docker save로 tar 를 만들어 이미지 반입으로 올리세요.
다음: 폐쇄망 설치