Zero To One
nginx 리버스 프록시 만들기 본문
nginx가 설치되어 있다는 가정하에 진행해 보겠습니다.
1. conf.d 폴더에 들어가 줍니다.
cd /etc/nginx/conf.d
2. 파일에 들어가 줍니다.
sudo nano default.conf
저는 conf.d에서 default.conf로 있지만
cd /etc/nginx
에서 nginx.conf 파일로 있는 분도 계실 겁니다.
설정하는 법은 똑같으니 상관은 없습니다.
일단 제 기준(우분투 20.04LTS) 기준으로 설명드리겠습니다.
3. 전체적인 코드입니다.
proxy_cache_path /etc/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=1g inactive=1m use_temp_path=off;
server {
listen 10026;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
#location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
#}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header myname "devops01-choijsehyeok";
proxy_pass http://3.35.135.185:8080/;
proxy_cache mycache;
add_header Cache-Control "public";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_valid 5s;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
proxy_cache_path에서 nginx가 있는 폴더의 경로로 설정해줍니다.
proxy_cache_path /etc/nginx/cache
뒤에 붙은 놈들을 보겠습니다.
levels=1:2 keys_zone=mycache:10m max_size=1g inactive=1m use_temp_path=off
- levels는 /path/to/cache/ 아래에 2단계 디렉토리 계층을 설정합니다. 단일 디렉터리에 파일 수가 많으면 파일 액세스 속도가 느려질 수 있으므로 대부분의 배포에서는 2단계 디렉터리 계층을 사용하는 것이 좋습니다. 만약 levels 매개변수가 포함되지 않는다면 NGINX는 모든 파일을 같은 디렉토리에 둔다.
- keys_zone은 캐시 키와 사용 타이머와 같은 메타데이터를 저장하기 위한 공유 메모리 영역을 설정합니다. 메모리에 키의 복사본이 있으면 NGINX는 디스크에 갈 필요 없이 요청이 HIT인지 MISS인지 빠르게 판단할 수 있어 검사 속도를 크게 높일 수 있다. 1MB 영역에서는 약 8,000개의 키에 대한 데이터를 저장할 수 있으므로 예제에 구성된 10MB 영역에서는 약 80,000개의 키에 대한 데이터를 저장할 수 있습니다.
- max_size는 캐시 크기의 상한(이 예에서는 10GB)을 설정합니다. 값을 지정하지 않으면 사용 가능한 모든 디스크 공간을 사용할 수 있도록 캐시가 커질 수 있습니다. 캐시 크기가 제한에 도달하면 캐시 관리자라는 프로세스가 캐시 크기를 제한 이하로 되돌리기 위해 최근에 사용된 파일을 제거합니다.
- inactive은 항목이 액세스되지 않고 캐시에 남아 있을 수 있는 기간을 지정합니다. 이 예에서 60분 동안 요청되지 않은 파일은 만료 여부와 관계없이 캐시 관리자 프로세스에 의해 캐시에서 자동으로 삭제됩니다. 기본값은 10분(10m)입니다. 비활성 콘텐츠가 만료된 콘텐츠와 다릅니다. NGINX는 캐시 제어 헤더에 의해 정의된 대로 만료된 콘텐츠를 자동으로 삭제하지 않습니다(예: max-age=120). 만료된(스틸) 콘텐츠는 비활성으로 지정된 시간 동안 액세스하지 않은 경우에만 삭제됩니다. 만료된 콘텐츠에 접근하면 NGINX는 오리진 서버에서 해당 콘텐츠를 새로 고치고 비활성 타이머를 재설정합니다.
- NGINX는 먼저 캐시를 위한 파일을 임시 스토리지 영역에 기록하고 use_path_off 지시문은 그것들이 캐시될 동일한 디렉토리에 기록하도록 지시한다. 파일 시스템 간에 데이터를 불필요하게 복사하지 않으려면 이 매개 변수를 off로 설정하는 것이 좋습니다. use_temp_path는 NGINX 버전 1.7.10과 NGINX Plus R6에 도입되었다.
다음은 location 항목입니다.
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header myname "devops01-choijsehyeok";
proxy_pass http://3.35.135.185:8080/;
proxy_cache mycache;
add_header Cache-Control "public";
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_valid 5s;
}
정리를 좀 한다면 서버에 listen에 10026으로 설정했습니다.
그럼 주소창에 localhost:10026/으로 접속을 합니다.
그럼 location에 / 로 끝나는 엔드포인트는 proxy_pass로 가게 됩니다.
마지막으로 nginx 공식 홈페이지에 있는 캐시 설정만 해주면 됩니다.
저같은 경우는 5초만 유효하게 만들었습니다.
nginx를 restart하고
curl -I http://localhost:10026을 입력하면 결과는 다음과 같습니다.
> curl -I http://localhost:10026
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Fri, 11 Mar 2022 07:57:57 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 173
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
ETag: W/"ad-6HccY62oyL9ksQ7atEIA2fmoeTQ"
Cache-Control: public
X-Cache-Status: MISS
> curl -I http://localhost:10026
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Fri, 11 Mar 2022 07:58:01 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 173
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
ETag: W/"ad-6HccY62oyL9ksQ7atEIA2fmoeTQ"
Cache-Control: public
X-Cache-Status: HIT
> curl -I http://localhost:10026
HTTP/1.1 200 OK
Server: nginx/1.21.6
Date: Fri, 11 Mar 2022 07:58:07 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 215
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
ETag: W/"d7-gECVe6RTXu28gGjfow+ktDbhDio"
Cache-Control: public
X-Cache-Status: EXPIRED
처음에는 MISS가 떴다가 HIT되고 5초후에 EXPIRED가 뜬 것을 볼 수 있습니다.
연속해서 실행하다 보면 HIT과 EXPIRED를 반복하는 것을 볼 수 있습니다.
처음 캐시가 없을 때는 MISS로 뜨지만 이후 캐시가 남아있으므로 HIT과 EXPIRED가 뜹니다.
..
MISS가 보고싶다 하시는 분은
proxy_cache_path에 inactive를 수정하시거나,
nginx안에 cache파일을 sudo rm -rf cache 명령어를 입력해서 지우셔도 됩니다.
'네트워크 기초' 카테고리의 다른 글
캐시에 대한 블로그 (0) | 2022.03.10 |
---|---|
TCP/IP (0) | 2022.03.08 |
네트워크란? (0) | 2022.03.08 |