Skip to content

Latest commit

Β 

History

History
269 lines (191 loc) Β· 12.2 KB

nginx.md

File metadata and controls

269 lines (191 loc) Β· 12.2 KB

Nginx

Nginx λŠ” λ­”κ°€μš”

  • μ•„νŒŒμΉ˜μ™€ λ”λΆˆμ–΄ κ°€μž₯ 많이 μ“°μ΄λŠ” μ›Ή μ„œλ²„ 이닀.
  • μ•„νŒŒμΉ˜μ™€ λ‹€λ₯΄κ²Œ μš”μ²­μ— 응닡할 λ•Œ Event Driven λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— 적은 수의 μŠ€λ ˆλ“œλ‘œλ„ 효율적인 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€κ³  ν•œλ‹€.
  • μŠ€λ ˆλ“œλ₯Ό 많이 μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— context switching λΉ„μš©μ΄ 적고 CPU μ†Œλͺ¨μ μ΄μ§€ μ•Šλ‹€.
  • 주둜 정적 νŒŒμΌμ„ μ„œλΉ„μŠ€ν•˜λŠ”λ° 쓰이고 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ‘œμ¨μ˜ 역할도 μˆ˜ν–‰ν•  수 μžˆλ‹€.

Reverse Proxy

  • forward proxy λŠ” client λ₯Ό server 둜 λΆ€ν„° μˆ¨κ²¨μ£ΌλŠ” 역할을 ν•œλ‹€. μˆ¨κ²¨μ£ΌλŠ”κ²Œ λ³Έμ—°μ˜ 역할은 μ•„λ‹Œκ²ƒ κ°™μ§€λ§Œ.. client λ₯Ό ν•œλ° λͺ¨μ•„μ„œ μš”μ²­μ„ μ²˜λ¦¬ν•΄μ£ΌλŠ” λŠλ‚Œμ΄λ‹€.
  • reverse proxy λŠ” λ‹€λ₯Έ μ„œλ²„μ˜ 정보λ₯Ό ν”„λ‘μ‹œλ₯Ό 톡해 λ°›μ•„μ˜€λŠ” λΆ€λ₯˜μ˜ ν”„λ‘μ‹œλ₯Ό λ§ν•˜λ©°, Client κ°€ μš”μ²­ν•˜λŠ” End point λŠ” μ‹€μ œ μ„œλ²„ μ£Όμ†Œκ°€ μ•„λ‹Œ reverse proxy 의 μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€κ²Œ 된고 μ„œλ²„μ˜ 문지기 같은 λŠλ‚ŒμœΌλ‘œ μ‘΄μž¬ν•œλ‹€.
  • 이λ₯Ό 톡해 load balancing μ΄λ‚˜ 캐싱, λ³΄μ•ˆμƒμ˜ 이유둜 (μ„œλ²„ λ…ΈμΆœ ν•˜μ§€ μ•ŠμŒ) μ‚¬μš©λ  수 μžˆλ‹€.
  • λ°‘μ˜ 그림을 보면 인터넷에 μ•žμ— μžˆλƒ 뒀에 μžˆλƒμ— 따라 μ‰½κ²Œ ꡬ뢄할 수 μžˆλ‹€. forward-proxy reverse-proxy

KakioTalk 에 Reverse Proxy 의 μ—­ν• ?

KakioTalk 은 μ›λž˜ Client λŠ” github pages 둜 , μ„œλ²„λŠ” google cloud build 둜 μžλ™λ°°ν¬κ°€ λ‚˜κ°€κ³  μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ 기술적인 μ—¬λŸ¬ 문제둜.. google cloud build λŠ” λœμ–΄λ‚΄κ³  μˆ˜λ™λ°°ν¬λ‘œ κ°€κΈ°λ‘œ κ²°μ •.

κ·Έλž˜μ„œ pm2 둜 μ„œλ²„μ—μ„œ λ„μ›Œλ΄€λ”λ‹ˆ Mixed Content μ—λŸ¬κ°€ λœ¨λ©΄μ„œ μ„œλ²„λ‘œ λΆ€ν„° 데이터λ₯Ό λ°›μ•„μ˜¬ 수 μ—†μ—ˆλ‹€. λ³΄μ•ˆμƒμ˜ 이유둜 https μ—μ„œ http 의 μš”μ²­μ„ κΈˆμ§€ν•˜κ³  μžˆμ–΄μ„œ μ„œλ²„λ„ https 톡신을 λ§Œλ“€μ–΄ μ€˜μ•Όν–ˆλ‹€.

