아래 원 질문글 로그 살펴보라고 하셔서 체크했습니다.
(서버 상태: Windows 10 + NginX + XE 1.11.1 + Rhymix 1.9.8.4 Develop / PHP 7.2.12)
https://xetown.com/questions/1120062
문제가 발생하는 상황은 Admin이 아닌 일반 유저가
사진을 첨부해서 본문에 이미지가 삽입된 상태에서 글 등록을 누르면 발생합니다.
(Admin인 경우 발생 안 함, 일반 유저가 사진 첨부만 하고 본문 삽입 안 하면 발생 안 함)
Full Log도 첨부합니다.
=============================================
[03-Dec-2018 10:21:52 Etc/GMT-9] PHP Exception: Error #0 "Call to undefined function mcrypt_encrypt()" in W:\www\common\libraries\cryptocompat.php on line 31
#0 W:\www\common\framework\security.php(67): CryptoCompat::encrypt()
#1 W:\www\common\framework\filters\htmlfilter.php(536): Rhymix\Framework\Security::encrypt()
#2 (): Rhymix\Framework\Filters\HTMLFilter::Rhymix\Framework\Filters\{closure}()
#3 W:\www\common\framework\filters\htmlfilter.php(538): preg_replace_callback()
#4 W:\www\common\framework\filters\htmlfilter.php(428): Rhymix\Framework\Filters\HTMLFilter::_encodeWidgetsAndEditorComponents()
#5 W:\www\common\framework\filters\htmlfilter.php(106): Rhymix\Framework\Filters\HTMLFilter::_preprocess()
#6 W:\www\common\legacy.php(818): Rhymix\Framework\Filters\HTMLFilter::clean()
#7 W:\www\modules\document\document.controller.php(488): removeHackTag()
#8 W:\www\modules\board\board.controller.php(186): documentController->insertDocument()
#9 W:\www\classes\module\ModuleObject.class.php(608): boardController->procBoardInsertDocument()
#10 W:\www\classes\module\ModuleHandler.class.php(807): ModuleObject->proc()
#11 W:\www\index.php(52): ModuleHandler->procModule()
=============================================
해당 문제를 좀 검색해보니,
Mcrypt가 PHP 7.1에서 deprecated되었고, PHP 7.2 버전에서는 remove 되어서 그렇다고 하는데요.
(윈도우가 아닌 경우 소스를 받아서 빌드해서 서버에 첨부하더군요... 저는 윈도우라 현재 상태로 그게 불가능합니다.
좀 찾아봤는데 마땅히 빌드된 라이브러리도 안 보이네요.... ㅠㅠ)
https://secure.php.net/manual/en/migration71.deprecated.php
https://windows.php.net/downloads/pecl/releases/mcrypt/1.0.1/logs/ <= 로그만 존재하고 라이브러리는 없습니다.
https://serverpilot.io/docs/how-to-install-the-php-mcrypt-extension
https://lukasmestan.com/install-mcrypt-extension-in-php7-2/
Mcrypt가 없어지고 대신 Sodium이라는 걸 사용하게 바뀌었다고 하네요.
로그를 살펴보면,
common\libraries\cryptocompat.php에서 CryptoCompat::encrypt()를 호출하는데,
이 부분 라이브러리가 없어서 발생하는 것으로 보입니다.
이걸 제가 Sodium으로 바꿀 능력은 안 될 거 같은데,
이런 문제가 혹시 예전엔 없었나요? 어떻게 해결해야 하나요?
Rhymix에서 참조하는 코드(Rhymix\Framework\Security:::encrypt()) 이니,
Rhymix에서 수정이 되어야 할 것 같은데요....
XE에서 Rhymix로 서버는 갈아엎으면서 PHP 7.0 => PHP 7.2로 바꾸었더니 이도저도 못 하고 있네요... =ㅅ=;;;;
도움 부탁 드립니다.
어쨌든 감사합니다.
라이믹스에서 요구하는 조건을 충족하지 못하는 서버 환경이라서 발생하는 문제입니다.
설치 조건을 제대로 체크하고 사용해 주세요.
https://github.com/rhymix/rhymix-docs/blob/master/ko/introduction/requirements.md
여기를 보시면 openssl과 mcrypt 둘 중 하나는 반드시 있어야 합니다.
PHP 7.2에는 mcrypt가 없으므로 openssl이 유일한 옵션인데,
사용하시는 서버에는 openssl 확장모듈이 설치되어 있지 않은 것 같습니다.
openssl 확장모듈이 설치되어 있다면 mcrypt에 의존하는 라이브러리를 호출하지 않도록 되어 있거든요.
mcrypt는 openssl이 없는 경우 차선책으로 사용하는 것입니다.
libsodium은 필요하지 않습니다.
물론 윈도우 서버는 기본적으로 지원하지 않는다는 정책이라
뭘 해도 설치 조건이 충족되지 않는다는 점은 마찬가지이긴 합니다만;;
openssl 확장모듈이 있다면 일단 돌아가긴 할 거예요.