it

WordPress Headless Production Setup Guide —

WordPress Headless Production Setup Guide —

เตรียมความพร้อมสำหรับ Production

WordPress Headless Production Setup Guide —

การนำ WordPress Headless ขึ้น Production ต้องเตรียมหลายด้าน ได้แก่ Server Configuration ที่เหมาะสม, Security Hardening ป้องกันการโจมตี, Performance Optimization ให้ API ตอบสนองเร็ว, Backup Strategy ป้องกันข้อมูลสูญหาย และ Monitoring ติดตามปัญหา

WordPress Headless ใช้เป็น API Server อย่างเดียว ไม่ต้อง Render Frontend ทำให้ Optimize ได้ง่ายกว่า WordPress ปกติ แต่ต้องให้ความสำคัญกับ API Performance และ Security เป็นพิเศษ

Nginx Configuration สำหรับ WordPress Headless

# === Nginx Configuration สำหรับ WordPress Headless ===
# /etc/nginx/sites-available/wp-headless.conf

# Rate Limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

# Upstream PHP-FPM
upstream php-fpm {
    server unix:/run/php/php8.3-fpm.sock;
    keepalive 16;
}

# Redirect HTTP to HTTPS
server {
    listen 80;
    server_name api.example.com;
    return 301 https://$host$request_uri;
}

# Main Server Block
server {
    listen 443 ssl http2;
    server_name api.example.com;
    root /var/www/wordpress;
    index index.php;

    # SSL
    ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # Security Headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # CORS สำหรับ Headless Frontend
    set $cors_origin "";
    if ($http_origin ~* "^https://(www\.)?example\.com$") {
        set $cors_origin $http_origin;
    }
    add_header Access-Control-Allow-Origin $cors_origin always;
    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
    add_header Access-Control-Allow-Headers "Authorization, Content-Type" always;
    add_header Access-Control-Max-Age 86400 always;

    if ($request_method = OPTIONS) {
        return 204;
    }

    # FastCGI Cache สำหรับ API
    fastcgi_cache_path /tmp/nginx-cache levels=1:2
        keys_zone=wpcache:100m max_size=1g inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";

    # REST API — Cache 60 วินาที
    location /wp-json/ {
        limit_req zone=api burst=50 nodelay;

        fastcgi_cache wpcache;
        fastcgi_cache_valid 200 60s;
        fastcgi_cache_bypass $http_authorization;
        add_header X-Cache-Status $upstream_cache_status;

        try_files $uri $uri/ /index.php?$args;
    }

    # GraphQL — Cache 60 วินาที (GET only)
    location /graphql {
        limit_req zone=api burst=50 nodelay;

        fastcgi_cache wpcache;
        fastcgi_cache_valid 200 60s;
        fastcgi_cache_methods GET;
        fastcgi_cache_bypass $http_authorization;

        try_files $uri $uri/ /index.php?$args;
    }

    # wp-admin — จำกัด IP
    location /wp-admin {
        allow 10.0.0.0/8;
        allow 192.168.1.0/24;
        # allow YOUR_OFFICE_IP;
        deny all;
        try_files $uri $uri/ /index.php?$args;
    }

    # wp-login — Rate Limit
    location = /wp-login.php {
        limit_req zone=login burst=3 nodelay;
        allow 10.0.0.0/8;
        deny all;
        include fastcgi_params;
        fastcgi_pass php-fpm;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # Block XML-RPC
    location = /xmlrpc.php {
        deny all;
        return 403;
    }

    # Block wp-cron (use system cron instead)
    location = /wp-cron.php {
        deny all;
    }

    # PHP Processing
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php-fpm;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 300;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
    }

    # Static Files — Cache ยาว
    location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff2|woff|ttf)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # Block sensitive files
    location ~ /\.(ht|git|env) {
        deny all;
    }
    location ~ /wp-config\.php {
        deny all;
    }
}

wp-config.php สำหรับ Production

=== wp-config.php — Production Settings ===

เพิ่มหลัง DB Settings ใน wp-config.php

--- Performance ---

Redis Object Cache

define('WP_REDIS_HOST', '127.0.0.1');

define('WP_REDIS_PORT', 6379);

define('WP_REDIS_DATABASE', 0);

