[Nginx] Nginx 프록시 서버 만들기

jihun Choi·2023년 11월 4일
0
post-thumbnail

안녕하세요 오늘은 nginx를 활용하여 프록시 서버를 구성해 보도록 하겠습니다

😎 Nginx란?

Nginx는 비동기 I/O 처리 방식을 사용하여 높은 성능을 제공합니다 대규모 웹 사이트에서도 빠른 응답 시간을 보장할 수있으며 리버스 프록시 사용이 가능하여 여러가지 프로젝트를 하나의 포트에서 호출할수 있습니다


😎 프록시(Proxy) 란?

인터넷 접속을 할 때 보안상의 문제로 직접 통신이 불가능 할때 대리로 통신을 수행하는 기능입니다


지금부터 nginx conf파일을 수정하여 프록시 환경을 구성해 보도록 하겠습니다

nginx 다운로드 경로에 들어가면 nginx.conf라는 파일을 찾을수 있습니다 해당 파일을 커스터마이징하여 수정해야 프록시 환경을 구성할 수 있습니다

  • nginx.conf

worker_processes  auto;

events {
    worker_connections  4000;
}

http {
    include       mime.types;               # 해당 http 블럭에서 처리할 mime type 모음, 기본으로 octet_stream을 사용함
    default_type  application/octet-stream; # octet_stream은 file이나 data의 content-type을 식별하기 어려운 경우에 사용할 수 있는 기본 타입임

    sendfile       on;                      # 디스크에서 네트워크로 파일을 전송할 때 sendfile()이라는 system call을 사용할지 여부를 결정함
    tcp_nopush     on;                      # TCP 패킷을 가능한 빨리 전송할 지(on) 또는 조금 기다렸다가 모아서 전송할 지(off)를 결정함

    keepalive_timeout  65;                  # keep-alive connection는 유휴 상태의 keep-alive 커넥션이 얼마나 오래 유지될지를 결정함(default 75)
    keepalive_requests 100;                 # keep-alive requests는 단일 keep-alive 커넥션이 최대 몇 개의 요청을 전송할 수 있는지를 결정함(default 100)

    gzip          on;                       # gzip 압축을 활성화함

    send_timeout       15s;                 # send_timeout는 nginx가 WAS로 요청을 보내고, 응답을 기다리는 시간임(default 60s)
    resolver_timeout   5s;                  # resolver_timeout는 DNS를 찾는 것을 완료하기까지 기다리는 시간임(default 30s)


    large_client_header_buffers 20 32k;     # 요청 헤더를 읽을 때 사용되는 버퍼의 최대 개수와 크기(default 4, 8k), 초과 시 414 에러 반환
    client_header_buffer_size   8k;         # 요청 헤더를 저장하기 위한 버퍼 크기(default 1k), 초과 시 414 에러 반환 ex)쿠키 크기가 커질 경우
    client_max_body_size        100M;       # 요청 바디의 최대 크기(default 1M), 초과 시 413 에러 반환
    client_body_buffer_size     1M;         # 요청 바디를 저장하기 위한 버퍼 크기(default 8k), 초과 시 버퍼 데이터를 메모리에서 디스크로 저장함
    output_buffers 20 32k;                  # 응답 바디를 저장하기 위한 버퍼 크기(default 1, 32k), 32K짜리 버퍼 1개를 응답에 사용하겠다는 의미임

    ignore_invalid_headers off;             # 요청 헤더에 유효하지 않은 헤더가 있을 경우 무시할지 결정함
    server_tokens off;                      # 응답 헤더에 nginx 버전 정보를 넣을지 결정함
    autoindex off;                          # 요청 경로 대상이 디렉토리인 경우, 파일 리스팅을 할지 여부(off 시 403 에러 반환)

    include header.conf;
    include upstream.conf;

    include http-server.conf;
    include ssl-server.conf;
}

nginx 파일을 다음과 같이 구성하였습니다 세부 내용은 주석을 통해 확인할수 있습니다 header.conf, upstream.conf, http-server.conf, ssl-server.conf를 파일을 폴더내에 만들어 include 하였습니다

  • header.conf
proxy_set_header Host $host; # 프록시할 때 Host 헤더를 설정
proxy_http_version 1.1;

proxy_set_header Host $host가 있어야 프록시 환경을 사용할 수 있습니다

  • upstream.conf
upstream test-url {
     server 127.0.0.1:8090;
} 

localhost의 8090포트를 호출하는 test-url이란 upstream을 설정하였습니다
저는 테스트 용도로 사용하여 1개만 설정했지만 필요할경우 2개이상 설정할수 있습니다

  • http-server.conf
server {
        listen       80;
        server_name jhchoi.ex.kr;
        access_log  /opt/homebrew/var/log/nginx/jhchoi_access.log; # 파일로 로그 기록
	    error_log   /opt/homebrew/var/log/nginx/jhchoi_error.log;  # 파일로 에러 로그 기록

        location / {
            proxy_pass http://test-url;
        }
}

jhchoi.ex.kr이란 도메인과 포트번호 80으로 호출할경우 프록시 서버를 어떻게 구성할지 conf 파일내에 구성하는 파일입니다 access_log는 서버에 접근할시 로그의 경로를 설정하며 error_log는 error 로그의 경로를 설정해줍니다 location에 proxy_pass는 /로 url호출을 할경우 upstream에서 설정했던 127.0.0.1:8090으로 포워딩 해주는 역할을 합니다

  • ssl-server.conf

ssl-server.conf에서는 https로 통신할수 있도록 ssl 접속에 대한 정보를 입력해주었습니다

위 사진과 같이 인증서 파일을 미리 만들어주었습니다

server {
    listen       443 ssl;
	server_name  jhchoi.ex.kr;
	
	ssl_certificate      /opt/homebrew/etc/nginx/ssl/jhchoi.ex.kr.pem;
	ssl_certificate_key  /opt/homebrew/etc/nginx/ssl/jhchoi.ex.kr-key.pem;
	
	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;
	
	ssl_ciphers  HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;

    location / {
         proxy_pass http://test-url;
    }
}

ssl_certificate에서는 인증서 파일을 ssl_certificate_key는 인증서 key 파일이 있는 경로를 넣어주었습니다


conf파일 셋팅 후 https://jhchoi.ex.kr로 호출시 localhost:8090으로 포워딩 하는 것을 확인할수 있었습니다

conf파일에서 설정했던 경로로 log또한 들어가는것을 사진으로 확인할수 있었습니다

profile
성장을 위해 열심히 노력하는 개발자 입니다

0개의 댓글