나스에 워드프레스 올려 블로그 만들기 — 막혔던 세 지점

이 블로그는 집에 있는 시놀로지 나스에서 돌아간다. 호스팅을 안 쓰고 직접 올렸는데, 그 과정에서 몇 번 막혔다.

검색해보면 “도커로 워드프레스 설치하기” 글은 많다. 그런데 설치 다음부터가 진짜 문제였다. 도메인은 연결했는데 접속이 안 되고, 브라우저 캐시 때문에 며칠을 헤매고, 다국어 붙이니 영문 주소가 404가 났다.

같은 데서 막히는 분들 있을 것 같아 정리했다.

전체 구조

나스 워드프레스 외부 공개 구조

포인트는 두 가지다. 포트포워딩을 안 쓴다. 나스의 역방향 프록시가 도메인별로 분기해주기 때문이다. 그리고 Cloudflare를 앞에 세운다. 집 공인 IP가 노출되지 않고, SSL 인증서도 알아서 처리된다.

막힌 지점 1 — 도메인 연결했는데 접속 불가

DNS도 맞고 역방향 프록시도 설정했는데 사이트가 안 열렸다. 확인해보니 서버가 이렇게 응답하고 있었다.

HTTP/2 301
location: https://example.com:8086/

워드프레스가 자기 주소를 도메인:8086으로 저장하고 있어서, 어떤 주소로 들어오든 8086 포트로 되돌려 보냈다.

그런데 Cloudflare는 8086 포트를 프록시하지 않는다. 지원 포트가 정해져 있다.

HTTP80, 8080, 8880, 2052, 2082, 2086, 2095
HTTPS443, 2053, 2083, 2087, 2096, 8443

8086은 목록에 없어서, 되돌아간 요청이 Cloudflare에서 끊긴 거였다.

해결

wp-config.php에 접속한 주소를 따라가는 코드를 넣었다. define('DB_NAME', ...) 위쪽에 쓴다.

$allowed = ['example.com','www.example.com','192.168.0.10:8086'];
$host = $_SERVER['HTTP_HOST'] ?? 'example.com';
if (!in_array($host, $allowed, true)) { $host = 'example.com'; }

if (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https') {
    $_SERVER['HTTPS'] = 'on';
}
$proto = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';

define('WP_HOME',    $proto . '://' . $host);
define('WP_SITEURL', $proto . '://' . $host);

이러면 도메인으로 들어오든 내부 IP로 들어오든 둘 다 된다. 관리자 주소를 하나로 고정하면 도메인 쪽이 망가졌을 때 들어갈 방법이 없어지는데, 이 방식은 그럴 일이 없다.

HTTP_X_FORWARDED_PROTO 부분이 중요하다. 역방향 프록시 뒤에서는 워드프레스가 HTTPS 접속인 걸 모른다. 이 줄이 없으면 http→https 무한 리다이렉트에 빠진다.

허용 목록을 둔 이유는 보안이다. 없으면 위조된 Host 헤더로 요청이 왔을 때 그 주소로 링크가 생성된다.

막힌 지점 2 — 고쳤는데 여전히 안 됨

설정을 고쳤는데도 브라우저에서 계속 안 열렸다. 그런데 도메인/?test=1처럼 뒤에 뭘 붙이면 열렸다.

브라우저가 301 리다이렉트를 캐시하고 있었다. 301은 영구 이동이라 브라우저가 기억해두고 서버에 물어보지도 않는다. 새로고침으로는 안 지워진다.

시크릿 창으로 열어보면 바로 확인된다. 거기서 잘 되면 서버는 정상이고 캐시 문제다. Ctrl+Shift+Delete로 캐시를 지우면 해결된다.

설정을 잘못 건드렸나 싶어 한참 되돌려봤는데, 서버는 처음부터 멀쩡했다.

막힌 지점 3 — 다국어 붙이니 영문 주소 404

Polylang으로 한국어·영어를 붙였더니 /en/이 404가 났다.

언어를 추가하면 URL 규칙이 바뀌는데 워드프레스가 이를 다시 읽어야 한다. 설정 → 고유주소에서 아무것도 바꾸지 않고 저장 버튼만 눌러도 규칙이 갱신되면서 해결된다.

한 가지 더. 한국어 글 제목이 그대로 슬러그가 되면 주소가 이렇게 된다.

example.com/%ec%a0%84%ec%9e%90%ec%b1%85-%eb%a6%ac%eb%8d%94%ea%b8%b0/

공유할 때 지저분해서, 글마다 슬러그를 영문으로 바꿔주는 게 낫다.

알아두면 좋은 것

자체 서명 인증서는 괜찮다

나스 기본 인증서는 자체 서명이라 브라우저가 경고를 띄운다. 그런데 Cloudflare SSL 모드를 Full로 두면 문제없다. 방문자↔Cloudflare 구간은 Cloudflare 인증서를 쓰고, Cloudflare↔나스 구간에서는 자체 서명을 허용하기 때문이다.

Full (strict)로 두면 오류가 난다.

시간대를 먼저 맞춰야 한다

워드프레스 기본 시간대가 UTC라서, 안 바꾸면 예약 발행이 9시간 어긋난다. 설정 → 일반에서 서울로 바꿔 두면 돼요.

속도는 Cloudflare가 해결한다

가정용 회선이라 응답이 느릴까 걱정했는데, Cloudflare 캐싱이 걸리면 방문자는 엣지에서 받아간다. 나스는 원본만 담당한다.

정리

  • Cloudflare 프록시는 정해진 포트만 통과시킨다. 8086 같은 포트는 안 된다
  • wp-config.php에서 사이트 주소를 동적으로 잡으면 도메인·내부 IP 둘 다 살릴 수 있다
  • 역방향 프록시 뒤에서는 HTTP_X_FORWARDED_PROTO 처리가 필수다
  • 고쳤는데 안 되면 브라우저 301 캐시를 의심해야 한다. 시크릿 창으로 확인한다
  • 언어를 추가했으면 고유주소를 한 번 다시 저장한다
  • Cloudflare SSL은 Full. strict는 아니다

설치 자체는 30분이면 끝나는데, 나머지 문제들이 시간을 잡아먹는다. 위 여섯 개만 알고 시작하면 훨씬 빠를 거다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다