define('WP_REDIS_PREFIX', 'wp_');

Disable File Editing

define('DISALLOW_FILE_EDIT', true);

define('DISALLOW_FILE_MODS', true);

Limit Revisions

define('WP_POST_REVISIONS', 5);

define('AUTOSAVE_INTERVAL', 300);

Memory

define('WP_MEMORY_LIMIT', '256M');

define('WP_MAX_MEMORY_LIMIT', '512M');

Cron — ใช้ System Cron แทน

define('DISABLE_WP_CRON', true);

เพิ่มใน crontab: */5 * * * * curl -s https://api.example.com/wp-cron.php > /dev/null

--- Headless Mode ---

define('WP_HOME', 'https://api.example.com');

define('WP_SITEURL', 'https://api.example.com');

define('HEADLESS_MODE_CLIENT_URL', 'https://www.example.com');

Disable Frontend Theme Rendering

ใช้ Plugin "Headless Mode" หรือเพิ่มใน functions.php:

WordPress Headless Production Setup Guide —

add_action('template_redirect', function() {

เนื้อหาเกี่ยวข้อง — kháng cự và hỗ trợ — ทุกสิ่งที่ต้องรู้ในปี 2026

if (!is_admin() && !wp_doing_ajax() &&

!defined('REST_REQUEST') && !defined('GRAPHQL_REQUEST')) {

wp_redirect('https://www.example.com');

exit;

}

});

--- Security ---

แนะนำเพิ่มเติม — SiamCafeBook

define('FORCE_SSL_ADMIN', true);

define('WP_DEBUG', false);

define('WP_DEBUG_LOG', false);

define('WP_DEBUG_DISPLAY', false);

Security Keys (generate from https://api.wordpress.org/secret-key/1.1/salt/)

define('AUTH_KEY', '...');

define('SECURE_AUTH_KEY', '...');

define('LOGGED_IN_KEY', '...');

define('NONCE_KEY', '...');

=== PHP-FPM Configuration ===

/etc/php/8.3/fpm/pool.d/wordpress.conf

[wordpress]

user = www-data

group = www-data

listen = /run/php/php8.3-fpm.sock

pm = dynamic

pm.max_children = 50

pm.start_servers = 10

pm.min_spare_servers = 5

pm.max_spare_servers = 20

เนื้อหาเกี่ยวข้อง — บทความที่เกี่ยวข้อง: LangChain Agent Certification Path

pm.max_requests = 500

php_admin_value[memory_limit] = 256M

php_admin_value[upload_max_filesize] = 64M

php_admin_value[post_max_size] = 64M

php_admin_value[max_execution_time] = 300

php_admin_value[opcache.enable] = 1

php_admin_value[opcache.memory_consumption] = 256

php_admin_value[opcache.max_accelerated_files] = 20000

Backup และ Monitoring Scripts

!/bin/bash

wp-backup.sh — Automated Backup Script สำหรับ WordPress

เพิ่มใน crontab: 0 2 * * * /opt/scripts/wp-backup.sh

set -e

Configuration

WP_DIR="/var/www/wordpress"

แนะนำเพิ่มเติม — คอร์สเทรด Forex ที่ iCafeForex

DB_NAME="wordpress"

DB_USER="wp_user"

DB_PASS="secure_password"

BACKUP_DIR="/backups/wordpress"

S3_BUCKET="s3://my-backups/wordpress"

RETENTION_DAYS=30

DATE=$(date +%Y%m%d_%H%M%S)

echo "[$(date)] Starting WordPress backup..."

สร้าง Backup Directory

mkdir -p "$BACKUP_DIR"

1. Database Backup

echo " Backing up database..."

mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" \

เนื้อหาเกี่ยวข้อง — Nginx Plus Audit Trail Logging

--single-transaction --quick --lock-tables=false \

| gzip > "$BACKUP_DIR/db_.sql.gz"

2. Files Backup (wp-content only — ไม่ต้อง Backup Core)

echo " Backing up wp-content..."

tar czf "$BACKUP_DIR/files_.tar.gz" \

-C "$WP_DIR" wp-content/ \

--exclude="wp-content/cache" \

--exclude="wp-content/upgrade"

3. Upload to S3 (ถ้ามี AWS CLI)

if command -v aws &> /dev/null; then

echo " Uploading to S3..."

aws s3 cp "$BACKUP_DIR/db_.sql.gz" "$S3_BUCKET/"

aws s3 cp "$BACKUP_DIR/files_.tar.gz" "$S3_BUCKET/"

fi

4. ลบ Backup เก่า

echo " Cleaning old backups..."

find "$BACKUP_DIR" -name "*.gz" -mtime +$RETENTION_DAYS -delete

5. ตรวจสอบ Backup Size

DB_SIZE=$(du -h "$BACKUP_DIR/db_.sql.gz" | cut -f1)

FILES_SIZE=$(du -h "$BACKUP_DIR/files_.tar.gz" | cut -f1)

echo "[$(date)] Backup complete!"

echo " Database: $DB_SIZE"

echo " Files: $FILES_SIZE"

=== Monitoring Script ===

wp-monitor.sh — ตรวจสอบสถานะ WordPress

#!/bin/bash

# ตรวจสอบ WordPress API

เนื้อหาเกี่ยวข้อง — บทความที่เกี่ยวข้อง: GitHub Actions Matrix Interview Preparation

API_URL="https://api.example.com"

ALERT_EMAIL="admin@example.com"

# Check REST API

HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \

"$API_URL/wp-json/wp/v2/posts?per_page=1")

