Skip to content

검색 앞에 shim 을 두고 엔진 집합을 명시하며, 문서 읽기는 성인 사이트를 거절한다 - #32

Merged
nam-jaehyun merged 1 commit into
mainfrom
search/shim-and-engine-set
Sep 11, 2026
Merged

nam-jaehyun merged 1 commit into
mainfrom
search/shim-and-engine-set

Conversation

@nam-jaehyun

Copy link
Copy Markdown
Member

수백 명이 동시에 검색할 때 먼저 무너지는 것은 SearXNG 프로세스가 아니라 하나의 아웃바운드 IP 로 yandex 한 곳에 몰리는 구조다. 엔진은 총량이 아니라 순간 동시성에 밴을 걸고, CAPTCHA 한 번에 엔진이 한 시간(Cloudflare 챌린지는 15일) 정지되며 그 정지는 valkey 로 워커 넷이 공유한다. 무관한 결과의 원인도 실측하니 거의 전부 bing 이었다(k8s 질의에 TikTok 로그인, vLLM 질의에 Microsoft 고객지원).

변경

  • services/search-shim(새 서비스): 게이트웨이의 /tools/search 와 deep-research 가 SearXNG 대신 이 shim 을 거친다. JSON·HTML 검색 모두 결과 있는 답을 CACHE_TTL_S(15분) 캐시하고, 동시에 들어온 같은 검색은 upstream 호출 하나로 합치며, SearXNG 로 나가는 동시 검색은 MAX_CONCURRENT_SEARCHES(12)로 묶는다. SearXNG 가 못 답하면 STALE_TTL_S(6시간) 이내의 옛 답을 주고, 없으면 503/502. SearXNG 의 4xx 는 그대로 통과. safesearch=2 를 강제하고 language=ko 는 ko-KR 로 보낸다. 검색어는 DEBUG 에서만 남고 접근 로그는 끈다. /health 에 실행·대기·합침 수와 캐시 크기.
  • services/searxng/settings.yml.example: use_default_settings.engines.keep_only 로 19개만 남긴다. general 은 yandex·brave·wikipedia·openlibrary, news 는 duckduckgo news·bing news·reuters, science 는 google scholar·openalex·semantic scholar·arxiv·pubmed·openaire, it 는 github·stackoverflow·mdn·docker hub·microsoft learn·huggingface. 여섯 가지 정지 시간을 모두 2~10분으로, default_lang 을 ko-KR 로, safe_search 를 2로, 자동완성은 끔. 실측 근거는 파일 주석에.
  • scripts/gen-searxng-config.sh: 예시와 키에서 만든 내용과 다르면 항상 다시 쓴다(--force 는 없앰). setup.sh 는 파일이 바뀌면 searxng 를 재시작한다. 전에는 기존 노드에 새 설정이 도달하지 않았다.
  • services/crawl4ai-shim: StevenBlack/hosts porn-only 목록(커밋 고정)을 이미지에 넣고(adultlist.py) netguard 와 같은 두 지점에서 판정한다. hosts 파일 의미 그대로 나열된 호스트만 막고 www. 만 접는다. fc2.com 이나 www.sex 같은 항목이 블로그 호스트나 최상위 도메인 전체를 막지 않도록. 페이지 주소는 DEBUG 에서만, 경고에는 호스트만, Crawl4AI 진행 표시도 끔.
  • 배선: docker-compose.yml, Caddyfile, build-push-images.sh, publish 워크플로 카탈로그, dependabot, CI 의 pytest 대상, docs/tools.md·env-reference.md·CONTRIBUTING.md.

측정 (운영, 이 네트워크)

항목 결과
첫 검색 / 캐시 적중 2.1s / 0.03s
동일 신규 질의 30개 동시 SearXNG 도달 1회
general 한국어 질의 yandex 15/15, brave 17/20 (자주 정지)
news 한국어 duckduckgo news 22/22, bing news 9/9
science 6개 엔진 모두 10/10
죽은 엔진 google·bing·duckduckgo·naver·startpage·qwant·mojeek·presearch·yep·ask·aol·seznam·karmasearch·yahoo

