| CMS/프레임워크 | Rhymix 2.1 |
|---|---|
| 개발 언어 | PHP 8.2 |
안녕하세요. Docker Compose를 이용해 라이믹스 사이트를 구축하던 중 접속자 IP 표시 문제로 문의드립니다.
질문 index.php를 수정하면 해결되긴 하지만, 코어 파일 수정 없이 해결하고 싶습니다.
1. Docker 환경에서 config.user.inc.php가 로드되지 않거나 시점이 늦는 이슈가 있나요?
2. index.php 수정 외에 Docker 환경에서 실제 IP를 잡는 정석적인 방법(설정 파일 등)이 무엇인지 궁금합니다.
---------------------------------------------------------------------------
1. 서버 환경
- 구성: Caddy (Reverse Proxy) → Rhymix 2.1.29(Apache/PHP 공식 이미지)
- 네트워크: Docker Bridge Network (172.20.0.0/16)
- 증상: 라이믹스 상에서 접속자 IP가 실제 IP가 아닌 Docker Gateway IP (172.20.0.6 등)로 표시됨.
2. Caddy 설정 (Caddyfile) Caddy에서 X-Forwarded-For 헤더를 넘겨주도록 설정했습니다.
코드 스니펫
reverse_proxy rhymix:80 {
header_up X-Real-IP {remote_host}
# Caddy가 자동으로 붙여주지만 명시적으로도 테스트 해봄
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
3. 테스트 진행 상황
(1) 헤더 수신 확인 (정상) 라이믹스 루트에 간단한 PHP 파일(ip_check.php)을 만들어 확인해 보면, 헤더는 정상적으로 들어옵니다.
- $_SERVER['REMOTE_ADDR']: 172.20.0.6 (Docker IP)
- $_SERVER['HTTP_X_FORWARDED_FOR']: 123.45.67.89 (실제 IP 확인됨)
(2) config.user.inc.php 설정 (실패) files/config/config.user.inc.php 파일을 생성하고 아래 코드를 넣었으나 전혀 적용되지 않습니다. (여전히 172 IP로 뜸)
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$forwarded = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = trim(end($forwarded));
}
- files/config/config.php의 proxy trust 설정에 172.0.0.0/8을 추가해 봐도 마찬가지입니다.
(3) index.php 직접 수정 (성공) 최후의 수단으로 index.php 파일 최상단에 위와 동일한 코드를 삽입하고 Docker Volume으로 마운트했더니, 그제야 실제 IP가 정상적으로 표시됩니다.
댓글 2
1. config.user.inc.php 인클루드 시점에는 더이상 IP를 조작할 수 없습니다. (XE와 다릅니다.)
2. IP를 제대로 잡는 것은 웹서버의 역할이라고 가정합니다. 처음부터 REMOTE_ADDR에 실제 IP가 들어 있어야 한다는 뜻입니다. 예를 들어 아파치나 nginx는 real IP 기능을 사용해서 웹서버 자체적으로 REMOTE_ADDR를 X-Forwarded-For로 치환할 수 있습니다. 이렇게 하면 access log에도 실제 IP가 기록되기 때문에 어뷰징을 잡기도 훨씬 쉬워지지요. PHP 코드로 땜빵하는 것은 어디까지나 서버 구성 변경이 불가능한 웹호스팅에서나 쓰는 방법입니다.
3. 여러 종류의 웹서버를 직렬로 연결하여 사용한다면 모든 웹서버가 IP 정보를 제대로 인식하도록 해야 합니다. Caddy -> 아파치 -> PHP 구성인 듯 한데, Caddy 설정만 보여 주셨거든요. 아파치에서는 mod_remoteip 설정을 하셨는지요?
4. 라이믹스에 proxy trust 설정이란 존재하지 않습니다. 검색 결과조차 없는 것을 보니 AI가 환각한 모양이네요.
감사합니다. 덕분에 해결했습니다.
mod_remoteip 설정하니 바로 되네요.
C++, C# wpf만 개발하다가 처음으로 웹 쪽 하는거라 모르는게 많네요.
좋은 하루 보내세요!