if [ "$HTTP_CODE" != "200" ]; then

echo "WordPress API DOWN! HTTP $HTTP_CODE" | \

mail -s "ALERT: WordPress API Down" "$ALERT_EMAIL"

fi

# Check Response Time

RESPONSE_TIME=$(curl -s -o /dev/null -w "%{time_total}" \

"$API_URL/wp-json/wp/v2/posts?per_page=1")

# Alert if response > 2 seconds

if (( $(echo "$RESPONSE_TIME > 2.0" | bc -l) )); then

echo "WordPress API SLOW! s" | \

mail -s "ALERT: WordPress API Slow" "$ALERT_EMAIL"

fi

# Check Disk Usage

DISK_USAGE=$(df -h /var/www/wordpress | tail -1 | awk '{print $5}' | tr -d '%')

if [ "$DISK_USAGE" -gt 80 ]; then

echo "Disk usage: %" | \

mail -s "ALERT: Disk Usage High" "$ALERT_EMAIL"

fi

echo "[$(date)] Health: HTTP=$HTTP_CODE Time=s Disk=%"

Production Checklist

  • SSL/HTTPS: ติดตั้ง SSL Certificate บังคับ HTTPS ทุก Connection ใช้ Let's Encrypt (ฟรี)
  • Security Plugins: ติดตั้ง Wordfence หรือ Sucuri ป้องกัน Brute Force และ Malware
  • Redis Cache: ติดตั้ง Redis และ Redis Object Cache Plugin ลด Database Load
  • CDN: ใช้ Cloudflare หรือ CloudFront Cache Static Assets และ API Responses
  • Backup: ตั้ง Automated Backup ทุกวัน เก็บทั้ง Local และ Cloud ทดสอบ Restore
  • Monitoring: ติดตาม API Response Time, Error Rate, Disk Usage ตั้ง Alert
  • Updates: Update WordPress, Plugins, PHP อย่างสม่ำเสมอ ทดสอบใน Staging ก่อน
  • CORS: อนุญาตเฉพาะ Frontend Domain ไม่ใช้ wildcard (*)

WordPress Headless Production ต้องเตรียมอะไรบ้าง

Web Server (Nginx), PHP 8.x, MySQL/MariaDB, Redis Object Cache, SSL Certificate, CDN, Backup System, Monitoring ติดตั้ง WPGraphQL, ACF, Yoast SEO และ Security Plugins

XM Legend · เทรดเดอร์ & ผู้สอน Forex 13 ปี

ผู้ก่อตั้ง SiamCafe ตั้งแต่ปี 1997 · เทรดเดอร์สาย Forex มากกว่า 13 ปี ได้รับการยกย่องเป็น XM Legend · แบ่งปันความรู้ Forex, ไอที, AI และการเทรด จากประสบการณ์จริงในตลาดจริง