공식 플러그인을 사용하여 Discourse Connect SSO를 설정했기 때문에, WP 사용자는 Discourse에서 별도 계정을 등록하지 않고도 로그인할 수 있습니다. 모든 기능이 정상적으로 작동하지만, Query Monitor 플러그인을 통해 발견한 타임아웃 문제로 인해 WP 대시보드(관리 영역)의 모든 요청이 10초씩 지연되고 있습니다.
https://{our-forum-address}/site.json cURL error 28: Connection timeout after 10001 ms
설령 이 기능이 작동한다고 해도, 왜 이런 호출이 필요한 것일까요? 이를 비활성화하는 방법은 무엇일까요?
포럼과 사이트는 별도의 서버에 있습니다. Cloudflare는 사용하지 않고 있으며, SSL은 Let’s Encrypt를 사용하고 있습니다. 스테이징 환경에서는 이런 문제가 없었습니다. 라이브 환경으로 이동하고 새로운 API 키와 시크릿을 생성하여 문제를 해결하려 했지만 실패했습니다.
플러그인은 **Discourse에 연결되어 있지 않습니다. 연결 설정이 올바른지 확인하십시오. 문제가 지속되면 연결 로그를 활성화하고 로그를 확인하십시오.**라고 표시하지만, 사용자는 주소를 포함하는 링크를 클릭하기만 하면 포럼에 무리 없이 로그인할 수 있으므로 실제로는 연결되어 있습니다.
WP 로그에는 다음과 같이 표시됩니다:
[2024-10-31 10:54:47] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""}
이상한 WP 보안 기능 때문에 문제가 생기는 것 같아서 아래 코드를 추가해 보았지만 역시 효과가 없었습니다:
add_filter('http_request_host_is_external', [$this, 'mark_discourse_api_url_external'], 10, 3);
function mark_discourse_api_url_external($is_external, $host, $url)
{
if ($host === "{our-forum-address}") {
return true; // Allow the request by indicating the host IS external
}
return $is_external;
}
키 때문이라고 생각하지 않습니다. 이전에 스테이징 사이트의 키로 시도해 보았으며, 새로 생성한 키는 "사용 안 됨"으로 표시됩니다. 포럼 홈 페이지에 대한 테스트 호출인 wp_remote_request를 시도해도 타임아웃이 발생합니다. "모든 사용자"와 "글로벌"로 설정해 두었습니다.
네, 그런데 왜 관련 없는 관리자 페이지마다 매번 그렇게 되는 건가요? 필요할 때 한 번만 수행되면 충분합니다. 어디서 오는지 추적해 보니 function get_discourse_categories()에서 오는 것이며, 이는 add_action( 'admin_init', array( $this, 'setup_options' ) );에 하드코딩되어 있습니다. 제 WP가 포럼의 카테고리에 대해 알아야 할 필요는 없으며, 게시/댓글 기능을 사용하지 않으므로 로그인 기능만 필요하고, 그것은 이미 작동하고 있습니다.
또한 wp_remote_request()를 사용하여 포럼 홈 페이지에 대한 요청을 보냈는데, 이것도 타임아웃이 발생합니다. 다른 랜덤 사이트들은 접근 가능합니다.
스테이징 환경은 VM에서 Docker로 실행되며 수동으로 만든 완전한 사본이었습니다. 프로덕션 환경은 제가 관리하지 않고 어떤 호스팅을 사용하는지 알 수 없지만, 이전에는 문제가 없었고 꽤 빨랐습니다.
방금 다음을 시도해 보았습니다:
discourse_request 함수에서 sslverify = false 옵션
그리고 Cloudflare에서 제 다른 도메인에 CNAME(별칭)을 만들어 포럼의 호스트를 배경에서 가리키도록 설정했습니다(더 “좋은” SSL과 다른 호스트를 사용하여 라이브 사이트 호스트의 방화벽에서 루프백 제한이 있는지를 배제하기 위함): https://ibkforum.stateofbliss.us 하지만 테스트 요청을 스테이징에서 수행하는 것은 정상적으로 작동하는 반면, 같은 방식으로 타임아웃이 발생합니다. 로그인하지 않으면 메인 사이트로 리다이렉트됩니다.
[2024-10-31 13:12:32] connection.INFO: check_connection_status.failed_to_connect {"error":"wpdc_response_error","message":"An invalid response was returned from Discourse","http_code":"","http_body":""}
WordPress 프로덕션을 말씀하시는 건가요, 아니면 Discourse 프로덕션을 말씀하시는 건가요? Discourse 프로덕션 환경에서 리다이렉트를 수행하거나 요청 헤더를 변경(또는 제거)하는 것이 존재할 가능성이 있나요?
두 인스턴스의 메타 파일을 공유해 주시면 도움이 될 것입니다. 관리자 패널의 “로그” 섹션에서 "메타 보기"를 클릭하세요.
이것이 근본적인 문제일 가능성이 높습니다. WordPress가 Discourse를 전혀 참조할 수 없다면 연결이 작동하지 않을 것입니다. 이 연결성을 쉽게 테스트할 수 있다면, 포럼의 네트워크 레이어를 조정하면서 403(즉, 권한 없음) 응답을 받을 때까지 계속 테스트해 보시는 것이 좋습니다.
직감적으로 이것은 네트워크 레이어 문제라고 생각합니다. 리다이렉트나 방화벽 때문일 수 있습니다.
스테이징 Discourse는 없으며, 두 사이트 모두 동일한 라이브 Discourse(동일한 사용자 ID 등)를 사용합니다. 다른 스레드에서 이 문제에 대해 문의했고, 문제없다는 답변을 받았습니다. 포럼의 네트워크 레이어는 매우 단순하며, Hetzner에 호스팅된 VPS에서 공식 Docker를 사용하고 있습니다. 포럼은 일부 시각적 요소 외에는 거의 사용되거나 커스터마이징되지 않았습니다. 접속을 차단할 수 있는 설정은 인지하고 있지 않습니다. 그들의 비정상적인 설정에 대해 더 우려하고 있으므로, 연결이 실패하는 이유를 확인해 달라는 티켓을 WP 호스팅会社に 생성했습니다.
흥미로운 점은 포럼이 WP에 도달할 수 있다는 사실(반대는 아님)만으로도 SSO가 작동하는 데 "충분"하다는 것입니다. 다만 포럼에서 사용자를 로그아웃하는 경우는 제외됩니다.