기존 api 서버를 로컬 docker container로 올리기
$ docker build --platform linux/amd64 -f Dockerfile.test -t po-test .
FROM node:lts-alpine AS builder
WORKDIR /usr/src/app
COPY package*.json .
COPY . .
RUN npm ci
ENV NODE_ENV development
EXPOSE 3000 3001 3002 3003
$ docker run -itd -p 3000:3000 -p 3001:3001 -p 3002:3002 -p 3003:3003 --name api-nginx po-test
$ docker exec -it api-nginx /bin/sh
Nginx 및 openrc(서비스 관리) 패키지 설치
$ apk add nginx openrc
Nginx config 설정
$ vi /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
pcre_jit on;
error_log /var/log/nginx/error.log warn;
include /etc/nginx/modules/*.conf;
include /etc/nginx/conf.d/*.conf;
events {
worker_connections 1024;
}
http {
**upstream backend {
server localhost:3001;
server localhost:3002;
}
server {
listen 3000;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}**
include /etc/nginx/mime.types;
default_type application/octet-stream;
server_tokens off;
client_max_body_size 1m;
sendfile on;
tcp_nopush on;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:2m;
ssl_session_timeout 1h;
ssl_session_tickets off;
gzip_vary on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
include /etc/nginx/http.d/*.conf;
}
upstream의 지정 포트 서비스 활성화
$ npm run start (api 인스턴스 실행 시 config의 포트 변경하여 3001, 3002 포트로 실행)
Nginx 서비스 자동 재시작 설정 및 실행
$ rc-update add nginx default
$ rc-service nginx start
5-1. nginx.conf reloading
$ rc-service nginx reload
Nginx 로그
$ less /var/log/nginx/error.log
$ less /var/log/nginx/access.log
# /etc/nginx/nginx.conf
user nginx;
# Set number of worker processes automatically based on number of CPU cores.
**worker_processes auto;
# worker_rlimit_nofile 204800;
# worker_cpu_affinity auto;**
# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;
# Configures default error logger.
error_log /var/log/nginx/error.log warn;
# Includes files with directives to load dynamic modules.
include /etc/nginx/modules/*.conf;
# Include files with config snippets into the root context.
include /etc/nginx/conf.d/*.conf;
events {
# The maximum number of simultaneous connections that can be opened by
# a worker process.
worker_connections 1024;
# multi_accept on;
# use epoll;
}
http {
**limit_req_zone $binary_remote_addr zone=zone_one:10m rate=5r/s;**
# limit_conn_zone $binary_remote_addr zone=perip:10m;
# limit_conn_zone $server_name zone=perserver:10m;
**upstream backend {
ip_hash;
server localhost:3001; # max_fails=1 fail_timeout=10s;
server localhost:3002;
}**
**proxy_cache_path /nginx.cache/data1/cache levels=1:2 keys_zone=my_cache_d1:10m
max_size=1g inactive=1m use_temp_path=off;
proxy_cache_path /nginx.cache/data2/cache levels=1:2 keys_zone=my_cache_d2:10m
max_size=1g inactive=1m use_temp_path=off;
split_clients $request_uri $my_cache {
50% "my_cache_d1";
50% "my_cache_d2";
}**
server {
**listen 3000;**
**# health_check interval=2s fails=2 passes=5 uri=/ match=welcome;**
**location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
access_log off;
expires 1M;
add_header Cache-Control "public";
}**
**location ~* \.(?:css|js)$ {
access_log off;
expires 1y;
add_header Cache-Control "public";
}**
**location / {
limit_req zone=zone_one;
# limit_conn perip 2;
# limit_conn perserver 3;
limit_rate_after 1k;
limit_rate 1k;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# health_check interval=2s fails=2 passes=5 uri=/ match=welcome;
}**
**location /adminWebPerformance/header {
proxy_cache my_cache_d1;
proxy_cache_methods GET HEAD;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args";
# proxy_cache_key "$host$request_uri$cookie_user";
proxy_cache_bypass $cookie_nocache $arg_nocache $http_pragma;
proxy_cache_min_uses 3;
# proxy_cache_lock on;
proxy_cache_valid 200 302 1m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
# cache PURGE
# proxy_cache_purge $purge_method;
proxy_pass http://backend;
}**
}
# match welcome{
# status 200;
# header Content-Type = text/html;
# body ~ "Welcome to nginx!";
# }
# Includes mapping of file name extensions to MIME types of responses
# and defines the default type.
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Name servers used to resolve names of upstream servers into addresses.
# It's also needed when using tcpsocket and udpsocket in Lua modules.
#resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001;
# Don't tell nginx version to the clients. Default is 'on'.
server_tokens off;
# Specifies the maximum accepted body size of a client request, as
# indicated by the request header Content-Length. If the stated content
# length is greater than this size, then the client receives the HTTP
# error code 413. Set to 0 to disable. Default is '1m'.
client_max_body_size 1m;
# Sendfile copies data between one FD and other from within the kernel,
# which is more efficient than read() + write(). Default is off.
sendfile on;
# Causes nginx to attempt to send its HTTP response head in one packet,
# instead of using partial frames. Default is 'off'.
tcp_nopush on;
# Enables the specified protocols. Default is TLSv1 TLSv1.1 TLSv1.2.
# TIP: If you're not obligated to support ancient clients, remove TLSv1.1.
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
# Path of the file with Diffie-Hellman parameters for EDH ciphers.
# TIP: Generate with: `openssl dhparam -out /etc/ssl/nginx/dh2048.pem 2048`
#ssl_dhparam /etc/ssl/nginx/dh2048.pem;
# Specifies that our cipher suits should be preferred over client ciphers.
# Default is 'off'.
ssl_prefer_server_ciphers on;
# Enables a shared SSL cache with size that can hold around 8000 sessions.
# Default is 'none'.
ssl_session_cache shared:SSL:2m;
# Specifies a time during which a client may reuse the session parameters.
# Default is '5m'.
ssl_session_timeout 1h;
# Disable TLS session tickets (they are insecure). Default is 'on'.
ssl_session_tickets off;
# Enable gzipping of responses.
#gzip on;
# Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'.
gzip_vary on;
# Helper variable for proxying websockets.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# Specifies the main log format.
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Sets the path, format, and configuration for a buffered log write.
access_log /var/log/nginx/access.log main;
# Includes virtual hosts configs.
include /etc/nginx/http.d/*.conf;
}