이 블로그는 집에 있는 시놀로지 나스에서 돌아간다. 호스팅을 안 쓰고 직접 올렸는데, 그 과정에서 몇 번 막혔다.
검색해보면 “도커로 워드프레스 설치하기” 글은 많다. 그런데 설치 다음부터가 진짜 문제였다. 도메인은 연결했는데 접속이 안 되고, 브라우저 캐시 때문에 며칠을 헤매고, 다국어 붙이니 영문 주소가 404가 났다.
같은 데서 막히는 분들 있을 것 같아 정리했다.
전체 구조

포인트는 두 가지다. 포트포워딩을 안 쓴다. 나스의 역방향 프록시가 도메인별로 분기해주기 때문이다. 그리고 Cloudflare를 앞에 세운다. 집 공인 IP가 노출되지 않고, SSL 인증서도 알아서 처리된다.
막힌 지점 1 — 도메인 연결했는데 접속 불가
DNS도 맞고 역방향 프록시도 설정했는데 사이트가 안 열렸다. 확인해보니 서버가 이렇게 응답하고 있었다.
HTTP/2 301
location: https://example.com:8086/
워드프레스가 자기 주소를 도메인:8086으로 저장하고 있어서, 어떤 주소로 들어오든 8086 포트로 되돌려 보냈다.
그런데 Cloudflare는 8086 포트를 프록시하지 않는다. 지원 포트가 정해져 있다.
| HTTP | 80, 8080, 8880, 2052, 2082, 2086, 2095 |
| HTTPS | 443, 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분이면 끝나는데, 나머지 문제들이 시간을 잡아먹는다. 위 여섯 개만 알고 시작하면 훨씬 빠를 거다.
답글 남기기