Настройка apache для wordpress с ssl на Debian 12(bookworm)

Операционная система:
Operating System: Debian GNU/Linux 12 (bookworm)
Kernel: Linux 6.1.0-9-amd64
Architecture: x86-64

1. Установка необходимых компонентов


# Обновление системы
sudo apt update
sudo apt upgrade

# Установка Apache2 и SSL модуля
sudo apt install apache2
sudo a2enmod ssl
sudo a2enmod rewrite
sudo a2enmod headers

# Перезагрузка Apache
sudo systemctl restart apache2

2. Создание SSL сертификатов (3 варианта)
Вариант A: Самоподписанный сертификат (для тестирования)

# Создание директории для сертификатов
sudo mkdir -p /etc/ssl/private
sudo mkdir -p /etc/ssl/certs

# Создание самоподписанного сертификата
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/wordpress.key \
    -out /etc/ssl/certs/wordpress.crt \
    -subj "/C=RU/ST=Moscow/L=Moscow/O=Company/CN=your-domain.com"

Вариант B: Бесплатные сертификаты Let’s Encrypt
VirtualHost должен быть на строен только на 80 порт (Let’s Encrypt сам все подправит)

# Установка Certbot
sudo apt install certbot python3-certbot-apache

# Получение сертификата
sudo certbot --apache -d your-domain.com -d www.your-domain.com

Вариант C: Использование существующих сертификатов
Разместите ваши файлы сертификатов в:
/etc/ssl/certs/your-domain.crt
/etc/ssl/private/your-domain.key
3. Настройка портов в Apache (/etc/apache2/ports.conf)

Listen 80

<IfModule ssl_module>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

4. Создание виртуального хоста для WordPress
Создаем файл:

nano /etc/apache2/sites-available/wordpress-ssl.conf
# HTTP → HTTPS редирект
<VirtualHost *:80>
    ServerName your-domain.com
    ServerAlias www.your-domain.com
    
    # Перенаправление всех HTTP запросов на HTTPS
    Redirect permanent / https://your-domain.com/
    
    # Логи
    ErrorLog ${APACHE_LOG_DIR}/wordpress_error.log
    CustomLog ${APACHE_LOG_DIR}/wordpress_access.log combined
</VirtualHost>

# Основной HTTPS хост
<VirtualHost *:443>
    ServerName your-domain.com
    ServerAlias www.your-domain.com
    DocumentRoot /var/www/wordpress
    
    # Директория WordPress
    <Directory /var/www/wordpress>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
        
        # Безопасность
        Options -Indexes
        
        # Защита от включений
        <FilesMatch "\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl|svn-base)$|^(code-style\.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format)$">
            Require all denied
        </FilesMatch>
    </Directory>
    
    # SSL конфигурация
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/wordpress.crt
    SSLCertificateKeyFile /etc/ssl/private/wordpress.key
    
    # Дополнительная SSL безопасность
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 +TLSv1.3
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder off
    SSLSessionTickets off
    
    # HTTP/2 для лучшей производительности
    Protocols h2 http/1.1
    
    # Заголовки безопасности
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
    Header always set X-Content-Type-Options nosniff
    Header always set X-Frame-Options SAMEORIGIN
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    
    # Логи
    ErrorLog ${APACHE_LOG_DIR}/wordpress_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/wordpress_ssl_access.log combined
    
    # Настройки для WordPress
    <IfModule mod_rewrite.c>
        RewriteEngine On
        
        # Редирект с www на non-www (или наоборот)
        RewriteCond %{HTTP_HOST} ^www\.your-domain\.com [NC]
        RewriteRule ^(.*)$ https://your-domain.com/$1 [L,R=301]
    </IfModule>
</VirtualHost>

5. Настройка файла .htaccess для WordPress
Создаем/редактируем

nano/var/www/wordpress/.htaccess
# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# Редирект HTTP → HTTPS (дополнительная страховка)
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Стандартные правила WordPress
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

# Дополнительная безопасность
<FilesMatch "\.(env|ini|log|sh|sql)$">
    Require all denied
</FilesMatch>

<Files wp-config.php>
    Require all denied
</Files>

<Files xmlrpc.php>
    Require all denied
</Files>

# Кэширование для статических файлов
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/pdf "access plus 1 month"
    ExpiresByType text/javascript "access plus 1 month"
    ExpiresByType text/html "access plus 600 seconds"
    ExpiresByType application/javascript "access plus 1 month"
</IfModule>

6. Настройка WordPress для SSL
Редактируем /var/www/wordpress/wp-config.php (добавить перед /* That’s all, stop editing! */):
Способ A: Через wp-config.php


// Принудительное использование SSL
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);

// Установка HTTPS URL
define('WP_HOME', 'https://your-domain.com');
define('WP_SITEURL', 'https://your-domain.com');

// Определение HTTPS для прокси
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS'] = 'on';
}

// Явное указание HTTPS
$_SERVER['HTTPS'] = 'on';

// Дополнительные настройки безопасности
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', false);


Способ B: Через базу данных (если нет доступа к файлам)


UPDATE wp_options SET option_value = 'https://your-domain.com' WHERE option_name = 'home';
UPDATE wp_options SET option_value = 'https://your-domain.com' WHERE option_name = 'siteurl';

7. Активация конфигурации

# Отключаем стандартный хост (если нужно)
sudo a2dissite 000-default.conf

# Включаем наш SSL хост
sudo a2ensite wordpress-ssl.conf

# Проверяем конфигурацию
sudo apache2ctl configtest

# Перезагружаем Apache
sudo systemctl reload apache2
# или
sudo systemctl restart apache2

8. Настройка прав доступа


# Устанавливаем правильные права
sudo chown -R www-data:www-data /var/www/wordpress
sudo find /var/www/wordpress/ -type d -exec chmod 755 {} \;
sudo find /var/www/wordpress/ -type f -exec chmod 644 {} \;

# Особые права для wp-content
sudo chmod -R 775 /var/www/wordpress/wp-content/
sudo chmod 640 /var/www/wordpress/wp-config.php

 

Оставьте комментарий

Прокрутить вверх