일단 domain 이 ν•„μš”, κ°€λΉ„μ•„μ—μ„œ 1500 원 짜리 kakio.site ꡬ맀 ν›„ server ip μ—°κ²°.

https λ₯Ό μœ„ν•΄μ„œλŠ” 일단 μΈμ¦μ„œκ°€ ν•„μš”ν•œλ° 돈이 μ—†μœΌλ‹ˆ 일단 무료 μ„œλΉ„μŠ€μΈ lets encrypt λ₯Ό μ΄μš©ν•œλ‹€.

λ³΅μž‘ν•΄ λ³΄μ΄μ§€λ§Œ 이미 certbot μ΄λΌλŠ” 라이브러리λ₯Ό λ‹€ λ§Œλ“€μ–΄ λ†”μ„œ μ‹€ν–‰λ§Œ ν•΄μ£Όλ©΄ λœλ‹€. - μ°Έμ‘°

1λ…„ λ§ˆλ‹€ μžλ™μœΌλ‘œ κ°±μ‹ κΉŒμ§€ ν•΄μ€€λ‹€κ³  ν•œλ‹€.

KakioTalk 은 기본적으둜 ν•˜λ‚˜μ˜ μ„œλ²„λ§Œ κ΅¬λ™ν•œλ‹€. ν•˜μ§€λ§Œ 역할을 보면 λ‘κ°œλ‘œ λ‚˜λˆŒ 수 μžˆλŠ”λ° api server 와 socket server 이닀. 맀우 λ°”μœ μ„œλΉ„μŠ€μ˜ κ²½μš°λŠ” 각각 λΆ„λ¦¬ν•˜λŠ” 것 같은데 μš°λ¦¬μ„œλΉ„μŠ€λŠ” 사싀 μ΄μš©μžκ°€ μ—†λ‹€κ³  봐도 λ¬΄λ°©ν•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ node μ„œλ²„λ§Œ μ‚¬μš©ν•˜λ„λ‘ ν–ˆλ‹€.

개인 PC μ—μ„œ μž‘μ—…ν•  λ•ŒλŠ” localhost 둜 μš”μ²­μ„ 보내면 μ•Œμ•„μ„œ λ°›μ•„μ£Όμ§€λ§Œ μ„œλ²„λ‘œ 배포λ₯Ό ν–ˆμ„ λ–„λŠ” Nginx λ₯Ό 타고 λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ— Nginx κ°€ Reverse Proxy 의 역할을 μˆ˜ν–‰ν•΄μ„œ socket μš”μ²­μΈ 것과 μ•„λ‹Œκ²ƒ (api μš”μ²­) 을 뢄리해쀀닀. 사싀 μ΄λŸ°κ²ƒλ„ reverse proxy 라고 λΆ€λ₯΄λŠ”μ§€λŠ” λͺ¨λ₯΄κ² λ‹€. μ–΄μ¨Œλ“  connection 을 λΆ„λ¦¬ν•΄μ£Όλ‹ˆκΉŒ reverse proxy 라고 μƒκ°ν•˜κΈ°λ‘œ ν–ˆλ‹€.

Nginx

보톡 domain λ³„λ‘œ μ„€μ •νŒŒμΌμ„ /sites-available 에 ν•˜λ‚˜μ”© λ§Œλ“€μ–΄μ„œ κ΄€λ¦¬ν•œλ‹€κ³  ν•œλ‹€.

밑에 각 섀정듀을 주저리 주저리 μ¨λ†¨μ§€λ§Œ 잘 λͺ¨λ₯Έλ‹€. λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— μ€‘μš”ν•œ 뢀뢄은 밑에 μžˆλŠ”κ²Œ λ‹€μž„. λΆ€λ„λŸ½μ§€λ§Œ 뭐가 μ–΄λ–€ μ˜λ―ΈμΈμ§€ 잘λͺ¨λ¦„.. 검색해도 잘 μ•ˆλ‚˜μ˜€μ§€λ§Œ 일단 λ™μž‘ν•œλ‹€. λ‚˜μ€‘μ— μ•Œμ•„λ³΄κ³  주석 해놔야지

