В данной статье описывается процесс создания сайта с использованием системы управления содержимым 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' );
    

Добавить комментарий