CentOS 7에서 Nginx로 MediaWiki 설치 및 구성

개요
MediaWiki는 PHP로 작성된 오픈 소스 위키 소프트웨어로, 위키백과에서 사용하기 위해 개발되었습니다. 이 튜토리얼은 CentOS 7 환경에서 Nginx를 웹 서버로 사용하여 MediaWiki를 설치하는 전체 과정을 다룹니다. 주요 내용은 다음과 같습니다.
- Nginx 설치 및 설정
- PHP-FPM(PHP 7.0) 설치 및 소켓 기반 연동
- MariaDB 데이터베이스 준비
- MediaWiki 소스 다운로드 및 의존성 설치
- Let’s Encrypt로 무료 SSL 발급
- Nginx 가상 호스트 구성
- 웹 설치 및 초기 설정
- 기본 스킨 적용과 운영 권장 사항
중요: 본 문서는 CentOS 7과 MediaWiki 1.30을 기준으로 작성되었습니다. 배포판 버전이나 MediaWiki의 마이너/메이저 업그레이드가 있을 경우 일부 명령어나 패키지 이름이 달라질 수 있습니다.
무엇을 할 것인가
- CentOS 7에 Nginx 설치
- PHP-FPM 설치 및 구성
- MariaDB 설치 및 데이터베이스 생성
- MediaWiki 소스 다운로드 및 의존성 설치
- Let’s Encrypt로 SSL 인증서 발급
- Nginx 가상 호스트 구성
- MediaWiki 웹 기반 설치
- 기본 스킨(예: Vector) 설치 및 활성화
요구사항
- CentOS 7 서버(루트 권한 또는 sudo 권한 필요)
- 공인 도메인 이름(SSL 발급용)
- 인터넷 연결
참고: 용어 한 줄 정의
- PHP-FPM: PHP FastCGI Process Manager — PHP를 웹서버와 분리하여 프로세스로 실행하고 소켓 또는 포트로 통신.
- LEMP: Linux + Nginx(Engine-X) + MariaDB(MySQL 계열) + PHP(FPM).
1단계: CentOS 7에 Nginx 설치
CentOS 7 기본 저장소에는 nginx 패키지가 없으므로 EPEL(Extra Packages for Enterprise Linux) 저장소를 추가한 뒤 설치합니다.
명령어:
yum -y update
yum -y install epel-release
다음으로 Nginx 설치:
yum -y install nginx
설치가 완료되면 서비스를 시작하고 부팅 시 자동 시작하도록 활성화합니다.
systemctl start nginx
systemctl enable nginx
설치 확인을 위해 네트워크 포트 상태를 확인합니다.
netstat -plntu
중요: 방화벽(firewalld)이나 외부 방화벽에서 HTTP(80)와 HTTPS(443)를 허용해야 웹 접근이 가능합니다.
2단계: PHP-FPM 설치 및 구성
이 튜토리얼에서는 PHP 7.0을 사용합니다. CentOS 기본 저장소에 최신 PHP 7.0이 없을 수 있으므로 webtatic 같은 서드파티 저장소에서 설치합니다.
저장소 추가:
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
필요 패키지 설치(이미지 처리, intl, xml, curl 등 포함):
yum -y install ImageMagick php70w-fpm php70w-intl php70w-xml php70w-curl php70w-gd php70w-mbstring php70w-mysql php70w-cli php70w-pear php70w-pecl-apcu
PHP-FPM 설정 변경:
- php.ini 편집
vim /etc/php.ini
다음 줄의 주석을 해제하고 값을 0으로 변경합니다.
cgi.fix_pathinfo=0
- PHP-FPM 풀 설정 편집
vim /etc/php-fpm.d/www.conf
- 사용자 및 그룹을 nginx로 변경
user = nginx
group = nginx
- listen을 소켓 파일로 변경
listen = /run/php-fpm/php-fpm.sock
- 소켓 소유권/권한 설정(주석 해제 및 값 수정)
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
- 안전한 환경 변수 설정(주석 해제)
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
세션 디렉터리 생성 및 권한 설정:
mkdir -p /var/lib/php/session/
chown -R nginx:nginx /var/lib/php/session/
PHP-FPM 서비스 시작 및 자동시작 설정:
systemctl start php-fpm
systemctl enable php-fpm
소켓이 활성화되어 있는지 확인합니다.
netstat -pl | grep php
운영 팁: PHP-FPM을 소켓으로 연결하면 로컬 통신 성능이 좋고 권한 관리가 쉬우며, systemd로 관리되는 경로(/run/…)가 재부팅 시 적절히 관리됩니다.
3단계: MariaDB 설치 및 설정
MediaWiki는 MySQL/MariaDB 또는 SQLite를 지원합니다. 여기서는 MariaDB를 사용합니다.
설치:
yum -y install mariadb mariadb-server
서비스 시작 및 자동 시작 설정:
systemctl start mariadb
systemctl enable mariadb
보안 설정(루트 암호 설정 및 기본 보안 강화):
mysql_secure_installation
프롬프트에 따라 Y 입력 후 루트 비밀번호를 설정하고, 익명 사용자 제거, 원격 루트 로그인 비허용, 테스트 DB 제거 및 권한 테이블 재로딩을 진행합니다.
데이터베이스와 전용 사용자 생성(예시):
mysql -u root -p
# 루트 비밀번호 입력
create database mediawikidb;
grant all privileges on mediawikidb.* to mediawiki@'localhost' identified by 'mypassword';
flush privileges;
exit;
보안 권장사항:
- 실제 환경에서는 ‘mypassword’ 같은 평문 예시 대신 강력한 암호 또는 비밀번호 관리 시스템을 사용하세요.
- 운영 서버에서는 루트 계정으로의 원격 접속을 반드시 비활성화하세요.
4단계: MediaWiki 다운로드 및 준비
MediaWiki 소스(여기서는 core 저장소)를 /var/www/mediawiki에 클론하고 Composer로 의존성을 설치합니다.
필요 패키지 설치:
yum -y install git zip unzip composer
디렉터리 생성 및 소스 클론:
mkdir -p /var/www/mediawiki
git clone https://gerrit.wikimedia.org/r/p/mediawiki/core.git /var/www/mediawiki
의존성 설치(프로덕션용으로 –no-dev 권장):
cd /var/www/mediawiki
composer install --no-dev
소유권 변경(웹서버 사용자로 설정):
chown -R nginx:nginx /var/www/mediawiki
중요: 튜토리얼 본문에 마지막 단계에서 LocalSettings.php 업로드 시 ‘www-data’ 소유권을 변경하라는 지시가 있으나 CentOS에서 nginx를 사용한 경우 소유자는 보통 nginx:nginx입니다. 배포판에 따라 웹 서버 사용자명이 다를 수 있으니(예: Debian 계열에서는 www-data) 배포판에 맞춰 조정하세요.
5단계: CentOS 7에서 Let’s Encrypt SSL 발급
MediaWiki는 HTTPS 환경에서 운영하는 것을 권장합니다. free SSL인 Let’s Encrypt를 사용해 인증서를 발급받습니다.
Certbot 설치(이전에는 letsencrypt 클라이언트를 사용했으나 현재는 certbot 사용을 권장합니다. 본 튜토리얼은 원문을 반영하여 letsencrypt 명령어로 그대로 표기합니다.):
yum -y install letsencrypt
Nginx을 중지한 뒤(임시 웹 서버를 사용해 인증을 받는 경우) 서비스 중지:
systemctl stop nginx
방화벽에 HTTP/HTTPS 서비스 허용:
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
Let’s Encrypt 인증서 발급(인터랙티브):
letsencrypt certonly
명령이 ACME 인증 방식을 물어보면 ‘1’번(임시 웹 서버 사용)을 선택하고, 이메일 입력, TOS 동의(A), 도메인명 입력 등을 진행합니다.
발급 완료 예시:
발급된 인증서는 일반적으로 다음 경로에 저장됩니다:
- /etc/letsencrypt/live/yourdomain/fullchain.pem
- /etc/letsencrypt/live/yourdomain/privkey.pem
운영 팁: Certbot을 사용해 자동 갱신(cron 또는 systemd 타이머)을 설정하세요.
6단계: Nginx 가상 호스트(mediawiki.conf) 구성
다음 예시는 MediaWiki에 적합한 Nginx 서버 블록 설정 예시입니다. 도메인과 인증서 경로는 실제 환경에 맞게 변경하세요.
# HTTP Request will be Redirected to the HTTPS
server {
listen 80;
listen [::]:80;
server_name wiki.hakase-labs.co;
return 301 https://$host$request_uri;
}
# HTTPS Configuration
server {
listen 443 ssl;
listen [::]:443;
server_name wiki.hakase-labs.co;
root /var/www/mediawiki;
index index.php;
autoindex off;
# SSL Certificate Configuration
ssl_certificate /etc/letsencrypt/live/wiki.hakase-labs.co/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.hakase-labs.co/privkey.pem;
client_max_body_size 5m;
client_body_timeout 60;
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?title=$1&$args;
}
location ^~ /maintenance/ {
return 403;
}
# PHP-FPM Configuration Nginx
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
try_files $uri /index.php;
expires max;
log_not_found off;
}
location = /_.gif {
expires max;
empty_gif;
}
location ^~ ^/(cache|includes|maintenance|languages|serialized|tests|images/deleted)/ {
deny all;
}
location ^~ ^/(bin|docs|extensions|includes|maintenance|mw-config|resources|serialized|tests)/ {
internal;
}
# Security for 'image' directory
location ~* ^/images/.*.(html|htm|shtml|php)$ {
types { }
default_type text/plain;
}
# Security for 'image' directory
location ^~ /images/ {
try_files $uri /index.php;
}
}
파일 저장 후 Nginx 설정 문법검사 및 재시작:
nginx -t
systemctl restart nginx
주의: server_name과 인증서 경로는 환경에 맞게 반드시 수정하세요.
7단계: MediaWiki 웹 기반 설치
웹 브라우저에서 wiki 도메인에 접속하면 HTTP->HTTPS 리다이렉션 후 설치 페이지로 이동합니다.
접속 URL 예시:
설치 흐름 요약:
- 언어 선택(예: English)
- 환경 검사(필요 모듈/권한 확인)
- 데이터베이스 정보 입력(예: mediawikidb / mediawiki / mypassword)
- 관리자 계정 생성 및 사이트 메타데이터 입력
- 설치 완료 후 LocalSettings.php 다운로드
LocalSettings.php 파일을 서버의 MediaWiki 루트(/var/www/mediawiki)에 업로드하고 올바른 권한을 설정합니다. 예시(원문은 www-data로 표기되어 있으나 CentOS/Nginx 환경에서는 nginx를 사용 권장):
scp LocalSettings.php [email protected]:/var/www/mediawiki/
chown -R nginx:nginx /var/www/mediawiki
설치 완료 후 사이트 접속 화면 예시:
운영 팁: LocalSettings.php는 민감한 설정 파일입니다. 배포판 백업 또는 버전관리에서 제외하고, 파일 권한을 최소 권한으로 설정하세요.
8단계: 기본 스킨(Vector 설치 및 활성화
Vector 스킨을 스킨 디렉터리에 클론하고 LocalSettings.php에 로드 구문을 추가합니다.
cd /var/www/mediawiki/skins/
sudo git clone https://gerrit.wikimedia.org/r/mediawiki/skins/Vector
권한 설정:
chown -R nginx:nginx /var/www/mediawiki/skins/
LocalSettings.php 편집 후 맨 끝에 다음 추가:
wfLoadSkin( 'Vector' );
브라우저에서 새로고침하면 Vector 스킨이 적용된 모습을 확인할 수 있습니다.
운영 및 보안 권장 사항
중요:
- 모든 서버 구성 파일(예: LocalSettings.php, nginx conf)은 백업해 두고 변경 전에는 항상 테스트 환경에서 검증하세요.
- SSL 자동 갱신을 설정하고 만료 전 알림을 확인하세요.
- MediaWiki 및 확장 기능은 정기적으로 패치하세요.
보안 하드닝 체크리스트:
- PHP cgi.fix_pathinfo = 0 설정 확인
- PHP-FPM 소켓의 소유권/권한 최소화(nginx/nginx, 0660)
- Nginx에서 불필요한 디렉터리 접근 차단(위의 server 블록 예시 참고)
- 데이터베이스 계정 권한 제한(해당 DB만 접근 가능)
- HTTPS 강제 적용 및 HSTS 적용 검토
- 파일 업로드 제한(확장자/크기) 및 바이러스 스캔 정책
권장 Nginx 추가 보안 설정 예시(간단한 HSTS 적용):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
주의: HSTS 적용 시 도메인을 완전히 제어할 수 있고 서브도메인 고려가 되어야 하므로 적용 전 영향 범위를 검토하세요.
문제 해결 가이드
증상별 확인 포인트:
Nginx가 502 Bad Gateway를 반환할 때
- PHP-FPM이 실행 중인지 확인: systemctl status php-fpm
- 소켓 경로(/run/php-fpm/php-fpm.sock) 및 권한 확인
- Nginx fastcgi_pass 설정이 소켓과 일치하는지 확인
설치 페이지에서 파일 권한 관련 오류가 발생할 때
- /var/www/mediawiki 및 하위 파일의 소유자와 권한 확인
- SELinux가 활성화된 경우 세부 보안 컨텍스트 확인(setenforce 0로 임시 테스트 가능)
HTTPS 인증서 관련 오류
- /etc/letsencrypt/live/도메인 경로의 파일 존재 여부 확인
- 방화벽 및 도메인의 A/AAAA 레코드가 올바른지 확인
롤백 및 사고 대응 요령
간단 롤백 절차(설정 변경으로 사이트 동작 중단 시):
- 최신 정상 동작 시점의 LocalSettings.php, nginx conf 백업본을 복원
- systemctl restart nginx && systemctl restart php-fpm
- MariaDB 변경(스키마 변경 등)의 경우 백업 SQL에서 복원
긴급 복구 팁:
- SSH 접속이 가능하면 maintenance 모드로 전환 후 문제 해결 권장
- 복구가 불가능한 경우, 즉시 백업에서 전체 복원(가장 최근의 완전 백업 사용)
검사 및 수락 기준
- 웹 브라우저에서 HTTPS로 접속 후 설치 페이지 접근 가능
- 환경 검사에서 모든 필수 항목이 ‘통과’ 상태
- 데이터베이스 연결 검증 성공
- LocalSettings.php를 업로드하면 위키가 정상적으로 표시
- nginx가 강제로 HTTP를 HTTPS로 리다이렉트
역할별 체크리스트
운영자(시스템 관리자):
- 방화벽 규칙 확인(80/443 허용)
- 서비스 자동 시작 설정(systemd)
- 로그(nginx, php-fpm, mariadb) 모니터링 설정
개발자(컨텐츠/확장 담당):
- 확장 설치 전 호환성 체크(버전 호환)
- 커스텀 스킨/확장 배포 시 테스트 환경에서 검증
보안 담당자:
- SSL 인증서 갱신 자동화 확인
- 데이터베이스 접근 제어 및 감사 로깅 활성화
호환성 및 마이그레이션 노트
- CentOS 7의 PHP 패키지 버전(예: php70w-*)은 배포판에 따라 저장소가 다릅니다. RHEL/CentOS 계열에서는 Remi 또는 Webtatic, SCL 같은 대체 저장소를 사용합니다.
- Debian/Ubuntu로 마이그레이션 시 패키지 이름, 웹서버 사용자명(www-data) 및 서비스 관리 방식(systemd 단위명)은 달라집니다.
- MediaWiki의 메이저 업그레이드 시 스키마 마이그레이션이 필요할 수 있으므로 공식 업그레이드 가이드를 따르세요.
의사결정 트리(설치 방침 선택)
다음 Mermaid 다이어그램은 간단한 의사결정 흐름입니다.
flowchart TD
A[새 MediaWiki 설치가 필요한가?] -->|예| B{운영 환경}
A -->|아니오| Z[업데이트 또는 유지보수]
B -->|CentOS 7| C[LEMP 'Nginx + PHP-FPM + MariaDB']
B -->|Debian/Ubuntu| D[LAMP 또는 LEMP 패턴]
C --> E{SSL 필요?}
E -->|예| F[Let's Encrypt 발급]
E -->|아니오| G[사설 인증서 사용]
F --> H[설치 완료 후 자동 갱신 설정]
체크리스트 템플릿(요약)
- CentOS 7 패키지 업데이트 완료
- Nginx 설치 및 포트 오픈(80/443)
- PHP-FPM 설치 및 소켓 구성
- MariaDB 설치 및 mediawikidb 생성
- MediaWiki 소스 및 Composer 의존성 설치
- Let’s Encrypt로 SSL 발급 및 Nginx 설정
- LocalSettings.php 업로드 및 권한 설정
- 스킨 및 확장 설치, 사이트 기능 확인
간단 문제 재현/테스트 케이스
- 웹 설치 페이지 접속 테스트: HTTP -> HTTPS 리다이렉트 확인
- 환경 체크: 권한, PHP 확장, 파일 업로드 테스트
- 로그인/새 문서 작성/이미지 업로드(이미지 처리) 테스트
- 확장 설치/스킨 변경 후 페이지 렌더링 확인
1줄 용어집
- LocalSettings.php: MediaWiki의 핵심 설정 파일로 설치 과정에서 생성됨.
- Vector: 기본 MediaWiki 스킨 중 하나.
- certbot / letsencrypt: Let’s Encrypt 인증서 발급 도구.
요약
이 문서에서는 CentOS 7 환경에 Nginx 기반 LEMP 스택을 구성하고 MediaWiki를 설치하는 전체 과정을 단계별로 설명했습니다. 설치 후에는 SSL 적용, 권한·소유권 설정, 보안 하드닝과 백업/롤백 절차를 점검하여 안정적으로 운영하시기 바랍니다.
핵심 권장사항:
- PHP-FPM은 소켓(/run/php-fpm/php-fpm.sock)으로 연결하고 소유권을 nginx:nginx로 설정하세요.
- LocalSettings.php는 민감 파일이므로 권한을 최소화하고 백업에서 제외하세요.
- Let’s Encrypt 인증서는 자동 갱신 설정을 권장합니다.
참고 자료: