01
nginx 는 하나만 고릅니다.
여러 규칙이 맞더라도 정해진 우선순위에 따라 딱 하나를 선택하고 나머지는 무시합니다. 정확히 일치하는 규칙이 가장 먼저이고, 그다음이 가장 긴 접두사이며, 특정 표시가 붙은 접두사는 뒤의 정규식 검사를 아예 건너뛰게 만듭니다. 그래서 설정 파일에서 아래쪽에 있는 규칙이 위쪽 규칙보다 먼저 적용되는 일이 생깁니다.
웹서버 미니랩
nginx 는 우선순위로 하나를 고르고, Apache 는 맞는 섹션을 전부 합치고, Caddy 는 설정을 먼저 정렬한 뒤 첫 매칭 하나만 실행합니다.
실제 서버를 실행하지 않습니다. 각 서버 공식 문서에 적힌 매칭 규칙만 재현한 교육용 모델입니다.
이 경로가 깨는 오해: “가장 긴 매칭이 이긴다”
우선순위에 따라 location 하나만 고른다
location = /healthz {안 맞음return 200 "ok"location ^~ /static/ {안 맞음root /var/wwwexpires 30dlocation /api/v1/ {후보(짐)proxy_pass http://v1_backendlocation /api/ {후보(짐)proxy_pass http://api_backendlocation ~ \.php$ {적용됨fastcgi_pass php:9000location ~* \.(js|css)$ {검사 안 함expires 7dlocation / {후보(짐)root /var/www/html버튼을 누르면 이 결과에 도달하는 과정을 하나씩 볼 수 있어요.
| 지시어 | 값 | 준 블록 | 합쳐지는 방식 |
|---|---|---|---|
fastcgi_pass | php:9000 | n5 | 선택된 location 의 설정이 그대로 쓰입니다 |
이 데모의 범위 밖: Alias·.htaccess·try_files 재진입·rewrite 이후 재매칭·가상호스트 선택, 그리고 %XX·..·연속 슬래시 정규화. nginx 의 전위 매칭 대소문자는 Linux 기준입니다. Caddy 정렬은 길이가 같은 matcher 의 타이브레이크까지 문서로 확정되지 않아, 이 설정에 대해 caddy adapt(v2.11.4)로 확인한 순서를 그대로 씁니다.
출처 · nginx location · Apache 섹션 병합 · Caddyfile 디렉티브
이 데모에 대하여
경로 하나에 여러 규칙이 걸릴 때 어떤 규칙이 실제로 적용되는지는 서버마다 다릅니다. 이 화면은 같은 요청 경로를 세 서버의 설정에 동시에 넣고, 각 서버가 어떤 규칙을 골랐거나 합쳤는지를 나란히 보여줍니다. 셋의 방식이 근본적으로 다르기 때문에, 한 서버에서 익힌 감각으로 다른 서버 설정을 읽으면 틀리게 됩니다.
01
nginx 는 하나만 고릅니다.
여러 규칙이 맞더라도 정해진 우선순위에 따라 딱 하나를 선택하고 나머지는 무시합니다. 정확히 일치하는 규칙이 가장 먼저이고, 그다음이 가장 긴 접두사이며, 특정 표시가 붙은 접두사는 뒤의 정규식 검사를 아예 건너뛰게 만듭니다. 그래서 설정 파일에서 아래쪽에 있는 규칙이 위쪽 규칙보다 먼저 적용되는 일이 생깁니다.
02
Apache 는 맞는 것을 합칩니다.
하나를 고르는 것이 아니라 조건에 맞는 섹션들을 모두 적용하고 그 내용을 합칩니다. 합치는 순서는 문서에 정해져 있고, 지시어에 따라 나중 값이 앞의 값을 덮어쓰기도 하고 둘이 누적되기도 합니다. 그래서 어떤 설정이 적용됐는지 보려면 한 곳만 보는 것이 아니라 맞는 섹션 전부를 봐야 합니다.
03
Caddy 는 먼저 정렬합니다.
설정을 읽은 뒤 구체적인 경로가 앞에 오도록 정렬하고, 그 순서대로 검사해 처음 맞는 것 하나를 실행합니다. 파일에 적은 순서와 실제 실행 순서가 다를 수 있다는 뜻입니다. 다만 규칙들을 하나로 묶으면 정렬하지 않고 적은 순서를 그대로 지키는데, 이 경우 덜 구체적인 규칙이 먼저 걸릴 수 있습니다.
04
같은 경로에서 결과가 갈립니다.
화면이 세 서버를 한 줄에 놓는 이유는, 같은 경로를 넣었을 때 결과가 서로 다르다는 사실 자체가 이 데모의 내용이기 때문입니다. 하나씩 따로 보여줬다면 각각은 이해되지만 셋이 다르다는 점은 드러나지 않습니다. 설정을 옮겨 갈 때 생기는 사고 대부분이 이 차이를 모른 채 문법만 바꿔 적어서 생깁니다.
05
선택 근거를 함께 표시합니다.
어떤 규칙이 적용됐는지만 보여주면 왜 그것이 선택됐는지 알 수 없습니다. 그래서 각 결과 옆에 그 판단의 근거를 함께 적어 둡니다. 우선순위 때문인지 길이 때문인지 순서 때문인지가 구분되어야, 설정을 고칠 때 무엇을 바꿔야 하는지 정할 수 있습니다.
06
설정 예시는 짧게 유지했습니다.
실제 설정 파일은 훨씬 길지만 화면에서는 비교에 필요한 규칙만 남겼습니다. 규칙이 많아지면 세 서버의 차이보다 설정을 읽는 부담이 커지기 때문입니다. 대신 규칙 사이의 관계는 실제와 같은 구조를 유지해서, 여기서 확인한 순서 규칙이 실제 설정에서도 그대로 적용됩니다.
07
문서에 있는 규칙만 씁니다.
세 서버의 선택 규칙은 추측하거나 실험으로 알아낸 것이 아니라 각 서버의 공식 문서에 적힌 내용을 옮긴 것입니다. 서버 동작은 버전에 따라 달라질 수 있어서, 근거를 문서에 두면 나중에 확인하고 고치기가 쉽습니다. 아래 출처에서 각 규칙의 원문을 볼 수 있습니다.
08
묶는 방식 하나로 순서가 뒤집힙니다.
Caddy 에서 규칙들을 하나로 묶느냐 아니냐에 따라 정렬을 거치는지가 달라집니다. 문법상으로는 감싸는 표시 하나 차이인데 실행 순서가 통째로 바뀝니다. 설정을 고칠 때 이 표시를 무심코 넣거나 빼면 그때부터 다른 규칙이 적용되므로, 세 서버 중 가장 눈에 안 띄면서 결과를 크게 바꾸는 부분입니다.
09
옮겨 적는 것만으로는 안 됩니다.
한 서버의 설정을 다른 서버로 옮길 때 규칙을 하나씩 번역하면 문법은 맞지만 동작이 달라집니다. 고르는 방식과 합치는 방식과 정렬하는 방식이 근본적으로 다르기 때문에, 규칙 하나가 아니라 규칙들 사이의 관계를 다시 설계해야 합니다. 이 화면이 세 서버를 같은 줄에 놓는 것도 그 관계를 비교하라는 뜻입니다.
실제 서버를 돌리지 않습니다.
이 화면은 브라우저 안에서 규칙 선택을 흉내 낼 뿐 실제 웹 서버를 실행하지 않습니다. 그래서 다루는 범위도 경로 매칭 한 가지로 좁습니다. 요청 경로를 정규화하는 단계, 재작성 규칙이 적용된 뒤 매칭이 다시 일어나는 경우, 여러 가상 호스트 중 하나를 고르는 과정, 헤더나 요청 방식에 따른 조건, 상속과 우선순위가 얽히는 복잡한 설정은 다루지 않습니다. 서버 버전과 빌드에 포함된 모듈에 따라 실제 동작이 달라질 수 있으므로, 중요한 설정은 이 화면이 아니라 실제 환경에서 확인해야 합니다. 각 서버가 제공하는 설정 확인 도구나 시험 실행 기능을 쓰면 실제로 어떤 규칙이 적용되는지 직접 볼 수 있습니다. 이 화면은 그 결과를 읽을 때 무엇을 봐야 하는지 익히는 용도입니다.
참고 자료nginx — location 지시어 ↗Apache — 설정 섹션과 적용 순서 ↗Caddy — 요청 매처(matcher) ↗
실험을 마쳤다면