서버 운영
Nginx server_name을 정확하게 쓰기
server_name의 작은 실수가 원치 않는 도메인에서 사이트가 보이게 할 수 있다.
server_name이 뭐 하는 역할인가
Nginx는 여러 도메인으로 들어오는 요청을 server_name으로 구분한다.
server {
listen 80;
server_name example.com;
# ...
}
server {
listen 80;
server_name api.example.com;
# ...
}
요청의 Host 헤더와 비교해서 맞는 블록을 선택한다.
정확하지 않으면 생기는 문제
1. WWW 리다이렉트 빠뜨리기
# 이건 example.com만 매칭
server_name example.com;
# www.example.com으로 오는 요청은 매칭 안 됨!
올바른 방법:
server_name example.com www.example.com;
# 또는
server_name example.com *.example.com;
2. Wildcard 사용
# 모든 서브도메인
server_name *.example.com;
# example.com 자체는 매칭 안 됨
# example.com도 포함하려면
server_name example.com *.example.com;
3. Regex 사용
복잡한 패턴은 정규식으로:
# api1.example.com, api2.example.com, ...
server_name ~^api[0-9]+\.example\.com$;
테스트하는 방법
설정을 수정한 후:
sudo nginx -t
실제로 어떤 요청이 매칭되는지 확인:
curl -H "Host: example.com" http://localhost
curl -H "Host: www.example.com" http://localhost
curl -H "Host: api.example.com" http://localhost
기본 서버 블록
일치하는 server_name이 없으면?
# 기본값으로 사용할 서버
server {
listen 80 default_server;
server_name _;
return 444; # 연결 종료
}
예상하지 않은 도메인으로 접근하는 요청을 거부할 수 있다.
실제 설정 예시
프로덕션에서 쓰는 패턴:
server {
listen 80;
listen 443 ssl http2;
# 메인 도메인과 www
server_name example.com www.example.com;
# www 리다이렉트
if ($host ~^ www\.) {
return 301 $scheme://example.com$request_uri;
}
# ...
}
내 실수
과거에 server_name example.com만 쓰다가 www.example.com으로 오는 요청이 기본 서버 블록으로 가서 403이 떴다. 그 이후로는 항상 둘 다 명시한다.