Extra Form
PHP PHP 8.3
CMS Rhymix 2.1

안녕하세요.

현재 php-8.3에 redis-server를 설치하여 아래와 같이 설정 했습니다.

image.png

 

별도로 아이디와 암호는 설정하지 않아, DB번호는 1로 설정하여 phpredis_session까지 생성되는 것을 keys * 로 확인 했습니다.

 

외부 웹 크론으로 실행하면 아래와 같이 타임아웃이 발생되는데, 예상되는 이유를 알 수 있을까 하여 작성하게 되었습니다.

image.png

 

 

항상 감사드립니다.

  • ? Lv3

    웹크론 URL을 브라우저에서 직접 접속해 보시고 잘 되는지 확인해 주세요. 브라우저에서는 잘 된다면 외부 웹 크론 서비스에서 사용하는 IP가 차단된 상태일 수 있어요. 방화벽 설정 확인이 필요해요.

  • ? Lv3 Lv2
    감사합니다.
    하지만 차단되지 않고 정상적으로 실행되는것으로 보아 방화벽 설정의 문제는 아닌것 같습니다.

    답변 고맙습니다.
  • Lv36

    웹크론은 기본적으로 1분 간격으로 호출하고, 한 번 호출하면 1분간 실행한다고 가정합니다. 그런데 사용하시는 웹크론 서비스나 웹서버가 딱 30초만 기다리고 포기하는 것 같네요. (Duration이 모두 30초로 찍힘)

    외부 웹크론 서비스가 30초 후 포기하더라도 실제로 서버 내에서 웹크론 스크립트가 계속 실행되고 있다면 메일이나 문자는 잘 발송될 겁니다. 정상 발송 여부를 테스트해 보세요.

    그리고 서버에 뭘 설치할 권한이 있으시다면 웹크론 따위는 고려할 필요도 없습니다. 크론탭을 사용하는 것이 훨씬 안정적이예요.

  • Lv36 Lv2
    이 글을 작성하고 설정의 Advanced를 보았더니 30sec에서 더 길게 기다리지 않고 포기하는걸 알았습니다.

    그래서 프로세스를 보아하니 웹크론 스크립트의 실행은 정상적으로 실행하고 중간에 포기하지 않고 모두 발송하는 것으로 보입니다.

    크론 탭을 사용해야하는데 처음에 정상 작동하는지를 보기 위해 웹크론을 실행한 것이었는데, 크론탭을 정상적으로 적용해야할 것 같습니다.

    부족하고 엉뚱한 질문에도 답변해주시거 감사드립니다.
  • Lv36 Lv2
    크론탭을 적용하니.. 정상적으로 실행이 되지 않는 느낌입니다.

    /var/log/cron.log에서는
    Nov 25 12:45:01 vultr CRON[1398652]: (www-data) CMD (/usr/bin/php8.3 /home/t_share/public_html/index.php common.cron >> /home/t_share/c_log/cron.log 2>&1)
    Nov 25 12:46:01 vultr CRON[1398809]: (www-data) CMD (/usr/bin/php8.3 /home/t_share/public_html/index.php common.cron >> /home/t_share/c_log/cron.log 2>&1)

    01초마다 이런 내용만 나오고 /home/t_share/c_log/cron.log 에는 아무런 내용이 없는데 어떤것을 체크해야할까요?

    crontab을 생성할때에는 t_share라는 계정에서 sudo crontab -e -u www-data를 실행하여 스크립트를 입력해줬습니다.
  • Lv2 Lv36

    www-data 계정이 /home/t_share/c_log/cron.log 파일을 생성하거나 수정할 권한이 있나요?

     

    우분투라면 SELinux 문제는 아닐 테고, 각 폴더의 소유권과 퍼미션을 확인해 보셔야겠습니다.

    경로에 share라는 단어가 보이는 것이 좀 걸리는데요, 혹시 공유된 폴더라면 권한이 좀더 복잡하겠죠.

  • Lv36 Lv2

    이미지와 같이 www-data에게 그룹과 소유자를 주었습니다.

     

    image.png

     

    그리고 t_share는 https://xetown.com/tips/1292199 아파치님의UAAI의 APM 경로 주소이고 별도로 공유받거나 한 폴더는 아닙니다.

     

    제가 놓친 부분이 있을까요?

  • Lv2 Lv36

    위의 크론탭 설정에는 queue.log가 아니라 cron.log라고 되어 있네요.

    cron.log를 생성하고 소유권을 주거나, 상위 폴더(c_log)의 퍼미션을 풀어서 www-data가 새 파일을 생성할 수 있도록 해 주세요. 사용자의 개입 없이 백그라운드에서 실행되는 프로그램이기 때문에, 로그가 없으면 뭐가 잘못되었는지 짐작조차 할 수 없거든요. 로그가 가장 중요합니다.^^

  • Lv36 Lv2
    위치 자체가 잘못되고 있었네요....

    로그가
    PHP Exception: Error #0 "Class 'Redis' not found" in index.php on line 66 (via common/framework/drivers/queue/redis.php on line 109)
    #0 /home/t_share/public_html/common/framework/drivers/queue/redis.php(26): Rhymix\Framework\Drivers\Queue\Redis->__construct()
    #1 /home/t_share/public_html/common/framework/Queue.php(44): Rhymix\Framework\Drivers\Queue\Redis::getInstance()
    #2 /home/t_share/public_html/common/framework/Queue.php(147): Rhymix\Framework\Queue::getDriver()
    #3 /home/t_share/public_html/common/framework/Queue.php(187): Rhymix\Framework\Queue::getTask()
    #4 /home/t_share/public_html/common/scripts/cron.php(99): Rhymix\Framework\Queue::process()
    #5 /home/t_share/public_html/classes/module/ModuleHandler.class.php(1240): require_once()
    #6 /home/t_share/public_html/index.php(66): ModuleHandler::procCommandLineArguments()


    인데, 현재 홈페이지 캐시를 Redis로 설정했고 잘 나오고 있는데 에러가 발생하는군요 @_@
  • Lv2 Lv36

    웹(아파치 또는 PHP-FPM)에서는 새로 설치하신 Redis 확장모듈을 인식하는데
    PHP-CLI에서는 설치되지 않은 것으로 보는 모양이군요.

    우분투 기본 php8.3-redis 패키지를 설치하셨다면 양쪽 모두 똑같이 적용되었을 텐데 이상하네요.

    보통 이런 문제는 불필요한 뻘짓(컴파일 설치)을 했을 때나 일어나는 상황이거든요.

  • Lv36 Lv2
    앞서 UAAI를 사용해서 설치했는데, 설치할때에도 apt-get을 이용해 설치하기 때문에... 추가 확장 프로그램을 설치해도 문제가 없었거든요.

    혹시나 하여 apt-get install php8.3-redis를 했는데
    php8.3-redis is already the newest version (6.0.2-4+ubuntu20.04.1+deb.sury.org+1).
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.


    역시나 설치는 되어 있습니다.

    php.ini에도 혹시 몰라 extension과 확장 코드를 넣어두었는데도.. 웹에서는 인식하지만 CLI에서는 인식을 못하네요
  • Lv2 Lv36

    웹용 php.ini는 /etc/php/8.3/(apache2 또는 fpm)/php.ini이고
    크론탭이나 터미널에서 실행할 때는 /etc/php/8.3/cli/php.ini를 참조합니다.

    각각의 설정파일 위치 바로 옆 conf.d 폴더 안에 있는 파일들도 일괄 인클루드하는데,
    패키지 설치하면 conf.d 폴더 안에 심볼릭 링크가 생성되기 때문에 자동으로 인식합니다.
    다른 방법으로 설치하셨거나, APM 설치 프로그램이 php.ini를 임의로 조작했다면
    자동 인식하여 일괄 인클루드하는 기능이 망가져 있을 수도 있습니다.

  • Lv36 Lv2
    말씀하신대로 웹은
    /etc/php/8.3/apache2/php.ini 으로 되어 있고
    CLI는 /etc/php/8.3/cli/php.ini 입니다.
    심볼릭 링크로 25-redis.ini가 생성되어 있습니다.

    제가 임의로 cli/php.ini에서 extension=redis 구문을 넣었는데, 삭제해도 동일하게 class를 찾을 수 없다고 하는군요... 일괄 인클루드 기능을 어디서 해주는지 찾아봐야겠습니다.
  • Lv2 Lv36
    터미널에서 php8.3 -m 명령을 내려 보세요. 설치된 extension 목록에 redis가 보여야 합니다.
    뭐 하나 바꿔 놓고 1분 기다려서 크론탭 로그 확인하는 것보다 그게 훨씬 빠를 거예요.
  • Lv36 Lv2
    [PHP Modules] 항목에 redis가 떡하니 있는데!!!!! 왜 안되는걸까요...
    캐시를 redis로 설정했을때에도 큰 문제 없이 사이트가 표출되고 있거든요 ㅜ
  • Lv2 Lv36
    사이트 표출과는 아무 관련 없습니다.
    아파치 모듈 PHP와 터미널에서 실행하는 PHP-CLI는 아예 다른 프로그램이거든요.

    www-data 계정이 PHP-CLI를 실행할 때만 확장모듈이 제대로 로딩되지 않는 것일 수도 있습니다.
    (www-data 권한으로 크론탭을 실행하는 것부터 뭔가 좀 이상한 상황이긴 합니다.)

    대부분의 APM 세팅 프로그램들은 PHP-CLI를 전혀 고려하지 않고
    아파치를 통해서 실행했을 때 잘 돌아가도록 하는 데만 초점을 맞추기 때문에,
    아마 처음에는 시행착오가 있을 거예요.

    정 안되면 크론탭에서 curl이나 wget으로 웹크론 주소를 호출하는 방법도 있습니다.
    외부 웹크론 서비스보다는 타임아웃을 넉넉하게 줄 수 있겠지요.
  • Lv36 Lv2
    장시간 알려주셔서 감사합니다.
    한번 계속 시도해보고 해결이 된다면, 정보 공유를 꼭 하겠습니다.

    감사합니다.
  • Lv36 Lv2

    해결을 했습니다. 원인은 가장 기본적인 것이었는데...
    UAAI에서 php의 여러버전을 지원 하기 위해 /usr/bin/php가 아닌 /use/bin/php버전 으로 되어 있습니다.
    지금의 경우에는 8.3 버전을 사용하기 때문에 crontab의 명령 커맨드라인은

    * * * * * /usr/bin/php8.3 /웹경로/index.php common.cron >> /에러로그_경로/cron.log 2>&1
    가 되어야 했던것이지요. 그래서  www-data에서는 없는 /usr/bin/php를 실행하려니 실행이 되지 않아 그랬던 것으로 보입니다..

     

    image.png

  • Lv2 Lv36
    위에서도 크론탭 /usr/bin/php8.3으로 설정하시지 않았나요?

    아무튼 php8.3-redis를 설치하셨다면 php8.3에서 redis를 사용할 수 있어야 하는데,
    여러 버전을 지원하는 것을 감안하더라도 서버 셋팅이 좀 이상한 것 같네요.
    "아파치에서" 여러 버전을 지원하는 것만 생각하다가 CLI 쪽에서 부작용이 생겼나 봅니다.
  • Lv36 Lv2
    저도 똑같이 생각하고 있습니다.
    조금 더 둘러보다 앞으로는 스크립트에 의존하지 않고 직접 패키지 설치해서 단일 버전으로 운영해야겠습니다.
  • Lv12
    redis 가 세션db 관리하는 소프트웨어로 알고 있었는데 크론탭에서도 사용되나보네요
    저도 크론탭을 활용해서 주기적인 php 를 실행해주고 있는데 먼 미래엔 레디스도 활용해 보아야겠네요.
  • Lv12 Lv2
    crontab에서 사용하는 것은 redis에서 비동기 큐를 사용하기 위해서입니다
    라이믹스 신 기능이지요!
  • Lv12 Lv18
    redis를 세션값 저장에 이용할수 있을뿐 본질은 "고성능 키-값 저장소"라서 이번 경우처럼 비동기 큐로 사용하거나 라이믹스의 캐시 데이터를 저장할때 사용할수도 있습니다.