# /sites-avaliable/kakio.site
server{
  server_name kakio.site www.kakio.site;

  # @#$@#4.io μ•„λ‹Œ λͺ¨λ“  μš”μ²­μ€ μ—¬κΈ°μ„œ 처리
  location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;

    proxy_pass http://localhost:3050/; // api server μ£Όμ†Œ
  }
  
  # !@#.io 둜 λλ‚˜λŠ” μš”μ²­μ„ μ—¬κΈ°μ„œ 처리
  location ~* \.io {
          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 false;

          proxy_pass http://localhost:3050; // socket server μ£Όμ†Œ 
          proxy_redirect off;

          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
  }
}

μ„€μ •νŒŒμΌ μ„€λͺ…

  • κΈ°λ³Έ μ„€μ •νŒŒμΌ κ²½λ‘œλŠ” /etc/nginx/nginx/conf 에 μœ„μΉ˜ν•˜κ³  μ „μ—­ μ„€μ •νŒŒμΌμ΄λΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.
# 이 섀정은 worker processκ°€ rootκΆŒν•œμœΌλ‘œ μ‹€ν–‰λ˜κ²Œ ν•œλ‹€. 파일 μ‹œμŠ€ν…œμ˜ λͺ¨λ“  κΆŒν•œμ„ μ–»κ²Œλ˜λ―€λ‘œ λ³΄μ•ˆμƒ μœ„ν—˜ν•˜λ‹€.
user root;
# μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λŠ” CPU core μˆ˜μ— 따라 μ„€μ •ν•΄μ•Όν•œλ‹€. nginxλŠ” κ·Έ μ΄μƒμ˜ 이득을 μ£Όμ§€λŠ” μ•ŠλŠ”λ‹€.
# 기본값은 1μ΄μ§€λ§Œ CPUκ°€ 2κ°œμ΄μƒμ˜ μ½”μ–΄λ₯Ό κ°–λŠ”λ‹€λ©΄ 이 값을 μ¦κ°€μ‹œν‚€λ„λ‘ ꢌμž₯ν•œλ‹€.
# auto - μžλ™μ μœΌλ‘œ κ³„μ‚°ν•œλ‹€.
worker_processes auto; 
pid /run/nginx.pid;


