1. 시스템 요구사항 요약
DXCMS Board v8.0.3은 PHP 5.6부터 PHP 8.x까지, 그리고 IIS • Apache • Nginx • 저가형 공유호스팅 환경을 완전 지원합니다. Windows와 Linux 모두 호환됩니다.| 항목 | 최소 요구사항 | 권장 사항 | 비고 |
|---|---|---|---|
| PHP 버전 | PHP 5.6 | PHP 8.1 이상 | 8.x에서 성능 대폭 향상 |
| 데이터베이스 | MySQL 5.6 / MariaDB 10.1 | MySQL 8.0 / MariaDB 10.6+ | FULLTEXT 인덱스 InnoDB 지원 필수 |
| 웹 서버 | IIS 7.0+, Apache 2.2+, Nginx 1.x | 최신 버전 권장 | URL Rewrite 없어도 동작 |
| 운영체제 | Windows / Linux | Ubuntu 20.04+ / CentOS 7+ | Windows(IIS) 완전 지원 |
| 메모리 (PHP) | 64MB | 256MB 이상 | memory_limit 설정 |
| 디스크 | 50MB (코어) | 1GB 이상 | 업로드 파일 고려 |
| 문자셋 | UTF-8 | utf8mb4 | DB 및 PHP 모두 UTF-8 |
2. PHP 버전 및 익스텐션 요구사항
2.1 PHP 버전별 지원 현황
| PHP 버전 | 지원 여부 | 특이사항 |
|---|---|---|
| PHP 5.6 | ✅ 완전 지원 (최소 요구) | ?? 연산자 미사용, closure 제한 우회 적용됨 |
| PHP 7.0 ~ 7.4 | ✅ 완전 지원 | 성능 및 타입 안전성 향상 |
| PHP 8.0 | ✅ 완전 지원 | JIT 컴파일러 활성화 가능 |
| PHP 8.1 | ✅ 완전 지원 (권장) | Fibers, Readonly Properties 활용 |
| PHP 8.2 ~ 8.3 | ✅ 완전 지원 | 최신 버전, 최고 성능 |
| PHP 5.5 이하 | ❌ 미지원 | password_hash() 미지원으로 동작 불가 |
⚠ PHP 5.6은 2018년 12월 공식 지원 종료(EOL)되었습니다. 저가형 공유호스팅 호환을 위해 지원하지만, 보안을 위해 PHP 8.x 사용을 강력 권장합니다.
2.2 PHP 익스텐션 요구사항
필수 익스텐션 (없으면 설치 불가)
| 익스텐션 | 확인 방법 | 용도 | 기본 포함 여부 |
|---|---|---|---|
| pdo_mysql | extension_loaded('pdo_mysql') | MySQL/MariaDB PDO 연결 | 대부분 기본 포함 |
| json | extension_loaded('json') | JSON 인코드/디코드, 설정 저장 | PHP 5.2+ 기본 포함 |
| session | (기본 내장) | 로그인 세션 관리 | PHP 기본 내장 |
| pcre | (기본 내장) | URL 파싱, 보안 패턴 검사 | PHP 기본 내장 |
| hash | (기본 내장) | SHA-256 해시, 보안 경로 생성 | PHP 기본 내장 |
권장 익스텐션 (없으면 일부 기능 제한)
| 익스텐션 | 용도 | 없을 때 동작 |
|---|---|---|
| openssl | CSRF 토큰 안전 난수 생성, HTTPS 연결 | mt_rand() 폴백 (보안 강도 낮음) |
| mbstring | 한국어 문자열 처리, 멀티바이트 truncate | 일부 문자열 함수 제한 |
| gd | 썸네일 생성, 이미지 리사이즈, 빌트인 캡차 | 이미지 처리 기능 비활성화 |
| curl | HTTP 외부 요청 (소켓 서버 연동, SMS API) | file_get_contents() 폴백 |
| intl | 국제화, 다국어 문자 처리 | 기능 제한 |
| zip | 파일 압축/해제 | 업로드 ZIP 처리 불가 |
| fileinfo | MIME 타입 정확한 감지 | 확장자 기반 폴백 |
| apcu | 메모리 캐시 (APCu 드라이버) | 파일 캐시로 폴백 |
| redis | Redis 캐시 드라이버 | 파일 또는 APCu 캐시로 폴백 |
| imagick | 고품질 이미지 처리 (GD 대안) | GD 폴백 |
2.3 PHP 설정 권장값
| php.ini 항목 | 권장값 | 설명 |
|---|---|---|
| memory_limit | 256M | 대용량 파일 업로드, 이미지 처리 시 필요 |
| upload_max_filesize | 50M | 관리자 설정의 최대 업로드 크기와 일치 필요 |
| post_max_size | 55M | upload_max_filesize보다 크게 설정 |
| max_execution_time | 60 | 썸네일 일괄 재생성 등 작업 시간 고려 |
| max_input_vars | 3000 | 메뉴 드래그 정렬 등 다수 폼 필드 처리 |
| date.timezone | Asia/Seoul | 서버 기본 시간대 (CMS에서도 별도 설정 가능) |
| session.gc_maxlifetime | 7200 | 세션 유효 시간 (2시간). CMS가 덮어씀 |
| display_errors | Off (운영) | 운영 환경에서는 반드시 Off. CMS가 자동 설정 |
| log_errors | On | 에러를 로그 파일에 기록. CMS가 자동 설정 |
2.4 설치 마법사의 환경 자동 점검
install/index.php 접속 시 STEP 1에서 아래 항목을 자동으로 점검합니다.| 점검 항목 | 판정 기준 | 실패 시 |
|---|---|---|
| PHP 5.6+ | version_compare(PHP_VERSION, "5.6.0", ">=") | 다음 단계 버튼 비활성화 |
| PDO MySQL | extension_loaded('pdo_mysql') | 다음 단계 버튼 비활성화 |
| JSON | extension_loaded('json') | 다음 단계 버튼 비활성화 |
| data/ 쓰기 가능 | is_writable(DX_ROOT . "/data") | 다음 단계 버튼 비활성화 |
| pages/ 쓰기 가능 | is_writable(DX_ROOT . "/pages") | 다음 단계 버튼 비활성화 |
| OpenSSL (권장) | extension_loaded('openssl') | △ 경고 표시, 진행은 가능 |
| Mbstring (권장) | extension_loaded('mbstring') | △ 경고 표시, 진행은 가능 |
| GD (이미지 처리) | extension_loaded('gd') | △ 경고 표시, 진행은 가능 |
3. 데이터베이스 요구사항
3.1 지원 데이터베이스
| DB | 최소 버전 | 권장 버전 | 비고 |
|---|---|---|---|
| MySQL |
5.6
|
8.0+
|
InnoDB FULLTEXT 인덱스 지원 (5.6+) |
| MariaDB |
10.1
|
10.6+
|
MySQL 5.6 호환. FULLTEXT 지원 |
| 기타 (PostgreSQL 등) |
❌ 미지원
|
-
|
PDO MySQL 드라이버 전용 |
3.2 DB 설정 요구사항
| 항목 | 요구값 | 이유 |
|---|---|---|
| 문자셋 (Charset) | utf8mb4 | 한국어 + 이모지 완전 지원. utf8은 4바이트 문자 처리 불가 |
| Collation | utf8mb4_unicode_ci | 대소문자 구분 없는 검색. 한국어 정렬 |
| 스토리지 엔진 | InnoDB | FULLTEXT 인덱스, 트랜잭션, 외래키 지원 |
| innodb_file_per_table | ON (권장) | 테이블별 독립 파일. 관리 용이 |
| ft_min_word_len | 2 (권장) | FULLTEXT 최소 검색 단어 길이. 2자 검색 가능 |
3.3 생성되는 DB 테이블 목록 (총 43개)
schema.sql v5.0.0 기준, 모든 테이블은 IF NOT EXISTS로 생성되어 중복 실행이 안전합니다.| 분류 | 테이블명 | 설명 |
|---|---|---|
| 회원 | dx_members | 회원 정보 (로그인 ID, 비밀번호, 레벨, 포인트 등) |
| 회원 | dx_social_accounts | 소셜 로그인 연동 (카카오, 네이버, 구글, GitHub) |
| 회원 | dx_member_logs | 로그인 이력, 활동 로그 |
| 회원 | dx_member_sessions | 동시 세션 관리 |
| 회원 | dx_friends | 친구 관계 (팔로우) |
| 회원 | dx_memos | 쪽지 (DM) |
| 게시판 | dx_boards | 게시판 설정 (키, 이름, 권한, 스킨 등) |
| 게시판 | dx_board_groups | 게시판 그룹 |
| 게시판 | dx_posts | 게시글 (BIGINT PK, FULLTEXT 인덱스) |
| 게시판 | dx_comments | 댓글 |
| 게시판 | dx_post_files | 첨부파일 |
| 게시판 | dx_post_links | 게시글 내 링크 |
| 게시판 | dx_link_clicks | 링크 클릭 로그 |
| 게시판 | dx_post_drafts | 게시글 임시저장 |
| 게시판 | dx_global_notices | 전체 공지 |
| 분류 | dx_categories | 게시판 분류 (무제한 계층) |
| 상호작용 | dx_likes | 좋아요 (게시글/댓글) |
| 상호작용 | dx_scraps | 스크랩 (북마크) |
| 상호작용 | dx_notifications | 실시간 알림 |
| 상호작용 | dx_dm_messages | 1:1 채팅 메시지 |
| 콘텐츠 | dx_pages | 정적 페이지 (홈, 약관, 소개 등) |
| 콘텐츠 | dx_menus | 내비게이션 메뉴 |
| 콘텐츠 | dx_popups | 팝업 관리 |
| 콘텐츠 | dx_themes | 테마 목록 |
| 회원레벨 | dx_level_config | 레벨 이름•필요 경험치 설정 |
| 포인트 | dx_point_log | 포인트 적립/차감 이력 |
| 경험치 | dx_exp_log | 경험치 획득 이력 |
| 통계 | dx_visits | 일별 방문자 집계 |
| 통계 | dx_visit_logs | 방문 로그 (UA, IP, 참조 URL, 봇 여부) |
| 통계 | dx_search_keywords | 검색어 통계 (FULLTEXT 인덱스) |
| 다운로드 | dx_download_log | 파일 다운로드 이력 |
| 플러그인 | dx_plugins | 플러그인 활성화 상태 |
| 설정 | dx_settings | 전역 CMS 설정 (key-value) |
| 설치 | dx_post_links | |
| 멀티사이트 | dx_sites | 다중 도메인 사이트 설정 |
| 설문 | dx_surveys | 설문 정의 |
| 설문 | dx_survey_questions | 설문 질문 |
| 설문 | dx_survey_answers | 설문 선택지 |
| 설문 | dx_survey_votes | 설문 응답 |
| API | dx_api_keys | REST API 키 관리 |
| API | dx_api_logs | API 요청 로그 |
| SMS | dx_sms_logs | SMS 발송 이력 |
| 상점 | dx_shop_items | 아이템 목록 |
| 상점 | dx_shop_purchases | 구매 이력 |
3.4 테이블 Prefix
기본 prefix는 dx_이며, 설치 시 변경할 수 있습니다. 영문 소문자, 숫자, 밑줄(_)만 사용 가능합니다. 하나의 DB에 여러 DXCMS 인스턴스를 설치할 경우 prefix를 다르게 지정합니다.
// 예: prefix를 "mysite_"로 변경한 경우
// dx_members → mysite_members
// dx_posts → mysite_posts
4. 웹 서버별 설치 환경
4.1 지원 웹 서버 요약
| 웹 서버 | 지원 버전 | URL Rewrite | 설정 파일 | 특이사항 |
|---|---|---|---|---|
| Apache | 2.2 / 2.4 | mod_rewrite (선택) | .htaccess | URL Rewrite 없으면 ?_url= 방식 자동 폴백 |
| Nginx | 1.x 이상 | try_files 설정 | nginx.conf.example 제공 | $uri/ 조건 제거 필수 |
| IIS | 7.0 이상 | URL Rewrite 2.x (선택) | web.config 제공 | URL Rewrite 없는 버전도 web.config 별도 제공 |
| 저가형 호스팅 | 제한적 | 환경에 따라 다름 | .htaccess 기본 적용 | PHP 레벨 폴백으로 대부분 환경 동작 |
핵심 설계 원칙: URL Rewrite 모듈이 없어도 ?_url=/path 방식으로 자동 폴백하므로, 저가형 공유호스팅에서도 기능 제한 없이 동작합니다.
4.2 Apache
필수 모듈
| 모듈 | 필수/선택 | 용도 |
|---|---|---|
| mod_php (또는 PHP-FPM) | 필수 | PHP 실행 |
| mod_rewrite | 선택 (권장) | 깔끔한 URL (/board/notice 형태). 없으면 ?_url= 폴백 |
| mod_alias | 선택 | RedirectMatch로 민감 폴더 차단 |
| mod_headers | 선택 | 보안 헤더 발행. 없으면 PHP(Secure.php)가 대신 발행 |
| mod_authz_core | 선택 | 파일/폴더 접근 제어 (Apache 2.4+) |
.htaccess 파일 구조
루트 .htaccess 외 각 민감 폴더에도 개별 .htaccess가 존재합니다.
| 파일 위치 | 역할 |
|---|---|
| .htaccess (루트) | URL Rewrite, PHP 직접 접근 차단, 보안 헤더, 민감 파일 다운로드 차단 |
| data/.htaccess | data/ 폴더 전체 차단 (uploads/ 서빙은 허용) |
| core/.htaccess | core/ 폴더 전체 직접 접근 차단 |
| core/auth/.htaccess | auth/ PHP 파일 직접 실행 차단 |
| core/security/.htaccess | 보안 경로 폴더 직접 접근 차단 |
| install/.htaccess | 설치 마법사•마이그레이션 PHP 파일 실행 허용 |
| pages/.htaccess pages/ | PHP 파일 직접 실행 차단 |
| themes/.htaccess | themes/ PHP 파일 직접 실행 차단 |
| boards/.htaccess | boards/ PHP 파일 직접 실행 차단 |
4.3 Nginx
설정 핵심 포인트제공 파일: nginx.conf.example (웹 루트에 포함, 참고용)
| 설정 항목 | 값/방식 | 주의사항 |
|---|---|---|
| PHP 실행 | PHP-FPM socket 경유 | fastcgi_pass 경로를 PHP 버전에 맞게 수정 |
| URL Rewrite | try_files $uri /index.php | $uri/ (디렉토리 체크) 반드시 제거 |
| data/ 차단 | location ^~ /data/ { deny all; } | 업로드 이미지는 별도 location으로 서빙 허용 |
| PHP 직접 실행 차단 | location ~ \.php$ { deny all; } | index.php만 예외 허용 |
| install/ PHP 실행 | 별도 location 블록으로 PHP 허용 | 설치 후 폴더 삭제 또는 접근 차단 권장 |
| 에러 페이지 | error_page 403 404 /index.php | CMS가 자체 처리 |
⚠ Nginx 설정에서 try_files에 $uri/를 포함하면 admin/, boards/ 등 실제 폴더가 있어 index.php를 거치지 않고 403이 발생합니다. 반드시 $uri/를 제거하세요.
nginx.conf.example 핵심 블록
# 모든 요청 → index.php (핵심 설정)
location / {
try_files $uri /index.php?$query_string; # $uri/ 없음 (중요!)
}
# PHP 실행 (index.php만)
location = /index.php {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}
4.4 IIS (Windows)
URL Rewrite 모듈 설치 여부에 따른 설정 파일
| 상황 | 사용할 파일 | 설명 |
|---|---|---|
| URL Rewrite 2.x 설치됨 | web.config | 깔끔한 URL 완전 지원. 권장 설정 |
| URL Rewrite 미설치 | web.config.no-rewrite | Rewrite 블록 없음. 500.19 오류 방지. ?_url= 방식으로 동작 |
URL Rewrite 없는 IIS 환경 URL 예시
# URL Rewrite 있을 때
https://site.com/free/view/123
# URL Rewrite 없을 때 (자동 폴백)
https://site.com/index.php?_url=/free/view/123
IIS URL Rewrite 설치 URL
https://www.iis.net/downloads/microsoft/url-rewrite
IIS 필수 설정 항목
| 항목 | 설정값 | 목적 |
|---|---|---|
| 디렉토리 탐색 | disabled | 폴더 목록 노출 방지 |
| 기본 문서 | index.php | PHP 진입점 지정 |
| PHP ISAPI/FastCGI | 설치 필요 | PHP 실행 환경 |
| X-Powered-By 헤더 | 제거 | 서버 정보 은닉 |
5. 디렉토리 권한 설정
5.1 Linux/Unix 권한 설정
| 디렉토리 | 권한 | 이유 |
|---|---|---|
| data/ | 755 또는 777 | config.php, 캐시, 세션, 에러 로그 파일 생성 |
| data/uploads/ | 755 또는 777 | 파일 업로드 저장 디렉토리 |
| pages/ | 755 또는 777 | 페이지 PHP 파일 자동 생성 (에디터 방식) |
| data/cache/ | 755 또는 777 | 파일 캐시 디렉토리 (자동 생성) |
| extend/ | 755 | extend 파일 추가용 |
| core/ | 644 (읽기 전용) | 직접 수정 불가 권장 |
| themes/ | 644 (읽기 전용) | 테마 편집은 FTP/SSH로 |
| 나머지 폴더 | 644 | 기본 읽기 전용 |
Linux 권한 설정 명령어
# 웹 루트에서 실행
chmod 755 data/ data/uploads/ pages/
chown -R www-data:www-data data/ pages/ # Ubuntu/Debian
chown -R apache:apache data/ pages/ # CentOS/RHEL
5.2 Windows IIS 권한 설정
| 폴더 | IIS 앱풀 계정 권한 | 비고 |
|---|---|---|
| data/ | 수정(Modify) | IIS_IUSRS 또는 앱풀 계정에 수정 권한 부여 |
| pages/ | 수정(Modify) | 페이지 파일 자동 생성 |
| 나머지 | 읽기(Read) | 기본 |
⚠ data/ 폴더에 쓰기 권한이 없으면 설치 마법사 STEP 1에서 "data/ 쓰기 가능 ✗" 가 표시되며 설치를 진행할 수 없습니다.