CMS-установка вне корневого документа для всех доменов

Как настроить установку CMS, такую ​​как WordPress или Drupal, для запуска на нескольких веб-сайтах в качестве репликации одной основной установки CMS. Владеет и управляется разными учетными записями серверов, размещенными на одном сервере.

Моя настройка аналогична следующей:

  • Программное обеспечение Webserver: nginx работает вместе с apache2 (VestaCP)
  • Корень документа: /home/user/example.com/public_html/

Что я имею в виду, "репликация одной установки CMS":

Как описано на диаграмме, все пользователи, владеющие папкой, на которой указывается DocumentRoot, смогут реплицировать/создать экземпляр/использовать установку CMS.

Для запуска установки CMS вам, вероятно, понадобятся следующие файлы:

  • DocumentRoot/configuration.php - укажите, какие данные должна загружать CMS.
  • DocumentRoot/index.php - Вызвать и отобразить указанный вывод.

Single CMS installation


WordPress

Чтобы разобраться, какой подход будет работать, я мог бы придумать эти два разных сценария:

  • где есть только одна символьная связанная папка, в эту папку входят файлы wordpress core.
  • все основные файлы и папки wordpress символически связаны.

В обоих сценариях установка пытается создать собственный файл конфигурации (my-config.php), а не тот, который символически связан.

1: Символическая связанная папка Wordpress:

WordPress/WP-config.php

<?php
require_once( ROOT_PATH . 'my-config.php');
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

require_once(ABSPATH . 'wp-settings.php');

WordPress/test.php

<?php echo 'Path is '.getcwd(); ?>

DocumentRoot/index.php

<?php
define('ROOT_PATH', dirname(__FILE__) . '/');
require('wordpress/index.php');

DocumentRoot/мой-config.php

Содержит все, кроме кода внутри wordpress/wp-config.php

<?php
define('WP_HOME', ... );
define( 'WP_CONTENT_URL', ... );
etc..

Символьная ссылка следующая:

ln -s /path/to/wordpress/ .

Мои результаты

  • [Посещенные URL] - [Результаты тестирования]
  • ../- Перенаправление на:../wp-admin/install.php + 404
  • ../wp-admin/- 404
  • ../wordpress/- WSOD
  • ../wordpress/wp-admin/- WSOD
  • ../wordpress/test.php - Выход: Путь/путь/в/wordpress

2: Другой подход может быть примерно таким:

WordPress/WP-config.php

<?php
require_once('my-config.php'); // So DocumentRoot/my-config.php
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

require_once(ABSPATH . 'wp-settings.php');

WordPress/test.php

<?php echo 'Path is '.getcwd(); ?>

DocumentRoot/мой-config.php

То же, что и файл конфигурации DocumentRoot, используемый в сценарии 1.

Символьные ссылки следующие:

ln -s /path/to/wordpress/* .

Мои результаты

  • [Посещенные URL] - [Результаты тестирования]
  • ../- Перенаправление на:../wp-admin/install.php + WSOD
  • ../wp-admin/- WSOD
  • ../test.php - Результат: Путь /home/user/example.com/public_html

Заключение WordPress

В обоих сценариях основной файл индекса перенаправляется к установочному файлу. Обычно это происходит, когда соединение с базой данных было сделано, но база данных по-прежнему пуста, поэтому, следуя инструкциям по установке, вы вставляете свои первые данные. Но тогда почему он дает WSOD?

Тестовый файл (test.php) немного разряжается. В сценарии 1 путь к файлу wordpress становится абсолютным путем для файлов ядра wordpress. Для сценария 2 путь DocumentRoot становится абсолютным путем для файлов ядра wordpress... или нет?

Хотя не для вспомогательных каталогов в каталоге wordpress, как мы можем узнать из сценария 1. Например, каталог wp-admin, файлы, на которые вызов getcwd() должен выводить /path/to/wordpress/wp-admin правильно? Если это так, значит, все вызовы файлов в этих каталогах никогда не найдут файл. Поскольку файл /home/user/example.com/public_html/wp-admin/file.php не существует! Он не символически связан и поэтому доступен только через /path/to/wordpress/wp-admin/file.php.

Ответ 1

Наконец-то!

Я нашел способ использовать один набор файлов ядра WordPress для запуска нескольких веб-сайтов без использования WP Multisite или любых существенных изменений в основных файлах.

Этот пример основан на следующей структуре:

var/
|
├── core/ # chown -R www-data:www-data .
|   |     # find . -type d -exec chmod 755 {} \;
|   |     # find . -type f -exec chmod 644 {} \;
|   ├── wp-admin/
|   ├── wp-content/
|   |   ├── themes/
|   |   ├── plugins/
|   |   └── languages/
|   ├── wp-includes/
|   └── wp-config.php
|   └── # all other wordpress core files...
|
├── sites/ # chown -R www-data:www-data .
|   |      # find . -type d -exec chmod 775 {} \;
|   |      # find . -type f -exec chmod 664 {} \;
|   ├── alpha/
|   |   ├── wp-admin -> /var/core/wp-admin/
|   |   |   # ln -s /var/core/wp-admin /var/sites/alpha/
|   |   ├── wp-includes -> /var/core/wp-includes/
|   |   |   # ln -s /var/core/wp-includes /var/sites/alpha/
|   |   ├── wp-content/
|   |   |   └── . # files only available for alpha
|   |   ├── wp-login.php -> /var/core/wp-login.php
|   |   |   # ln -s /var/core/wp-admin /var/sites/alpha/    
|   |   └── index.php
|   └── beta/
|   |   ├── wp-admin -> /var/core/wp-admin/
|   |   |   # ln -s /var/core/wp-admin /var/sites/beta/
|   |   ├── wp-includes -> /var/core/wp-includes/
|   |   |   # ln -s /var/core/wp-includes /var/sites/beta/
|   |   ├── wp-content/
|   |   |   └── . # files only available for beta
|   |   ├── wp-login.php -> /var/core/wp-login.php
|   |   |   # ln -s /var/core/wp-admin /var/sites/beta/ 
|   |   └── index.php
|   └── . # etc...
.

В /var/core/wp-config.php внести следующие изменения:

<?php
if (defined('MULTIPRESS_ABSPATH')) {
    require_once(MULTIPRESS_ABSPATH . 'wp-config.php');
} else {
    $instance_path = $_SERVER['SCRIPT_FILENAME'];
    if (strpos($instance_path, 'wp-admin') > -1) {
        $instance_path = dirname(dirname($instance_path)) . '/';
    } else {
        $instance_path = dirname($instance_path) . '/';
    }
    require_once($instance_path . 'wp-config.php');
}

Оставьте все остальные файлы ядра по своему усмотрению, вы можете добавить некоторые плагины или темы в этот основной каталог wp-content, чтобы сделать их доступными по всему миру для всех сайтов/экземпляров.

Теперь мы можем настроить экземпляр этого ядра WP MultiPress. Ниже вы можете увидеть /var/sites/alpha/wp-config.php альфа-сайта. Обычно вам нужно только определить уникальные ключи и соли и ваши настройки MySQL. Рядом с этим вы также можете настроить собственное имя для своего каталога wp-content.

<?php
/* -------------------------------------------- *
**  MySQL settings.                            **
* -------------------------------------------- */
define('DB_NAME', 'wp_multipress');
define('DB_USER', 'manager');
define('DB_PASSWORD', 'mylittlepony');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
$table_prefix = 'alpha_';


/* -------------------------------------------- *
**  Authentication Unique Keys and Salts.      **
* -------------------------------------------- */
// Generate a set of keys:
// https://api.wordpress.org/secret-key/1.1/salt/


/* -------------------------------------------- *
**  Dynamically determine the WP root URL.     **
* -------------------------------------------- */
$path = trim(substr((strpos(dirname(__FILE__),'wp-admin')===false)?dirname(__FILE__):strstr(dirname(__FILE__),'/wp-admin'), strlen(rtrim($_SERVER['DOCUMENT_ROOT'],'/'))), '/');
$domain = !empty($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:$_SERVER['SERVER_NAME']; $force_domain = $domain;
$http = 'http'.(isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!='off'?'s':'').'://'; $force_http = $http;

// Uncomment the line below to force to https
//$force_http = strpos($http,'https')===false?'https://':$http;

// Uncomment the line below to force to www.
//$force_domain = strpos($domain,'www.')===false?'www.'.$domain:$domain;

// Or uncomment the line below to prevent access to www.
//$force_domain = strpos($domain,'www.')!==false?substr($domain,strpos($domain,'www.')):$domain;

$url = $force_http.$force_domain.(!empty($path)?'/'.$path:'');
if ($force_http!==$http||$force_domain!==$domain){ header('Location: '.$url);exit(); }


 /* -------------------------------------------- *
 **  General settings.                          **
 * -------------------------------------------- */
define('WP_HOME', $url);
define('WP_SITEURL', $url);
define('WP_TEMP_DIR', sys_get_temp_dir());


/* -------------------------------------------- *
**  File System settings.                      **
* -------------------------------------------- */
define('FS_METHOD', 'direct');
define('WP_CONTENT_DIR', dirname(__FILE__).'/wp-content');


/* -------------------------------------------- *
**  Debug settings.                            **
* -------------------------------------------- */
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', false);
define('SAVEQUERIES', false);


/* -------------------------------------------- *
**  Cache settings.                            **
* -------------------------------------------- */
define('COMPRESS_CSS', true);
define('COMPRESS_SCRIPTS', true);
define('CONCATENATE_SCRIPTS', true);
define('ENFORCE_GZIP', true);


/* -------------------------------------------- *
**  WordPress Localized Language.              **
* -------------------------------------------- */
define('WPLANG', '');


/* -------------------------------------------- *
**  That all, stop editing! Happy blogging.  **
* -------------------------------------------- */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');

Далее - индекс экземпляра, посмотрите ниже /var/sites/alpha/index.php.

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Let MultiPress render this website.
 *
 * @var string
 */
define('MULTIPRESS_ABSPATH', dirname( __FILE__ ) . '/');

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template from MultiPress */
require( '/var/core/wp-blog-header.php' );

Убедитесь, что все файлы в /var/core/ доступны для чтения для всех процессов, на которых запущены сайты. Также не забудьте создать символические ссылки (показано в -> в примере структуры).

Это должно сделать это!

Ответ 2

На самом деле это довольно легко сделать, ключ, конечно же, - это ваши индексные файлы. MVC, и я просто бросаю Wordpress в эту категорию очень свободно, у всех есть одна точка входа. Очевидно, что точкой входа для большинства из них является индексный файл.

Действительно, это то, что единственным запрошенным файлом является индексный файл, это действительно единственный код, который вызывается. Остальная часть материала, который запускается, маршрутизируется, потому что индексный файл жестко связан с кодом, который знает, как это сделать.

Итак, все, что вам нужно сделать, - это указать индексный файл обратно на код, на который он указывал, когда вы его перемещаете. Для веб-сервера не имеет значения, где какой-либо из файлов, потому что он ничего не передает им только индекс. PHP может обращаться к файлам, пока пользователь системы, с которыми он использует, может обращаться к файлам.

Может быть сложнее иметь отдельные файлы конфигурации для каждого из них, например, если вы хотите использовать отдельную базу данных. Большинство систем CMS или MVC не позволяют вам сообщать им, где находится файл конфигурации, это просто в каком-то произвольном месте. Сбой, который у вас будет в wordpress, заключается в том, что в общих настройках у вас есть URL-адрес сайта и URL-адрес wordpress. К сожалению, они находятся в базе данных, что затрудняет их изменение. Также вы, вероятно, не хотите точно одинакового меню для каждого сайта.

Так что, действительно, используя пример wordpress, вам нужно будет включить конфигурационные файлы в другом месте, связав их с фактическим конфигурационным файлом Load it when WordPress wants it to load:. Я думаю, что ваш примерный файл конфигурации находится на правильном пути, но вам придется использовать отдельные базы данных из-за URL-адреса url и wordpress.

Этот факт на самом деле затрудняет поддержку не так просто, потому что Wordpress не обязательно обновляет правильную базу данных при выполнении обновлений до ядра.

URL-адрес сайта должен быть фактическим доменом. URL-адрес wordpress - это доступ к вашему admin script. Так что есть и эта часть, чтобы разобраться, wp-admin.

В любом случае удачи и обязательно измените эти настройки на общей вкладке в области администрирования Wordpress.

UPDATE

Что я предлагаю сделать, так это сделать простой маршрутизатор из конфигурационного файла orignal, это не должно быть фантазией. Вы можете указать по запросу, используя $_SERVER[HTTP_HOST], какой домен выполняет запрос. С помощью этой информации вы можете сделать что-то простое (PSUDO CODE)

 switch( $_SERVER['HTTP_HOST' ){
       case 'domain1':
            require 'location of domain1 config';
       break;
       case 'domain2':
            require 'location of domain2 config';
       break;
       default:
            require 'master site config';
 }

Затем внутри каждого сайта соответствующие папки помещают файл конфигурации для сайта site_url, базу данных и то, что у вас есть в обычном wp-config. Excreta, то это просто вопрос разработки, если вы хотите предоставить доступ к области администрирования для каждого экземпляра сайта.

Это (только изменение исходной конфигурации, а не wp-load.php) может быть проще в обслуживании, потому что относительно тривиально найти каждый конфигурационный файл в более поздней точке, и вы оказываете небольшое влияние на код ядра wordpress как возможное. Предоставлено, что неаккуратно wp-load изменится, но естественно ли искать что-то пользовательское для каждого сайта.

Моя проблема с областью администрирования заключается в том, что вы должны запускать ее через wp-admin.php, а не на индексной странице. Я не такая знакомая архитектура WordPress, как это связано с загрузкой области администратора, чтобы сказать наверняка, но там может быть какая-то настройка, необходимая там.