В данной статье описывается процесс создания сайта с использованием системы управления содержимым WordPress на базе операционной системы Ubuntu 16
Базовая настройка
- устанавливаем Ubuntu 16 и основные пакеты (mc, ssh и т.д.)
- настраиваем брандмауэр (как это сделать, рассказываться здесь)
- устанавливаем Apache
- apt-get install apache2
- проверяем работу Apache, для чего проходим в браузере по ссылке http://wp.domain.local/index.html (при этом должен отобразиться создаваемый автоматически при установке Apache файл /var/www/html/index.html)
- устанавливаем PHP
- apt-get install php php-mysql libapache2-mod-php7.0
- создаем файл /var/www/html/index.php
-
<?php phpinfo(); ?>
- проверяем работу PHP, для чего проходим в браузере по ссылке http://wp.domain.local/index.php (при этом должна быть отображена информация о текущей конфигурации PHP)
- на mysql.domain.local создаем базу данных wordpress и пользователя wordpress, имеющего полный доступ к базе данных, причем только с IP-адреса сервера wp.domain.local (как это сделать, рассказываться здесь)
- cкачиваем дистрибутив WordPress и распаковываем его в папку /var/www/html, предварительно удалив ее содержимое
- создаем копию файла /var/www/html/wordpress/wp-config-sample.php с именем wp-config.php
- вносим в файл /var/www/html/wordpress/wp-config.php изменения
-
define('DB_NAME', 'wordpress'); define('DB_USER', 'wordpress'); define('DB_PASSWORD', 'some_password'); define('DB_HOST', 'mysql.domain.local');
- проходим по ссылке https://api.wordpress.org/secret-key/1.1/salt/ для генерации ключей и вставляем полученные параметры в файл /var/www/html/wordpress/wp-config.php
- проходим по ссылке http://wp.domain.local/wordpress/wp-admin/install.php и выполняем начальную настройку WordPress
- включаем журналирование запросов к веб-серверу, для чего в файл /etc/apache2/apache2.conf добавляем параметр
-
CustomLog ${APACHE_LOG_DIR}/access.log combined
- в файле /etc/apache2/apache2.conf удаляем директиву <Directory /usb/share>, в результате чего в конфигурации должны остаться только следующие параметры доступа к файловой системе
-
<Directory /> Options FollowSymLinks AllowOverride None Require all denied </Directory> <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
- Замечание: параметры применяются в порядке появления в файле конфигурации, таким образом первое правило запрещает любой доступ, а второе - разрешает доступ к папке /var/www/
- включаем модуль rewrite для Apache
- a2enmod rewrite
- в файл /etc/apache2/apache2.conf добавляем правила перезаписи запросов
-
<Directory /var/www/html/wordpress> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </Directory>
- Замечание: без указанных правил доступ будет возможен только к главной странице сайта. Вообще, WordPress автоматически создает файл /var/www/html/wordpress/.htaccess с данными правилами. Однако, поскольку данная конфигурация в целях безопасности запрещает переопределение каких-либо параметров в файлах .htaccess (директива "AllowOverride None" в секции "<Directory /var/www/>"), необходимо вручную указать эти правила в конфигурационном файле Apache
- создаем файл /etc/apache2/sites-available/default.conf следующего содержания
-
<VirtualHost *:80> ServerAdmin [email protected] DocumentRoot /var/www/html </VirtualHost>
- отключаем включенные по умолчанию сайты
- a2dissite 000-default
- включаем сайт "default"
- a2ensite default
- настраиваем владельцев папки с веб-содержимым и права доступа к ней
-
chown -R www-data:www-data /var/www/
find /var/www/ -type d -exec chmod 700 {} \;
find /var/www/ -type f -exec chmod 600 {} \; - перезапускаем Apache
- service apache2 restart
- открываем в браузере консоль администрирования WordPress, для чего проходим по ссылке https://wp.domain.local/wordpress/wp-admin
Настройка HTTPS
- создаем SSL-сертификат (как это сделать, рассказываться здесь) и сохраняем его вместе с сертификатами всех центров сертификации, входящих в цепочку доверия, в файл /etc/apache2/certs/public.cer; закрытый ключ сохраняем в файл /etc/apache2/certs/private.key
- настраиваем владельцев папки с конфигурацией Apache и права доступа к ней
-
chown -R www-data:www-data /etc/apache2
chmod -R 400 /etc/apache2 - включаем модуль ssl для Apache
- a2enmod ssl
- заменяем содержимое файла /etc/apache2/ports.conf
-
Listen 80 Listen 443
- заменяем содержимое файла /etc/apache2/sites-available/default.conf
-
<VirtualHost *:80> Redirect permanent / https://www.domain.com/ </VirtualHost> <VirtualHost *:443> ServerName www.domain.com ServerAdmin [email protected] DocumentRoot /var/www/html/wordpress SSLEngine on SSLCertificateFile /etc/apache2/certs/public.cer SSLCertificateKeyFile /etc/apache2/certs/private.key </VirtualHost>
- Замечание: в результате все HTTP- и HTTPS-запросы будут перенаправляться на адрес www.domain.com. Однако, стоит отметить, что установка SSL-соединения происходит до момента отправки клиентом адреса нужного ему ресурса, вследствие чего у сервера отсутствует возможность выбрать соответствующий сертификат. Таким образом, для того, чтобы при перенаправлении с адреса https://domain.com на адрес https://www.domain.com браузеры не сообщали о возможных угрозах безопасности, установленный на сервере сертификат должен содержать в имени субъекта имена обоих доменов (domain.com и www.domain.com)
- в консоли администрирования WordPress в меню "Настройки - Общие" изменяем адрес сайта с wp.domain.local на www.domain.com (параметры "Адрес WordPress (URL)" и "Адрес сайта (URL)")
- перезапускаем Apache, проходим в браузере по адресу www.domain.com и проверяем, что все содержимое сайта доступно по корректным ссылкам
Настройка усиленной безопасности
- ограничиваем доступ к консоли администрирования, для чего в файл /etc/apache2/apache2.conf добавляем
-
<Directory /var/www/html/wordpress/wp-admin> Require ip 10.1.1.1 </Directory>
- ограничиваем доступ к файлу wp-login.php, для чего в файл /etc/apache2/apache2.conf в начало секции "<Directory /var/www/html/wordpress>" добавляем
-
<Files «wp-login.php»> Require ip 10.1.1.1 </Files>
- ограничиваем доступ к файлу wp-config.php, для чего в файл /etc/apache2/apache2.conf в начало секции "<Directory /var/www/html/wordpress>" добавляем
-
<Files «wp-config.php»> Require all denied </Files>
- запрещаем выполнение скриптов в папке "WP-Includes", для чего в файл /etc/apache2/apache2.conf в конец секции "<Directory /var/www/html/wordpress>" добавляем
-
RewriteRule ^wp-admin/includes/ — [F,L] RewriteRule !^wp-includes/ — [S=3] RewriteRule ^wp-includes/[^/]+\.php$ — [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php — [F,L] RewriteRule ^wp-includes/theme-compat/ — [F,L]
- запрещаем выполнение скриптов в папке "WP-Content/Uploads", для чего в файл /etc/apache2/apache2.conf добавляем
-
<Directory /var/www/html/wordpress/wp-content/uploads> <Files *.php> Require all denied </Files> </Directory>
- отключаем возможность редактирование файлов в консоли администрирования, для чего в конец файла /var/www/html/wordpress/wp-config.php добавляем
-
define(‘DISALLOW_FILE_EDIT’, true);
Отключение форматирования текста
- добавляем в файл /var/www/html/wordpress/wp-content/themes/
/functions.php -
add_filter( 'run_wptexturize', '__return_false' );