Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR

agnusdei·2025년 7월 25일

nginx + MinIO HTTP/2 프로토콜 오류 해결 방법

문제 상황

MinIO를 nginx 리버스 프록시로 서비스하던 중 다음과 같은 오류가 발생했습니다.

발생한 오류들

브라우저 콘솔 오류:

Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR
파일 다운로드 오류: TypeError: Failed to fetch

nginx 에러 로그:

[crit] open() "/var/cache/nginx/proxy_temp/4/56/0000027564" failed (13: Permission denied) while reading upstream, 
client: 125.136.152.11, server: minio.example.com, 
request: "GET /api/v1/buckets/bucket-name/objects/download?prefix=filename.exe&version_id=null HTTP/2.0"

원인 분석

  1. HTTP/2 프로토콜 호환성 문제: nginx 1.28과 MinIO 간의 HTTP/2 통신에서 발생하는 호환성 이슈
  2. nginx 프록시 캐시 권한 문제: /var/cache/nginx/proxy_temp/ 디렉토리 권한 부족으로 임시 파일 생성 실패

해결 방법

1. nginx 전역 설정 수정

/etc/nginx/nginx.conf 파일의 http 블록에 HTTP/2 관련 설정 추가:

http {
    # 기존 설정들...
    
    # HTTP/2 관련 설정 추가
    http2_max_field_size 16k;
    http2_max_header_size 32k;
    
    # 나머지 설정들...
}

2. 사이트별 설정 수정

기존 설정:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name storage.example.com;
    ssl_certificate /etc/nginx/example.com.crt;
    ssl_certificate_key /etc/nginx/example.com.csr;
    
    client_max_body_size 0;
    
    location / {
        add_header Last-Modified $http_date;
        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;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        proxy_pass http://192.168.0.3:9000;
    }
}

수정된 설정:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name storage.example.com;
    ssl_certificate /etc/nginx/example.com.crt;
    ssl_certificate_key /etc/nginx/example.com.csr;
    
    client_max_body_size 0;
    
    location / {
        add_header Last-Modified $http_date;
        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;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        
        # 버퍼링 비활성화로 임시 파일 생성 방지
        proxy_buffering off;
        proxy_request_buffering off;
        
        # HTTP/2 push 비활성화
        http2_push off;
        
        proxy_pass http://192.168.0.3:9000;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name minio.example.com;
    ssl_certificate /etc/nginx/example.com.crt;
    ssl_certificate_key /etc/nginx/example.com.csr;
    
    client_max_body_size 0;
    
    location / {
        proxy_set_header Host $http_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;
        proxy_set_header X-NginX-Proxy true;
        real_ip_header X-Real-IP;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        chunked_transfer_encoding off;
        
        # 버퍼링 비활성화로 임시 파일 생성 방지
        proxy_buffering off;
        proxy_request_buffering off;
        
        # HTTP/2 push 비활성화
        http2_push off;
        
        proxy_pass http://192.168.0.3:9001;
    }
}

3. nginx 캐시 디렉토리 권한 수정

# nginx 캐시 디렉토리 권한 수정
sudo chown -R nginx:nginx /var/cache/nginx/
sudo chmod -R 755 /var/cache/nginx/

4. 설정 적용

# 설정 문법 검사
sudo nginx -t

# nginx 재시작
sudo systemctl restart nginx

핵심 해결 포인트

  1. proxy_buffering off: nginx가 임시 파일을 생성하지 않도록 버퍼링 비활성화
  2. proxy_request_buffering off: 요청 버퍼링도 비활성화
  3. http2_push off: HTTP/2 서버 푸시 기능 비활성화
  4. nginx 캐시 디렉토리 권한 수정: 권한 문제로 인한 임시 파일 생성 실패 방지

문제 해결 확인

설정 적용 후 다음을 확인:

  • 브라우저에서 파일 다운로드가 정상적으로 작동하는지 확인
  • nginx 에러 로그에서 권한 오류가 더 이상 발생하지 않는지 확인
# 에러 로그 실시간 모니터링
sudo tail -f /var/log/nginx/error.log

환경 정보

  • nginx 버전: 1.28
  • MinIO 프록시 설정
  • HTTPS/SSL 적용
  • HTTP/2 활성화
profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글