Операционная система:
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