카테고리 보관물: Wordpress

소스코드 플러그인 비교

개요

기술 블로그에서 코드를 게시글에 넣을 때 단순히 일반 텍스트로 삽입하면 가독성이 크게 떨어집니다. 들여쓰기가 무너지고, 문법 요소가 구분되지 않으며, 긴 줄은 줄 번호 없이 보기 어렵습니다. WordPress에서 소스코드를 게시글에 삽입하고 구문 강조(Syntax Highlight) 처리하기 위해 사용하는 소스코드 플러그인들을 비교합니다. Code Syntax Block, Enlighter, SyntaxHighlighter Evolved 등 주요 플러그인의 기능, 지원 언어, 편의성을 비교하여 환경에 맞는 플러그인 선택에 도움을 드립니다.

이 글에서는 Code Syntax Block, Enlighter, SyntaxHighlighter Evolved 세 플러그인을 비교하고, Enlighter의 다양한 테마를 같은 Python 코드로 시각적으로 비교합니다.

플러그인 비교 — 특징 및 추천

세 플러그인은 각각 다른 방향성을 가집니다. Code Syntax Block은 WordPress 5.0 이후의 블록 에디터(Gutenberg)와 완벽하게 통합되며 별도 설정 없이 바로 사용할 수 있습니다. 지원 언어는 제한적이지만 최신 WordPress 블록 기반 편집 경험에 가장 잘 맞습니다. 가볍고 추가 JavaScript 의존성이 없다는 것이 장점입니다.

Enlighter는 이 블로그에서 사용 중인 플러그인으로, 가장 많은 테마(Enlighter, Godzilla, Beyond, Classic, Mowtwo, Eclipse, Dracula, Monokai 등)를 제공합니다. 텍스트 에디터 환경에서도 잘 동작하며, EnlighterJSRAW 클래스를 가진 <pre> 블록만 있으면 JavaScript가 자동으로 렌더링합니다. 터미널/쉘 출력을 포함한 generic 언어 지원이 특히 인프라 관련 블로그에 유용합니다.

SyntaxHighlighter Evolved는 Alex Gorbatchev의 SyntaxHighlighter 라이브러리 기반으로 오랜 역사를 가집니다. 단축코드(shortcode) 방식([code lang="java"])으로 작성하며, 클래식 에디터와의 호환성이 좋습니다.

  • Code Syntax Block ( Python, Default )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Default )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Enlighter )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Godzilla )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Beyond )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Classic )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Mowtwo )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Eclipse )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Droide )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Minimal )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Atomic )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Rowhammer )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Bootstrap4 )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Dracula )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

  • Enlighter Sourcecode ( Python, Monokai )
def get_prime_nums(s, e):
    prime_nums = []

    for i in range(s, e + 1):
        flag = 1
        for j in range(2, i // 2 + 1):
            if i % j == 0:
                flag = 0
                break

        if flag == 1:
            prime_nums.append(i)

    return prime_nums

if __name__ == '__main__':
    s = int(input("Insert Start Number : "))
    e = int(input("Insert Finish Number : "))
#    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
"""
    print(get_prime_nums(s, e))
// 소수를 출력합니다.

Enlighter 테마 선택 기준

Enlighter는 사이트 전체 기본 테마를 WordPress 관리자 화면의 Enlighter 설정(Settings > Enlighter)에서 지정할 수 있습니다. 개별 코드 블록에서 data-enlighter-theme 속성으로 테마를 덮어쓸 수도 있습니다. 위에서 비교한 결과 개인적으로는 다크 계열의 Dracula 또는 Monokai 테마가 터미널 명령어와 함께 쓸 때 가독성이 높습니다. 라이트 테마를 선호한다면 Enlighter(기본)Classic이 깔끔합니다. 어두운 배경과 높은 대비를 원하면 GodzillaEclipse가 좋습니다.

참고

참고 문서: SyntaxHighlighter Evolved 플러그인 · Code Syntax Block 플러그인

WordPress 설치(Apache base)

개요

CentOS 7 환경에서 Apache(httpd) 기반으로 WordPress 설치를 진행하는 전체 절차입니다. Apache → PHP → MariaDB 순서로 설치하고 WordPress 패키지를 DocumentRoot에 배포한 후, wp-config.php에 DB 연결 정보와 Salt 값을 설정하면 브라우저에서 WordPress 설치 마법사 화면에 접근할 수 있습니다.

구성 개요

Apache, PHP, MariaDB 세 컴포넌트를 같은 서버에 설치하는 방식을 LAMP 스택(Linux + Apache + MySQL/MariaDB + PHP)이라 합니다. LAMP 스택은 WordPress의 가장 전통적인 배포 방식으로, 소규모 서비스나 내부 서버에서 간단하게 구성할 수 있습니다. Apache는 PHP 요청을 mod_php로 처리하고, MariaDB는 WordPress의 게시글, 사용자, 설정 데이터를 저장합니다. 이 가이드는 CentOS 7 기준으로 작성되었으나 Rocky Linux 8/9에서도 DNF 명령과 패키지 이름만 일부 변경하면 동일하게 적용할 수 있습니다.

설치 환경

  • OS: CentOS 7 64bit
  • Web Server: Apache 2.4 + mod_ssl
  • Language: PHP 7.2
  • Database: MariaDB 10.3

Apache 설치

mod_ssl 모듈을 포함하여 Apache를 설치합니다. HTTPS를 사용하려면 mod_ssl이 반드시 필요합니다.

# yum install httpd httpd-devel mod_ssl -y

httpd.conf에 VirtualHost 설정을 추가합니다. HTTP 요청은 HTTPS로 리다이렉트하고, SSL VirtualHost에 인증서 경로를 지정합니다. Self-signed 인증서 생성 방법은 Apache HTTPS 구성 — mod_ssl 설치 및 self-signed 인증서 생성을 참고하세요.

<VirtualHost *:80>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
  DocumentRoot /app/doc/wordpress
  ServerName www.<domain>
  ServerAlias www.<domain>
</VirtualHost>

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/ca.crt
  SSLCertificateKeyFile /etc/pki/tls/private/ca.key
  DocumentRoot /app/doc/wordpress
  ServerName www.<domain>
  ServerAlias www.<domain>
</VirtualHost>

ssl.conf에서 인증서 파일 경로를 지정합니다.

SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

PHP 설치

WordPress 운영에 필요한 PHP 7.2와 관련 확장 모듈을 webtatic 저장소를 통해 설치합니다.

# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# yum install mod_php72w php72w-cli -y
# yum install php72w-bcmath php72w-gd php72w-mbstring php72w-mysqlnd php72w-pear php72w-xml php72w-xmlrpc php72w-process -y

# 설치 버전 확인
# php -v

MariaDB 설치 및 WordPress DB 생성

MariaDB 설치 방법은 MariaDB 10.3 설치를 참고하세요. MariaDB 설치 완료 후 WordPress 전용 데이터베이스와 계정을 생성합니다.

# mysql -u root -p

> CREATE DATABASE wordpress CHARACTER SET utf8 COLLATE utf8_bin;
> GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@'localhost' IDENTIFIED BY 'password';
> FLUSH PRIVILEGES;

WordPress 설치 및 설정

WordPress 최신 패키지를 다운로드하고 DocumentRoot 경로에 배포한 후 권한을 설정합니다.

# wget https://wordpress.org/latest.tar.gz
# tar zxvf latest.tar.gz

# mv wordpress /app/doc/
# mkdir /app/doc/wordpress/wp-content/uploads
# chown -R apache:apache /app/doc/wordpress
# chmod -R 755 /app/doc/wordpress

# cd /app/doc/wordpress
# mv wp-config-sample.php wp-config.php

wp-config.php에 DB 연결 정보를 입력합니다.

# vi wp-config.php

define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wordpress');
/** MySQL database password */
define('DB_PASSWORD', 'password');   // 실제 비밀번호로 변경
/** MySQL hostname */
define('DB_HOST', 'localhost');

Salt 값 설정: WordPress Salt Generator에 접속하여 출력된 텍스트를 복사한 후 wp-config.php의 'put your unique phrase here' 항목 전체를 교체합니다.

설치 완료 후 보안 강화

WordPress 설치 마법사를 완료한 후 다음 보안 설정을 추가로 진행합니다. WordPress의 xmlrpc.php는 외부 원격 게시 기능을 제공하지만, 무차별 대입 공격(brute-force)에 자주 악용됩니다. 사용하지 않는다면 Apache에서 접근을 차단합니다. 또한 WordPress 관리자 계정 이름을 admin으로 그대로 사용하면 공격 대상이 되므로, 첫 설치 시 다른 이름으로 설정하거나 설치 후 변경합니다.

# httpd.conf 또는 .htaccess에서 xmlrpc.php 접근 차단
<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

WordPress 파일과 디렉토리 권한은 보안과 기능성의 균형이 중요합니다. PHP가 파일 업로드 및 플러그인 설치를 처리하려면 wp-content/uploadswp-content/plugins에 Apache 프로세스 계정(apache 또는 www-data)의 쓰기 권한이 필요합니다. 그러나 웹 디렉토리 전체를 777로 설정하는 것은 보안 위험이 있으므로, 755(디렉토리)와 644(파일) 조합을 기본으로 하고 uploads 디렉토리만 쓰기 권한을 부여합니다.

서비스 시작 및 접속 확인

Apache 서비스를 시작하고 브라우저에서 서버 IP 또는 도메인 주소로 접속하면 WordPress 설치 마법사 화면이 표시됩니다.

# systemctl enable httpd
# systemctl start httpd

브라우저에서 https://<서버IP>에 접속하면 WordPress 언어 선택 화면이 표시됩니다.

참고

참고 문서: WordPress 공식 설치 가이드 · Apache HTTP Server 2.4 공식 문서