Skip to content
isdnetworks
Go back

내 쪽에서는 보이는데

화면을 고치고 확인했다. 잘 나온다.

안 보인다는 답을 받았다.

Table of contents

Open Table of contents

무엇이 다른지 몰랐다

같은 주소를 열었는데 한쪽은 보이고 한쪽은 안 보인다. 처음에는 새로고침을 해 보라고 답했는데 그래도 안 보인다고 했다.

무엇이 다를 수 있는지 적어 봤다.

브라우저 종류·판
화면 크기
로그인 계정·권한
캐시 상태
접속 경로 (사내망/외부)
서버 (여러 대면 어느 대에 붙었나)

여섯 가지였다. 하나씩 전화로 물어보면 시간이 오래 걸린다.

그리고 묻는 쪽도 무엇부터 물을지 모른다. 여섯 중 어느 것이 걸릴 확률이 높은지가 정해져 있지 않았다.

상태를 화면에 넣었다

확인에 필요한 것을 화면 아래에 작게 표시하게 했다.

<?php if ($this->auth->is_admin()): ?>
<div class="debug-info">
  srv: <?= gethostname() ?> |
  ver: <?= APP_VERSION ?> |
  user: <?= $this->auth->login_id() ?> (<?= $this->auth->role() ?>) |
  built: <?= APP_BUILD_TIME ?>
</div>
<?php endif; ?>

gethostname 으로 어느 서버에 붙었는지와 APP_VERSION 과 로그인 계정과 빌드 시각을 찍는다. is_admin 으로 감쌌으니 일반 사용자에게는 안 보인다.

이제 화면 아래 정보를 알려 달라고 하면 여섯 중 넷이 한 번에 온다. 묻는 쪽도 받는 쪽도 무엇을 볼지 헤매지 않는다.

판 정보가 결정적이었다

실제로 받아 보니 이랬다.

srv: web-02 | ver: 1.4.2 | user: admin_lee (manager) | built: 2017-02-24 18:20

내 쪽은 ver: 1.4.3 이었다. 서버 두 대 중 한 대만 배포가 돼 있었다.

web-01  1.4.3  ← 배포됨
web-02  1.4.2  ← 안 됨

앞단이 요청을 나눠 보내니 어느 대에 붙느냐에 따라 보이는 것이 갈린다. 같은 주소를 열어도 뒤에 있는 것이 다른 셈이다.

배포가 절반만 됐다는 것을 화면 한 줄로 알았다. 이것이 없었으면 브라우저부터 의심하며 한참을 돌았을 것이다.

조치 — 하나라도 실패하면 전체 실패

왜 한 대만 됐는지 배포 스크립트를 봤다.

for h in web-01 web-02; do
  deploy "$h" || echo "실패: $h"
done

deploy 가 실패하면 한 줄 찍고 다음으로 넘어간다. 마지막에 전체 결과를 보지 않으므로 종료 코드도 0이다.

FAILED=""
for h in web-01 web-02; do
  deploy "$h" || FAILED="$FAILED $h"
done

if [ -n "$FAILED" ]; then
  echo "배포 실패:$FAILED"
  exit 1
fi

실패한 호스트를 FAILED 에 모아 두고 하나라도 있으면 exit 1 한다. 부분 성공을 성공으로 세지 않는다.

절반만 배포된 상태는 배포 전보다 나쁘다. 어느 사용자가 어느 판을 보는지가 요청마다 달라지기 때문이다.

검증 — 배포 후 판 대조

스크립트가 성공했다는 것과 각 대에 그것이 올라갔다는 것은 다른 말이다. 그래서 되읽어 확인하게 했다.

EXPECTED=$(cat VERSION)
for h in web-01 web-02; do
  V=$(curl -s "http://${h}/version.txt")
  if [ "$V" != "$EXPECTED" ]; then
    echo "판 불일치 ${h}: ${V} (기대 ${EXPECTED})"
    exit 1
  fi
done
echo "전 서버 판 일치: ${EXPECTED}"

배포에 쓴 경로가 아니라 curl 로 서비스 주소를 열어 version.txt 를 읽는다. 사용자가 보는 것과 같은 길로 되읽는 것이다.

캐시도 확인 항목에 넣었다

판이 같은데도 안 보이는 경우가 그 뒤에 있었다. 브라우저가 옛 파일을 들고 있었다.

<script src="/js/app.js?v=<?= APP_VERSION ?>"></script>

app.js 뒤에 APP_VERSION 을 붙여 판이 바뀌면 주소가 달라지게 했다. 주소가 다르면 브라우저가 새로 받는다.

사용자에게 강제 새로고침을 부탁하지 않아도 된다. 부탁해도 제대로 되는지 확인할 방법이 없는 종류의 일이었다.

전체 흐름 — 확인 순서

안 보인다는 보고를 받았을 때 볼 순서를 정했다.

1. 화면 아래 정보를 받는다 (서버, 판, 계정, 빌드 시각)
2. 판이 다르면 배포 확인
3. 판이 같으면 계정 권한 확인
4. 권한이 맞으면 캐시 (강제 새로고침 요청)
5. 그래도 안 되면 화면 크기·브라우저 확인

첫째에서 대부분 갈렸다. 넷을 한 번에 받으니 둘째와 셋째로 바로 넘어간다.

순서가 없으면 매번 처음부터 무엇을 물을지 생각하게 된다. 정해 두면 보고를 받은 사람이 누구든 같은 길로 좁힌다.

정리


Share this post on:

Previous Post
흐름표가 말하지 않은 것
Next Post
매칭의 결말이 셋이었다