개요
1. Caddy란?
- Go로 작성된 오픈소스 웹 서버이다.
- 자동으로 tls 인증서를 발급해주는 기능이 있고 리버스 프록시 설정도 가능하다.
- Caddyfile이 nginx.conf 같은 역할을 한다.
2. Caddy를 쓰게 된 이유
- 상황 상, 굳이 도메인을 살 필요가 없어서 그냥 퍼블릭 ip주소로 쓰고 있다.
- 프론트가 배포를 vercel로 했는데, vercel이나 netlify 같은 것들을 쓰면 무조건 https로만 요청을 할 수 있다.
- ⇒ 따라서, 서버도 무조건 https 통신이 가능해야 한다.
- 공짜로 인증서를 발급받아 쓸 수 있는 방법을 찾아보다 간단하고 가벼운 오픈소스인 Caddy를 선택하게 되었다.
사용 방법
1. EC2에 Caddy 설치
https://caddyserver.com/docs/install#debian-ubuntu-raspbian
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
공식문서에 있는 커맨트를 복붙해서 설치한다.
EC2는 보안그룹에서 443번이 뚫려있어야 한다!
2. caddy.service 파일 수정
다른 블로그 글들을 보면 caddy.service를 만들어주던데 나는 빈 파일이긴 했지만 만들어져 있었다.
sudo vi /etc/systemd/system/caddy.service
들어가서 아래 코드를 그대로 복붙한다.
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
3. Caddyfile 수정
Caddyfile이라는 설정 파일을 수정한다.
기본적으로 생성이 되어있고, 필요없는 부분은 주석처리해주거나 삭제해주면 된다.
sudo vi /etc/caddy/Caddyfile
들어가서 아래 코드를 넣어준다.
{
admin 0.0.0.0:2020
}
ec2 PUBLIC IP주소.nip.io {
tls internal
reverse_proxy localhost:8080
}
나는 다른 것들은 싹 다 없애고 이렇게만 남겨줬다.
원래 admin ~ 이거는 없었는데
Tcp 127.0.0.1:2019: bind: address already in use
한 번 이 에러가 떴어서 추가해줬다.
스프링부트로 만들었기 때문에 8080포트로 포워딩해줬다.
4. Caddy 실행
sudo systemctl daemon-reload
sudo systemctl enable --now caddy
systemctl status -l caddy
sudo caddy start
caddy run은 그냥 실행하는 것이고, caddy start를 해야 백그라운드 모드로 실행된다.
이후 https로 접속이 가능해졌다!
Caddyfile에서 IP주소+nip.io를 해줬기 때문에 https://[ec2 퍼블릭IP].nip.io로 실행이 된다.
5. 스웨거, CORS 설정
https로 띄웠어도 기본적으로 스웨거는 http로 요청을 보내기 때문에 따로 설정을 해줘야 한다.
@OpenAPIDefinition(
info = @Info(title = "FITPET",
description = "큐시즘 Pit a Pat팀 FITPET 기업 프로젝트",
version = "v1"),
servers = {
@Server(url = "https://ip주소.nip.io",
description = "서버 URL"),
}
)
vercel로 띄운 프론트 서버도 CORS 설정을 해준다.
package FITPET.dev.common.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(
"https://localhost:3000",
"http://localhost:3000",
"https://프론트 사이트",
)
.allowedMethods("GET", "POST", "PATCH", "DELETE")
.allowedHeaders("*") // 허용할 헤더
.allowCredentials(true) // 자격 증명 허용
.maxAge(3000);
}
}
728x90
'study > Server' 카테고리의 다른 글
[Database] 데이터베이스 Master-Slave 구조란? (0) | 2024.11.04 |
---|---|
[Gradle] 스프링부트 빌드 시 plain.jar vs .jar 차이점 (0) | 2024.09.24 |
HTTP 응답 헤더, Content-Disposition (0) | 2024.08.01 |
[error] Node.js Error <SyntaxError: Cannot use import statement outside a module> (0) | 2023.11.20 |