본문 바로가기
개발/Nginx

Nginx_ http Header 설정

by JunsC 2025. 3. 3.
728x90

Nginx 에서 http 관련한 리다이렉트 설정을 해둔게 있다.  나는 centos 7 환경에서의 리눅스 를 서버로 사용하고 있는데 이는 cafe24 에서 임대를 하고 있다.

 

내가 우선 설정한 nginx 관련 코드를 살펴보자 

 

Nginx-> 내가 설정한 코드

server {
    listen 443 ssl;
    server_name xxx;
    client_max_body_size 100M;  
    ssl_certificate xxx;
    ssl_certificate_key xxx;


location /reveal {
 proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host @http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass xxx;
        proxy_redirect off; # SSE의 경우 버퍼링을 끄지 않으면 메시지가 지연될 수 있음
        proxy_buffering off;
        proxy_cache off;

        # 연결 유지 활성화
        proxy_set_header Connection keep-alive;
        keepalive_timeout 300s;

        # Chunked 전송 인코딩을 지원하도록 설정 (SSE 필수)
        chunked_transfer_encoding on;
    }


location /join {
		proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host @http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass xxx;
        proxy_redirect off;# SSE의 경우 버퍼링을 끄지 않으면 메시지가 지연될 수 있음
        proxy_buffering off;
        proxy_cache off;

        # 연결 유지 활성화
        proxy_set_header Connection keep-alive;
        keepalive_timeout 300s;

        # Chunked 전송 인코딩을 지원하도록 설정 (SSE 필수)
        chunked_transfer_encoding on;
    }



    location /bmt/ {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
	   	proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header my_uuid $http_my_uuid;  # 요청 헤더 전달
        proxy_set_header X-NginX-Proxy true;	
        proxy_pass xxx;
        proxy_redirect off;
        #proxy_buffering off;  # Ensure SSE streams are not buffered
        #chunked_transfer_encoding off;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

server{
 listen 80;
 server_name xxx;
 location /shopping {
 return 301 xxx;
 }
}

 

 

위의 코드는 내가 지금 사용하고 있는 설정들이다. 우선 내가 사용한 설정들에 대해 간략히 설명해보자면,

  • listen 443 ssl;
    https 를 사용
  • ssl_certificate xxx; 
    ssl 인증서의 위치 및 파일경로
  • ssl_certificate_key xxx;
    ssl key 인증서의 위치 및 파일경로
  • proxy_set_header X-Real-IP $remote_addr;
    클라이언트의 실제 IP 주소를 X-Real-IP 헤더에 설정합니다. 이 헤더는 백엔드 서버가 클라이언트의 IP를 알 수 있도록 도와줍니다.
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    X-Forwarded-For 헤더는 클라이언트의 IP 주소와 함께 프록시 서버의 IP 주소를 포함합니다.
    proxy_add_x_forwarded_for 변수는 기존의 X-Forwarded-For 헤더에 클라이언트의 IP를 추가합니다. 이를 통해 백엔드 서버는 클라이언트의 원래 IP를 확인할 수 있습니다.
  • proxy_set_header Host @http_host;
    요청의 호스트 헤더를 설정합니다. 일반적으로 요청의 호스트를 백엔드 서버에 전달하는데 사용됩니다. 여기서 @http_host는 요청된 호스트를 나타내는 변수입니다.
  • proxy_set_header X-NginX-Proxy true;
    이 헤더는 요청이 nginx를 통해 전달되었음을 나타냅니다. 백엔드 서버에서 요청이 프록시를 통해 처리되었는지를 확인하는 용도로 사용될 수 있습니다.
  • proxy_redirect off;
    nginx가 백엔드 서버에서 받은 리다이렉트 응답을 수정하지 않도록 설정합니다. SSE(서버 전송 이벤트)와 같은 경우, 리다이렉트가 원치 않는 결과를 초래할 수 있으므로 이를 비활성화합니다.
  • proxy_buffering off;
    요청에 대한 응답을 nginx에서 버퍼링하지 않도록 설정합니다. 이는 SSE와 같이 실시간으로 데이터를 전송할 때 메시지가 지연되는 것을 방지하기 위해 필요합니다.
  • proxy_set_header Connection keep-alive;
    연결 유지 기능을 활성화하여 클라이언트와의 연결을 지속적으로 유지합니다. 이는 서버의 성능을 향상시킬 수 있습니다.
  • chunked_transfer_encoding on;
    청크 전송 인코딩을 지원하도록 설정합니다. 이는 SSE와 같은 지속적인 데이터 전송을 지원하기 위해 필요합니다.
  • proxy_set_header Upgrade $http_upgrade;
    이 설정은 WebSocket 연결을 지원하기 위해 사용됩니다. 클라이언트가 WebSocket 업그레이드를 요청할 때, Upgrade 헤더를 백엔드 서버로 전달합니다. $http_upgrade는 클라이언트 요청의 Upgrade 헤더 값을 가져옵니다.
  • proxy_set_header Connection "Upgrade";
    이 설정은 Connection 헤더를 "Upgrade"로 설정하여 클라이언트가 WebSocket 프로토콜로 업그레이드하려는 의도를 명시합니다. Upgrade 요청을 처리할 때 필요한 설정입니다.
  • proxy_set_header Host $host;
    이 설정은 요청의 원래 호스트명을 백엔드 서버로 전달합니다. $host는 클라이언트 요청에서 Host 헤더의 값을 가져오며, 이를 통해 백엔드 서버가 어떤 호스트에 대한 요청인지 인식할 수 있도록 도와줍니다.
  • proxy_set_header my_uuid $http_my_uuid;
    이 설정은 my_uuid라는 사용자 정의 헤더를 백엔드 서버로 전달합니다. $http_my_uuid는 클라이언트 요청의 my_uuid 헤더 값을 가져옵니다. 이를 통해 특정 사용자 정보를 백엔드 서버에 전달할 수 있습니다. 이 부분은 프록시를 통과하는 요청에서 클라이언트의 고유 식별자와 같은 정보를 유지하는 데 유용합니다.

위와 같이 대략적인 설명을 해보았다. 우선 나는 

proxy_set_header my_uuid $http_my_uuid;

이 부분을 설정을 했다. 헤더에 데이터를 담아서 따로 API 의 리턴값을 받도록 서버 설정을 했다. 우선 로컬서버에서는 아무런 이상이 없어서 서버에 업로드하고 배포를 하였다. 하지만 실제 배포버전에서는 해당 헤더값이 안들어가는 것이다.. ??

 

 

분명 로컬에서는 제대로 header 가 반영되어 제대로 된 리턴값이 왔는데 실제 배포서버에서는 헤더에 아무런 데이터를 못받는 것이다.

그래서 나는 nginx 에서 어떠한 로그가 들어오는지 궁금해서 바로 설정작업에 들어갔다.

nginx 에서 들어오는 관련 정보에 대해 로그를 알고 싶다면  !!!! 

cd /etc/nginx/nginx.conf

 

경로에 들어가보면, 

 

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    underscores_in_headers on;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '"my_uuid: $http_my_uuid"'; 

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

 

위와 같은 설정이 되어있다. 위의 코드를 보면 내가 한 방법이 있는데 
my_uuid: $http_my_uuid

이 부분이 내가 로그를 확인하기 위해 설정한 부분이니 참고하도록 하자. 

 

그리고 
underscores_in_headers on;

이 부분이 바로 오늘의 해결방법이다.

 

나는 retrofit2 나 swift의 almofire 에서 my_uuid 라는 값을 Header 에 요청해서 보내고 있었는데 여기에서 알아보니 "_"이 언더바가 nginx 에서 허용이 되질 않아 로그에 안찍히고 있었던 것이다. 그래서 나는 이부분에 대해 수정하고자 위와 같은 코드를 했더니 

드디어 제대로 작동된다. 

 

Nginx 에서 로그를 확인하는 방법은

cd /var/log/nginx/access.log

 

이다 . 여기에서 tailf -f 로 실시간 확인하면 nginx.conf 에서 설정한 log_format 에서의 로그가 바로 나오니까 참고하도록 하자 !!

 

뭔가 시간이 걸려도 끝까지 포기하지 않고 해내고 다음 단계로 넘어가는 것이 바로 개발자들의 재미일지도 모른다... ?? ㅠㅠ ㅋㅋㅋ

'개발 > Nginx' 카테고리의 다른 글

Centos 7 nginx https 설정  (0) 2024.06.01
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."