확인

시험 168개(search-shim 8, adultlist 5 포함), ruff, compose config, CI 이미지 목록 검사 통과. 운영에 배포해 HTML 검색 캐시, 4xx 통과, 반복 파라미터는 SearXNG 와 같이 첫 값, 성인 호스트 거부·fc2 블로그 통과, 로그에 검색어와 주소 0건을 확인했다.

같이 알아둘 것

수백 명이 동시에 검색하면 SearXNG 프로세스가 아니라 하나의 아웃바운드
IP 로 yandex 한 곳에 몰리는 구조가 먼저 무너진다. 엔진은 총량이 아니라
순간 동시성에 밴을 걸고, CAPTCHA 한 번에 엔진이 한 시간(Cloudflare
챌린지는 15일) 정지되며 그 정지는 valkey 로 워커 넷이 공유한다. 무관한
결과의 원인도 실측하니 거의 전부 bing 이었다(k8s 질의에 TikTok 로그인,
vLLM 질의에 Microsoft 고객지원).

- search-shim: 게이트웨이의 /tools/search 와 deep-research 가 SearXNG
  대신 이 shim 을 거친다. JSON·HTML 검색 모두 결과 있는 답을 15분 캐시하고,
  동시에 들어온 같은 검색은 upstream 호출 하나로 합치며, SearXNG 로 나가는
  동시 검색은 12개로 묶는다. SearXNG 가 못 답하면 6시간 이내의 옛 답을
  주고, 없으면 503/502. SearXNG 의 4xx 는 그대로 통과. 30개 동일 질의
  버스트가 SearXNG 에는 1번 닿았다. safesearch=2 를 강제하고 language=ko
  는 ko-KR 로 보낸다(시장·국가를 받는 엔진은 지역이 있어야 한국 결과를
  우선한다). 검색어는 DEBUG 에서만 남고 접근 로그는 끈다.
- SearXNG: use_default_settings.engines.keep_only 로 19개만 남긴다.
  이 네트워크에서 답하고 대학 구성원이 묻는 것만이다. general 은 yandex·
  brave·wikipedia·openlibrary, news 는 duckduckgo news·bing news·reuters,
  science 는 google scholar·openalex·semantic scholar·arxiv·pubmed·
  openaire, it 는 github·stackoverflow·mdn·docker hub·microsoft learn·
  huggingface. 여섯 가지 정지 시간을 모두 2~10분으로, default_lang 을
  ko-KR 로, safe_search 를 2로. 실측 근거는 설정 파일 주석에.
- gen-searxng-config.sh: 예시와 키에서 만든 내용과 다르면 항상 다시
  쓴다(--force 는 없앰). setup.sh 는 파일이 바뀌면 searxng 를 재시작한다.
  전에는 기존 노드에 새 설정이 도달하지 않았다.
- crawl4ai-shim: StevenBlack/hosts porn-only 목록(커밋 고정)을 이미지에
  넣고 netguard 와 같은 두 지점에서 판정한다. hosts 파일 의미 그대로
  나열된 호스트만 막고 www. 만 접는다. fc2.com 이나 www.sex 같은 항목이
  블로그 호스트나 최상위 도메인 전체를 막지 않도록. 페이지 주소는 DEBUG
  에서만, 경고에는 호스트만.

확인: 시험 168개, ruff, compose config, CI 이미지 목록 검사 통과. 라이브
반영 후 캐시 히트 0.03초, HTML 검색도 캐시, 4xx 통과, 반복 파라미터는
SearXNG 와 같이 첫 값, 성인 호스트 거부·fc2 블로그 통과, 로그에 검색어와
주소 0건.
@nam-jaehyun
nam-jaehyun merged commit 6d26cad into main Sep 11, 2026
5 checks passed
@nam-jaehyun
nam-jaehyun deleted the search/shim-and-engine-set branch September 11, 2026 10:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant