웹서버 미니랩

같은 경로, 세 서버가 고르는 블록은 다릅니다

nginx 는 우선순위로 하나를 고르고, Apache 는 맞는 섹션을 전부 합치고, Caddy 는 설정을 먼저 정렬한 뒤 첫 매칭 하나만 실행합니다.

실제 서버를 실행하지 않습니다. 각 서버 공식 문서에 적힌 매칭 규칙만 재현한 교육용 모델입니다.

이 경로가 깨는 오해: “가장 긴 매칭이 이긴다”

nginx선택

우선순위에 따라 location 하나만 고른다

  1. location = /healthz {안 맞음
    • return 200 "ok"
  2. location ^~ /static/ {안 맞음
    • root /var/www
    • expires 30d
  3. location /api/v1/ {후보(짐)
    • proxy_pass http://v1_backend
  4. location /api/ {후보(짐)
    • proxy_pass http://api_backend
  5. location ~ \.php$ {적용됨
    • fastcgi_pass php:9000
  6. location ~* \.(js|css)$ {검사 안 함
    • expires 7d
  7. location / {후보(짐)
    • root /var/www/html
결과부터 보는 중

버튼을 누르면 이 결과에 도달하는 과정을 하나씩 볼 수 있어요.

최종 적용되는 설정

지시어준 블록합쳐지는 방식
fastcgi_passphp:9000n5선택된 location 의 설정이 그대로 쓰입니다

이 데모의 범위 밖: Alias·.htaccess·try_files 재진입·rewrite 이후 재매칭·가상호스트 선택, 그리고 %XX·..·연속 슬래시 정규화. nginx 의 전위 매칭 대소문자는 Linux 기준입니다. Caddy 정렬은 길이가 같은 matcher 의 타이브레이크까지 문서로 확정되지 않아, 이 설정에 대해 caddy adapt(v2.11.4)로 확인한 순서를 그대로 씁니다.

출처 · nginx location · Apache 섹션 병합 · Caddyfile 디렉티브

이 데모에 대하여

같은 요청을 세 서버 설정에 동시에 넣습니다

경로 하나에 여러 규칙이 걸릴 때 어떤 규칙이 실제로 적용되는지는 서버마다 다릅니다. 이 화면은 같은 요청 경로를 세 서버의 설정에 동시에 넣고, 각 서버가 어떤 규칙을 골랐거나 합쳤는지를 나란히 보여줍니다. 셋의 방식이 근본적으로 다르기 때문에, 한 서버에서 익힌 감각으로 다른 서버 설정을 읽으면 틀리게 됩니다.

  1. 요청 경로를 하나 골라 세 서버의 결과를 나란히 봅니다.
  2. nginx 쪽에서 최종적으로 선택된 블록이 하나뿐인지 확인합니다.
  3. Apache 쪽에서는 여러 섹션이 함께 적용되는지 봅니다.
  4. Caddy 쪽에서 규칙이 어떤 순서로 정렬됐는지 확인합니다.
  5. 경로를 바꿔 세 결과가 각각 어떻게 달라지는지 비교합니다.
  6. 정규식 규칙이 있는 경로를 넣어 우선순위가 어떻게 바뀌는지 봅니다.
  7. 가장 긴 접두사와 정확히 일치하는 규칙이 함께 있을 때의 결과를 확인합니다.
  8. 세 서버 중 어느 것이 설정 파일 순서를 그대로 따르는지 정리합니다.
  9. 각 결과 옆의 선택 근거를 읽고 판단 기준이 무엇인지 확인합니다.
  10. 같은 경로에서 세 서버의 결과가 모두 다른 경우를 찾아봅니다.
  11. 규칙을 묶었을 때와 아닐 때의 차이를 Caddy 쪽에서 확인합니다.
  12. Apache 쪽에서 합쳐진 지시어가 몇 개인지 세어 봅니다.
  13. nginx 쪽에서 선택되지 않고 무시된 규칙이 무엇인지 확인합니다.

세 서버의 방식이 다릅니다

01

nginx 는 하나만 고릅니다.

여러 규칙이 맞더라도 정해진 우선순위에 따라 딱 하나를 선택하고 나머지는 무시합니다. 정확히 일치하는 규칙이 가장 먼저이고, 그다음이 가장 긴 접두사이며, 특정 표시가 붙은 접두사는 뒤의 정규식 검사를 아예 건너뛰게 만듭니다. 그래서 설정 파일에서 아래쪽에 있는 규칙이 위쪽 규칙보다 먼저 적용되는 일이 생깁니다.

02

Apache 는 맞는 것을 합칩니다.

하나를 고르는 것이 아니라 조건에 맞는 섹션들을 모두 적용하고 그 내용을 합칩니다. 합치는 순서는 문서에 정해져 있고, 지시어에 따라 나중 값이 앞의 값을 덮어쓰기도 하고 둘이 누적되기도 합니다. 그래서 어떤 설정이 적용됐는지 보려면 한 곳만 보는 것이 아니라 맞는 섹션 전부를 봐야 합니다.

03

Caddy 는 먼저 정렬합니다.

설정을 읽은 뒤 구체적인 경로가 앞에 오도록 정렬하고, 그 순서대로 검사해 처음 맞는 것 하나를 실행합니다. 파일에 적은 순서와 실제 실행 순서가 다를 수 있다는 뜻입니다. 다만 규칙들을 하나로 묶으면 정렬하지 않고 적은 순서를 그대로 지키는데, 이 경우 덜 구체적인 규칙이 먼저 걸릴 수 있습니다.

04

같은 경로에서 결과가 갈립니다.

화면이 세 서버를 한 줄에 놓는 이유는, 같은 경로를 넣었을 때 결과가 서로 다르다는 사실 자체가 이 데모의 내용이기 때문입니다. 하나씩 따로 보여줬다면 각각은 이해되지만 셋이 다르다는 점은 드러나지 않습니다. 설정을 옮겨 갈 때 생기는 사고 대부분이 이 차이를 모른 채 문법만 바꿔 적어서 생깁니다.

05

선택 근거를 함께 표시합니다.

어떤 규칙이 적용됐는지만 보여주면 왜 그것이 선택됐는지 알 수 없습니다. 그래서 각 결과 옆에 그 판단의 근거를 함께 적어 둡니다. 우선순위 때문인지 길이 때문인지 순서 때문인지가 구분되어야, 설정을 고칠 때 무엇을 바꿔야 하는지 정할 수 있습니다.

06

설정 예시는 짧게 유지했습니다.

실제 설정 파일은 훨씬 길지만 화면에서는 비교에 필요한 규칙만 남겼습니다. 규칙이 많아지면 세 서버의 차이보다 설정을 읽는 부담이 커지기 때문입니다. 대신 규칙 사이의 관계는 실제와 같은 구조를 유지해서, 여기서 확인한 순서 규칙이 실제 설정에서도 그대로 적용됩니다.

07

문서에 있는 규칙만 씁니다.

세 서버의 선택 규칙은 추측하거나 실험으로 알아낸 것이 아니라 각 서버의 공식 문서에 적힌 내용을 옮긴 것입니다. 서버 동작은 버전에 따라 달라질 수 있어서, 근거를 문서에 두면 나중에 확인하고 고치기가 쉽습니다. 아래 출처에서 각 규칙의 원문을 볼 수 있습니다.

08

묶는 방식 하나로 순서가 뒤집힙니다.

Caddy 에서 규칙들을 하나로 묶느냐 아니냐에 따라 정렬을 거치는지가 달라집니다. 문법상으로는 감싸는 표시 하나 차이인데 실행 순서가 통째로 바뀝니다. 설정을 고칠 때 이 표시를 무심코 넣거나 빼면 그때부터 다른 규칙이 적용되므로, 세 서버 중 가장 눈에 안 띄면서 결과를 크게 바꾸는 부분입니다.

09

옮겨 적는 것만으로는 안 됩니다.

한 서버의 설정을 다른 서버로 옮길 때 규칙을 하나씩 번역하면 문법은 맞지만 동작이 달라집니다. 고르는 방식과 합치는 방식과 정렬하는 방식이 근본적으로 다르기 때문에, 규칙 하나가 아니라 규칙들 사이의 관계를 다시 설계해야 합니다. 이 화면이 세 서버를 같은 줄에 놓는 것도 그 관계를 비교하라는 뜻입니다.

실제 서버를 돌리지 않습니다.

이 화면은 브라우저 안에서 규칙 선택을 흉내 낼 뿐 실제 웹 서버를 실행하지 않습니다. 그래서 다루는 범위도 경로 매칭 한 가지로 좁습니다. 요청 경로를 정규화하는 단계, 재작성 규칙이 적용된 뒤 매칭이 다시 일어나는 경우, 여러 가상 호스트 중 하나를 고르는 과정, 헤더나 요청 방식에 따른 조건, 상속과 우선순위가 얽히는 복잡한 설정은 다루지 않습니다. 서버 버전과 빌드에 포함된 모듈에 따라 실제 동작이 달라질 수 있으므로, 중요한 설정은 이 화면이 아니라 실제 환경에서 확인해야 합니다. 각 서버가 제공하는 설정 확인 도구나 시험 실행 기능을 쓰면 실제로 어떤 규칙이 적용되는지 직접 볼 수 있습니다. 이 화면은 그 결과를 읽을 때 무엇을 봐야 하는지 익히는 용도입니다.

참고 자료nginx — location 지시어Apache — 설정 섹션과 적용 순서Caddy — 요청 매처(matcher)

실험을 마쳤다면