# μ—°κ²° μ²˜λ¦¬μ— 영ν–₯μ„μ£ΌλŠ” μ§€μ‹œλ¬Έμ΄ μ§€μ •λ˜λŠ” ꡬ성 파일 μ»¨ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•œλ‹€.
events {
  # μ›Œμ»€ ν•˜λ‚˜κ°€ λͺ‡λͺ…μ˜ μœ μ €κ°€ μ„œλΉ„μŠ€λ₯Ό 할지 κ²°μ •ν•œλ‹€.
  # max clients = worker_connections * worker_processes
  # max clients λŠ” μ‹œμŠ€ν…œμ—μ„œ μ—°κ²°κ°€λŠ₯ν•œ μ†ŒμΌ“ κ°œμˆ˜μ— 따라 μ œν•œν•œλ‹€. (~64k)
 	worker_connections 1024;
	# multi_accept on;
  
  # ν…ŒμŠ€νŒ… ν™˜κ²½μ„ μœ„ν•΄ 각 μŠ€λ ˆλ“œλ§ˆλ‹€ λ§Žμ€ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ„œλΉ„μŠ€ν•˜λ„λ‘ μ΅œμ ν™”ν•œλ‹€.
  # use epoll;
  
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# Nginx의 버전을 μˆ¨κΈΈκ²ƒμΈκ°€μ— λŒ€ν•œ μ˜΅μ…˜μ΄λ‹€. λ³΄μ•ˆμƒ 주석을 μ œκ±°ν•˜μ—¬ μ„€μ •ν•˜λŠ” 것이 μ’‹λ‹€.
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

  # include λŠ” 이름 κ·ΈλŒ€λ‘œ νŠΉμ • νŒŒμΌμ„ ν¬ν•¨μ‹œν‚€λŠ” 역할을 ν•œλ‹€.
  # include μ§€μ‹œμ–΄κ°€ μžˆλŠ” μœ„μΉ˜μ— ν•΄λ‹Ή 파일의 λ‚΄μš©μ„ μ‚½μž…ν•œλ‹€.
	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

  # μ°Έμ‘° 1에 λ”°λ₯΄λ©΄ HDD에 λŒ€ν•œ I/O μ„±λŠ₯을 높이기 μœ„ν•΄ off ν•  μˆ˜λ„ μžˆλ‹€.
  # ex) off;
  access_log /var/log/nginx/access.log;
  
  # μ—λŸ¬ 둜그 νŒŒμΌμ„ μ €μž₯ν•  μœ„μΉ˜
  # μ°Έμ‘° 1에 λ”°λ₯΄λ©΄ 끝에 crit μ˜΅μ…˜μ„ μ£Όμ–΄μ„œ μ„±λŠ₯을 높일 수 μžˆλ‹€κ³  ν•œλ‹€.
  # ex) error_log /var/log/nginx/error.log crit;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  # 응닡이 μ—†λŠ” clientμ™€μ˜ 연결을 λŠλŠ” 것을 ν—ˆμš©ν•¨μœΌλ‘œμ¨ 이λ₯Όν†΅ν•΄ λ©”λͺ¨λ¦¬λ₯Ό λΉ„μšΈ 수 μžˆλ‹€.
  reset_timedout_connection on;
  
  # request timed out -- default 60
  # μ°Έμ‘° 1에 μ˜ν•˜λ©΄ 10
  client_body_timeout 60;
  
  
  # μ„œλ²„λŠ” 이 μ‹œκ°„ν›„μ— 컀λ„₯μ…˜μ„ μ’…λ£Œν•¨ -- κΈ°λ³Έκ°’ 75
  keepalive_timeout 30;
  
	##
	# Virtual Host Configs
	##

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

Nginx 의 μ„€μ •νŒŒμΌμ€ 크게 4가지 μ§€μ‹œμ–΄λΈ”λ‘μ„ 가지고 μžˆλ‹€.

http 블둝

http 블둝은 이후에 μ†Œκ°œν•  server, location의 루트 블둝이라고 ν•  수 있고, μ—¬κΈ°μ„œ μ„€μ •λœ 값을 ν•˜μœ„ 블둝듀은 μƒμ†ν•œλ‹€. http 블둝은 μ—¬λŸ¬κ°œλ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ κ΄€λ¦¬μƒμ˜ 이슈둜 ν•œλ²ˆλ§Œ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

http, server, location 블둝은 계측ꡬ쑰λ₯Ό 가지고 μžˆλ‹€. λ§Žμ€ μ§€μ‹œμ–΄κ°€ 각각의 λΈ”λ‘μ—μ„œ λ™μ‹œμ— μ‚¬μš©ν•  수 μžˆλŠ”λ°, http의 λ‚΄μš©μ€ server의 기본값이 되고, server의 μ§€μ‹œμ–΄λŠ” location의 기본값이 λœλ‹€. 그리고 ν•˜μœ„μ˜ λΈ”λ‘μ—μ„œ μ„ μ–Έλœ μ§€μ‹œμ–΄λŠ” μƒμœ„μ˜ 선언을 λ¬΄μ‹œν•˜κ³  μ μš©λœλ‹€.

server 블둝

server 블둝은 ν•˜λ‚˜μ˜ μ›Ήμ‚¬μ΄νŠΈλ₯Ό μ„ μ–Έν•˜λŠ”λ° μ‚¬μš©λœλ‹€. 가상 ν˜ΈμŠ€νŒ…(Virtual Host)의 κ°œλ…μ΄λ‹€. 예λ₯Όλ“€μ–΄ ν•˜λ‚˜μ˜ μ„œλ²„λ‘œ http://opentutorials.org κ³Ό http://egoing.net 을 λ™μ‹œμ— μš΄μ˜ν•˜κ³  싢은 경우 μ‚¬μš©ν•  수 μžˆλŠ” 방법이닀. 가상 ν˜ΈμŠ€νŒ…μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 가상 ν˜ΈμŠ€νŒ… μˆ˜μ—…μ„ μ°Έκ³ ν•˜μž.

location 블둝

location 블둝은 server 블둝 μ•ˆμ— λ“±μž₯ν•˜λ©΄μ„œ νŠΉμ • URL을 μ²˜λ¦¬ν•˜λŠ” 방법을 μ •μ˜ν•œλ‹€. 이λ₯Όν…Œλ©΄ http://opentutorials.org/course/1 κ³Ό http://opentutorials.org/module/1 둜 μ ‘κ·Όν•˜λŠ” μš”μ²­μ„ λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.

events 블둝

이벀트 블둝은 주둜 λ„€νŠΈμ›Œν¬μ˜ λ™μž‘λ°©λ²•κ³Ό κ΄€λ ¨λœ 섀정값을 가진닀. 이벀트 λΈ”λ‘μ˜ μ§€μ‹œμ–΄λ“€μ€ 이벀트 λΈ”λ‘μ—μ„œλ§Œ μ‚¬μš©ν•  수 있고, http, server, locationμ™€λŠ” 상속관계λ₯Ό 갖지 μ•ŠλŠ”λ‹€. 이벀트 λͺ¨λ“ˆ μ§€μ‹œμ–΄μ— λŒ€ν•œ μ„€λͺ…은 이벀트 λͺ¨λ“ˆ μ§€μ‹œμ–΄ 사전을 μ°Έκ³ ν•œλ‹€.

λͺ…λ Ήμ–΄

ubuntu 18.04.4 LTS 기쀀이닀.

  • μž¬μ‹œμž‘
systemctl restart nginx
  • config ν…ŒμŠ€νŠΈ μ œλŒ€λ‘œ μ„€μ •λ˜μ—ˆλŠ”μ§€ 확인해 λ³Ό 수 μžˆλ‹€. (문법 검사)
nginx -t
/etc/init.d/nginx configtest
  • symbolic link 생성

μ™œκ·ΈλŸ°μ§„ λͺ¨λ₯΄κ² μ§€λ§Œ sites-available μ—μ„œ μž‘μ„±ν•˜κ³  symbolic link λ₯Ό sites-enabled 폴더에 μƒμ„±ν•΄μ„œ 섀정을 μ—°κ²°ν•œλ‹€.

ln -s /etc/nginx/sites-available/kakio.site /etc/nginx/sites-enabled
  • 둜그
# Nginx의 였λ₯˜ 둜그 μ‹€μ‹œκ°„ 확인
tail -f /var/log/nginx/error.log
# Nginx의 μ„œλ²„ μ ‘κ·Ό 기둝 μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§
tail -f  /var/log/nginx/access.log

μ§€μ‹œμ–΄

λ¬Έμžμ—΄

  • μ§€μ‹œμ–΄ κ°’μœΌλ‘œ μ‚¬μš©λ˜λŠ” λ¬Έμžμ—΄μ€ 세가지 ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚˜λŠ”λ°, μš°μ„  λ”°μ˜΄ν‘œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ¬Έμžμ—΄μ„ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
root    /home/example.com/www;
  • ν•˜μ§€λ§Œ, 곡백 문자(""), μ„Έλ―Έμ½œλ‘ (;), μ€‘κ΄„ν˜Έ({}) 같은 특수 문자λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ μž‘μ€ λ”°μ˜΄ν‘œλ‚˜ ν°λ”°μ˜΄ν‘œ μ•ˆμ— μ§€μ‹œμ–΄ 값을 λ„£μ–΄μ•Ό ν•œλ‹€.
root    '/home/example.com/my web pages';

μ—λŸ¬λ‘œκ·Έ

κ°€μž₯ μƒμ„Έν•œ 둜그 λ ˆλ²¨λΆ€ν„° μ°¨λ‘€λ‘œ debug, info, notice, warn, error, critκ°€ λ©λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜, HTTP μ„œλ²„, 가상 호슀트, 가상 호슀트 디렉토리 각각에 λŒ€ν•΄ λ‹€λ₯Έ 레벨둜 μ—λŸ¬ 둜그λ₯Ό μ„€μ •ν•  수 μžˆλ‹€.

둜그 좜λ ₯ λ°©ν–₯을 /dev/null둜 μ „ν™˜ν•˜λ©΄ μ—λŸ¬ 둜그λ₯Ό ν•΄μ œν•˜λŠ” 것과 같은 효과λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. ν™˜κ²½ μ„€μ • 파일의 루트 뢀뢄에 λ‹€μŒμ˜ μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•œλ‹€.

error_log {file_path} {level}
# ex) error_log /var/log/nginx/access.log;
# ex) error_log /var/log/nginx/access.log crit;
# ex) error_log /dev/null crit; # μ—λŸ¬ 둜그 ν•΄μ œ

References

  1. NGINX Tuning For Best Performance
  2. Nginx κΈ°λ³Έ ν™˜κ²½ μ„€μ •
  3. 가상 호슀트
  4. symbolic link
  5. μ˜€ν”ˆ νŠœν† λ¦¬μ–ΌμŠ€
  6. Naver D2
  7. Google Web - Mixed content
  8. lets encrypt
  9. https://velog.io/@pinot/Ubuntu-18.04%EC%97%90%EC%84%9C-Lets-Encrypt%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-Nginx%EC%97%90-SSL%EC%9D%84-%EC%A0%81%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
  10. https://victorydntmd.tistory.com/231