개요[편집 / 원본 편집]
라이믹스에서 cron을 사용하는 경우는 크게 두 가지이다.
- 정리 스크립트 — 쌓인 불필요한 데이터를 정기적으로 지운다. 하루 한 번 정도 실행한다.
- 비동기 작업(Queue) 실행 — 메일 발송이나 푸시 알림을 백그라운드에서 처리한다. 1분 간격 등 짧은 주기로 실행한다.
공식 매뉴얼의 Crontab 설정 방법 문서는 앞쪽만 다루므로,[1] 이 문서에서는 두 가지를 함께 정리한다.
윈도우 서버는 지원하지 않는다.[1]
정리 스크립트[편집 / 원본 편집]
사이트를 운영하다 보면 탈퇴한 회원의 정보, 삭제된 사진의 섬네일, 확인하지 않은 알림 같은 불필요한 데이터가 쌓인다. 이런 데이터를 정기적으로 지우면 디스크 공간을 아끼고 서버를 쾌적하게 유지할 수 있다.[1]
라이믹스는 이를 위한 PHP-CLI 스크립트를 제공한다. 다량의 데이터를 지우는 데 시간이 오래 걸릴 수 있어 웹에서는 실행할 수 없다.[1]
실행 방법[편집 / 원본 편집]
스크립트는 각 모듈의 scripts 폴더에 있으며, 라이믹스 설치 경로에서 다음 형식으로 실행한다.[1]
php index.php 모듈명.스크립트명 [변수]
예를 들어 60일 이상 지난 알림을 지우려면 다음과 같이 실행한다.
php index.php ncenterlite.cleanNotifications 60
스크립트 목록[편집 / 원본 편집]
| 스크립트 | 하는 일 | 기본값 |
|---|---|---|
file.cleanGarbageFiles
|
파일만 올리고 글 작성을 취소하여 남은 파일, 대용량 업로드가 중단되어 남은 파일 등을 지운다 | 10일 |
file.cleanThumbnails
|
오래된 섬네일 이미지를 지운다 | 90일 |
module.cleanMiscLogs
|
메일·SMS 발송 로그, 푸시 발송 로그, 스팸필터 로그 등 여러 모듈이 만드는 잡다한 로그를 일괄 삭제한다 | 30일 |
ncenterlite.cleanNotifications
|
오래된 알림을 지운다 | |
file.cleanEmptyDirs
|
첨부파일·회원정보·섬네일 폴더에 남은 빈 폴더를 지운다 |
file.cleanThumbnails는 주의해야 한다. 오래된 글의 섬네일도 보여줘야 하는 웹진형 게시판을 운영한다면 쓰지 말자. 지운 섬네일을 다시 만드는 데 더 많은 서버 자원이 든다.[1]
file.cleanGarbageFiles도 주의가 필요하다. 일부 서드파티 자료는 파일 업로드 후 문서에 정상적으로 연결하지 않고 isvalid=N 상태로 방치하는데, 이런 파일이 삭제될 수 있다.[1]
crontab 설정 예제[편집 / 원본 편집]
여러 스크립트를 동시에 실행하면 과부하가 걸릴 수 있으므로, 방문자가 적은 시간대에 시간차를 두고 실행하자. 매일 정해진 시각에 백업한다면 백업 직전에 정리하는 것이 편하다.[1]
빈 폴더를 지우는 스크립트를 맨 마지막에 실행하면 효과적이다. 앞선 스크립트들이 파일을 지우면서 빈 폴더가 생기기 때문이다.
05 05 * * * php /설치경로/index.php file.cleanGarbageFiles >> /설치경로/files/cron.log 2>&1
10 05 * * * php /설치경로/index.php file.cleanThumbnails >> /설치경로/files/cron.log 2>&1
15 05 * * * php /설치경로/index.php module.cleanMiscLogs >> /설치경로/files/cron.log 2>&1
15 05 * * * php /설치경로/index.php ncenterlite.cleanNotifications >> /설치경로/files/cron.log 2>&1
20 05 * * * php /설치경로/index.php file.cleanEmptyDirs >> /설치경로/files/cron.log 2>&1
비동기 작업 실행[편집 / 원본 편집]
라이믹스는 메일 발송, 푸시 알림처럼 시간이 오래 걸리거나 외부 서비스와 연동하는 작업을 비동기로 처리하여 응답 속도를 개선하는 기능을 제공한다. 관리자 화면의 비동기 작업 항목에서 설정한다.
- ※ 관리자 화면은 이 기능을 실험적인 기능으로 안내하고 있다. 호스팅 환경에 따라서는 안정적으로 작동하지 않을 수도 있다.
이 기능을 켜기만 해서는 동작하지 않는다. 외부 스케줄러가 일정한 주기로 처리 스크립트를 호출해 주어야 한다.
관리자 설정 항목[편집 / 원본 편집]
| 항목 | 설명 |
|---|---|
| 비동기 작업 사용 | 체크를 해제하면 더 이상 작업을 접수하지 않는다 |
| 비동기 드라이버 | 작업을 관리할 방법. Redis 등 일부 드라이버는 서버에 해당 기능이 설치되어 있어야 한다 |
| 호출 간격 | 스크립트를 호출할 주기(분). 모든 작업은 호출 간격과 무관하게 실시간으로 처리되지만, 간격이 짧으면 장애 발생 시 빠르게 복구된다 |
| 프로세스 갯수 | 여러 프로세스를 동시에 실행해 처리 용량을 늘린다. 고성능 단독 서버가 아니라면 1을 유지하는 것이 권장된다 |
| 웹크론 오류 표시 | 에러 로그를 확인하기 어려운 환경에서 웹크론 오류를 화면에 표시한다 |
crontab으로 실행[편집 / 원본 편집]
처리 스크립트는 common/scripts/cron.php이며, CLI에서는 common.cron이라는 이름으로 호출한다.
* * * * * php /설치경로/index.php common.cron
호출 간격을 1분으로 설정했다면 위와 같이 매분 실행한다. 스크립트는 설정한 호출 간격을 바탕으로 실행 시간을 정한다. 다만 cron 자체가 이전 프로세스의 종료를 기다려 주는 것은 아니므로, 작업 지연·중복 등록·장애가 있는 경우 실제 프로세스와 큐 상태를 확인한다.
systemd timer로 실행[편집 / 원본 편집]
crontab 대신 systemd timer를 사용해도 된다. 관리자 화면의 안내도 crontab, systemd timer, 웹크론을 나란히 제시하고 있다.
웹크론으로 실행[편집 / 원본 편집]
SSH를 쓸 수 없는 웹호스팅 환경에서는 외부 웹크론 서비스로 URL을 호출하는 방법을 쓸 수 있다. 정리 스크립트와 달리 이 스크립트는 네트워크를 통한 직접 호출을 지원한다.
https://사이트주소/common/scripts/cron.php?key=발급된키
key 값은 관리자 화면의 비동기 작업 설정에서 확인할 수 있다. 키가 맞지 않으면 403 Forbidden과 함께 Invalid key가 반환된다. 정상적으로 처리되면 OK가 출력된다.
웹크론을 쓸 때는 다음을 유의해야 한다.
- 호출 간격이 php.ini의 실행 시간 제한(
max_execution_time)을 넘지 않도록 해야 한다. 서버의 현재 값은 관리자 화면에 표시된다. - 웹크론으로 호출한 경우에는 멀티프로세싱을 지원하지 않는다. 프로세스 갯수를 2 이상으로 설정해도 하나만 실행된다.
실행 계정[편집 / 원본 편집]
평소 웹서버를 실행하는 계정으로 crontab을 설정해야 한다. 보통 apache, nginx, www-data 등이다.[1]
다른 계정이나 root로 실행하면 나중에 사이트에서 퍼미션 문제가 생기거나 캐시 파일이 꼬일 수 있다. 어느 계정을 써야 할지 모르겠다면 files/config/config.php 파일이나 files/cache 폴더의 소유자를 확인하자.[1]
ls -l files/config/config.php
로그 확인[편집 / 원본 편집]
위 예제를 따르면 실행 결과가 files/cron.log에 기록된다. crontab 설정 후 며칠간은 이 파일을 확인하며 정상 작동 여부를 점검하자.[1]
tail -f /설치경로/files/cron.log
로그 파일이 무한정 커지지 않도록 logrotate를 함께 설정해 두면 좋다.
예약 실행이 안 될 때[편집 / 원본 편집]
아래는 공식 기능 설명에 덧붙인 운영 점검 순서이다.
- 같은 실행 계정에서 명령을 수동으로 시험하여 경로·권한·PHP 오류를 먼저 확인한다. 삭제용 정리 스크립트는 백업과 복원 범위를 확인한 뒤 시험한다.
- 대화형 셸과 cron의 환경이 같다고 가정하지 않는다. PHP 실행 파일과 사이트 경로를 절대 경로로 지정하고, CLI의 PHP 버전·확장·설정 파일을 확인한다. 웹 PHP와 CLI 구분 참고.
- crontab의 시각은 서버·cron의 시간대 설정을 기준으로 확인한다. 라이믹스 화면에 표시되는 사이트 시간대와 같다고 단정하지 않는다. Cronie는
CRON_TZ를 지원하지만 구현별 지원 여부를 확인한다.[2] - 위 예제는 사용자 crontab 형식이다.
/etc/crontab·/etc/cron.d/형식에는 실행 사용자 필드도 들어가므로 그대로 복사하지 않는다. - 표준 출력과 오류를 함께 기록하고 마지막 실행 시각·소요 시간·종료 상태를 확인한다. 로그 디렉터리는 실행 계정이 쓸 수 있어야 하며 웹에서 공개되지 않는 위치를 권장한다.
files/cron.log를 사용한다면 외부 다운로드가 차단되는지 확인한다. - 큐를 사용한다면 테스트 알림의 접수와 실제 발송까지 확인한다. cron 호출 성공만으로 모든 대기 작업이 성공했다고 판단하지 않는다.
웹크론의 키가 들어간 URL은 비밀값으로 취급한다. 공개 문서·이슈·스크린샷에는 예시 키만 쓰고 실제 키를 노출하지 않는다.
그 밖의 스크립트[편집 / 원본 편집]
common/scripts 폴더에는 예전 이름의 스크립트 파일들(clean_old_thumbnails.php 등)도 남아 있다. 공식 매뉴얼의 일부 설명은 아직 이 이름을 사용한다.
또한 module.updateAllModules 스크립트가 있는데, 이는 모든 모듈의 업데이트를 수행하는 것으로 정기 실행용이 아니다. cron에 등록하지 말자.
같이 보기[편집 / 원본 편집]
- 라이믹스/매뉴얼
- 라이믹스/매뉴얼/라이믹스 프레임워크 — Queue 클래스
- 라이믹스/설치
- 라이믹스/매뉴얼/설치 환경
출처[편집 / 원본 편집]
이 문서의 정리 스크립트 부분은 라이믹스 공식 매뉴얼의 Crontab 설정 방법 문서를 바탕으로 작성되었다. 공식 매뉴얼은 CC BY-SA 4.0 라이선스로 배포된다.[3]
비동기 작업 부분은 라이믹스 코어 소스(common/scripts/cron.php, common/framework/Queue.php, modules/admin/lang/ko.php)를 확인하여 작성하였다.
각주[편집 / 원본 편집]
| 라이믹스 · 설치·운영·개발 매뉴얼 둘러보기 | |
|---|---|
| 설치·이전 | 설치 환경 · 설치 · 업데이트 · XE에서 이전 · 호환성 점검 · nginx · 도메인 변경 |
| 운영 | 백업·복원 · 업로드·서버 진단 · 캐시·성능 · Crontab · 보안 · 릴리즈 노트 |
| 개발 | 확장 기능 제작 · 애드온 · DB 연산자 · 라우터 · 이벤트 · 개발 보안 |
| 테마·API | 테마 제작 · 템플릿 v1 · 템플릿 v2 · 프레임워크 · PHP 전역 함수 · JS 라이브러리 · JS 함수 · 레거시 JS 함수 · String 확장 |
| 기여·연동 | 이슈·PR · 코딩 규칙 · 라이선스 · IP 대역 · 시간대 · 포토스와이프 · 모바일 푸시 · 네모의 꿈 색상 |