Установка LiveStreet не в WebDIR

Дата Автор cdb5 комментариев

Потребовалось мне установить LiveStreet 0.5.1 на свой VDS, но поскольку апача у меня нет, то столкнулся с проблемой .htaccess. А именно: .htaccess не поддерживается nginx, т.к. nginx запускается уже с готовым конфигом (сделано для улучшения быстродействия). Сам же LiveStreet пестрит файликами .htaccess следующего содержания:

Order Deny,Allow
Deny from all

Видимо автор пытался бороться с хакерами. Возможно это имело какой-то смысл и фичу решено было сохранить, но как реализовать конфиг nginx так, чтобы обработать все .htaccess? Идея родилась не с первого разу, но вот она в кратце: переносим все неиспользуемые файлы и папки за пределы web-директории, меняем пути конфигов и дело в шляпе. Но не все так просто :), еще придется подправить часть файлов. 

Для начала устанавливаем LiveStreet обычным образом в WebDIR (он создаст таблички в БД и конфиги). После этого начинаем курочить — общая структура публичной папки будет такая:

Публичная папка LiveStreet

Получается она довольно просто — все ненужные папки с полными путями переносятся в «приватную» папку, здесь остаются только необходимые из Web файлы. Я оставил index.php, папку uploads; в папке templates остались только папка cache и папка с картинками из темы (у меня это skin/new-jquery/images), так же осталась часть библиотек, которые могут быть вызваны из Web через AJAX или подобные способы. Библиотеки делил так: все что содержат файл .htaccess — приватные, все остальные оставляем. Таким образом в приватной папке образовалась следующая структура:

Приватная папка LiveStreet

Теперь поправим конфиг nginx — у меня он будет выглядеть так:

server {
	listen 78.47.245.185:80;
	root /home/tech-today.ru/public_html;
	server_name tech-today.ru www.tech-today.ru;
	access_log /home/tech-today.ru/logs/access.log;
	error_log /home/tech-today.ru/logs/error.log;
	client_max_body_size 64m;

	location ~ ^/plugins/[^\/]+/templates/skin/.+\.(js|css|jpg|gif|png|xml|xsl)
	{
	    root /home/tech-today.ru/private_html;
	}

	location / {
	    try_files	$uri	$uri/	@tech_entry;
	    index	index.php index.html;
	}

	location ~ \.php$ {
		try_files	$uri	@tech_entry;
		fastcgi_pass	unix:/home/tech-today.ru/tmp/php-fpm.sock;
		include		fastcgi_params;
		fastcgi_param	SCRIPT_FILENAME /public_html$fastcgi_script_name;
		fastcgi_param	DOCUMENT_ROOT /public_html;
	}

	location @tech_entry {
		fastcgi_pass	unix:/home/tech-today.ru/tmp/php-fpm.sock;
		include		fastcgi_params;
		fastcgi_param	SCRIPT_FILENAME /public_html/index.php;
		fastcgi_param	DOCUMENT_ROOT /public_html;
	}
}

Для всех плагинов, ресурсы для которых надо тянуть из папки плагина, добавили соответствующий обработчик nginx. Для остальных скриптов все более чем обычно. Теперь хачим сам движок:

1. /private_html/config/config.php, добавляем:

$config['path']['public']['server']     = '___path.root.server___';
$config['path']['public']['cache']     = '___path.root.server___/templates/cache';

2. /private_html/config/config.local.php, правим пути:

$config['path']['root']['web'] = 'http://tech-today.ru';
$config['path']['root']['server'] = '/private_html';
$config['path']['public']['server'] = '/public_html';
$config['path']['public']['cache'] = '/public_html/templates/cache';
$config['sys']['cache']['dir'] = '/tmp/';

В качестве path.root.server теперь приватная папка.

path.public.server — мы добавили параметр публичной папки.

path.public.cache — путь к папке кеша в публичной папке.

sys.cache.dir — путь к временной директории (должна быть не доступна из Web).

3. /private_html/classes/modules/topic/Topic.class.php

Заменяем все path.root.server на path.public.server.

4. /private_html/engine/modules/image/Image.class.php

Заменяем все path.root.server на path.public.server.

5. /private_html/engine/modules/viewer/Viewer.class.php

Добавим в класс свойство (в любое место до начала методов):

protected $resCacheDir='';

Ищем функцию Init:

public function Init($bLocal=false) {

В конце функции добавляем:

$this->resCacheDir = Config::Get('path.public.cache');

Ищем функцию Compress:

protected function Compress($aFiles,$sType) {

В функции заменяем строку:

$sCacheDir  = $this->sCacheDir."/".Config::Get('view.skin');

На строку:

$sCacheDir  = $this->resCacheDir."/".Config::Get('view.skin');

Ищем функцию GetRealpath

protected function GetRealpath($sPath) {

заменяем return realpath($sPath); на следующее:

			$rp = realpath($sPath);
			if (!$rp) $rp = realpath(str_replace(Config::Get('path.root.server'), Config::Get('path.public.server'), $sPath));
			return $rp;

Ищем функцию GetWebPath:

protected function GetWebPath($sFile) {

заменяем ее содержимое на следующее:

	protected function GetWebPath($sFile) {
		$wp = str_replace(
			str_replace(DIRECTORY_SEPARATOR,'/',Config::Get('path.public.server')),
			Config::Get('path.root.web'),
			str_replace(DIRECTORY_SEPARATOR,'/',$sFile)
		);

		if ($wp == $sFile)
		{
			$wp = str_replace(
				str_replace(DIRECTORY_SEPARATOR,'/',Config::Get('path.root.server')),
				Config::Get('path.root.web'),
				str_replace(DIRECTORY_SEPARATOR,'/',$sFile)
			);
		}
		return $wp;
	}

ищем функцию GetServerPath:

protected function GetServerPath($sFile) {

заменяем ее содержимое на следующее:

	protected function GetServerPath($sFile) {

		$int = true;
		if (strpos($sFile, Config::Get('path.root.engine_lib')) !== false) $int = false;

		/**
		 * Убираем из путей www
		 */
		$sFile = str_replace('//www.','//',$sFile);
		$sPathWeb  = str_replace('//www.','//',Config::Get('path.root.web'));
		/**
		 * Производим замену
		 */
		$sFile=str_replace($sPathWeb,Config::Get(($int ? 'path.root.server' : 'path.public.server')),$sFile);
		return str_replace('/',DIRECTORY_SEPARATOR,$sFile);
	}

6. /public_html/index.php

Ищем строку:

require_once("./config/loader.php");

и заменяем на:

require_once("/private_html/config/loader.php");

Теперь все устанавливаемые плагины надо класть в папку /private_html/plugins и активировать как обычно. Это в общем-то все, но есть некоторые сложности, порожденные нашими хаками — некоторые кривые плагины перестают работать ;). Примером такой проблемы может быть частичное падение плагина aceadminpanel. Исправляется это элементарно:

В файле /private_html/plugins/aceadminpanel/classes/actions/ActionAdmin.class.php ищем функцию _callAdminAddon:

protected function _callAdminAddon($aAddon, $aArgs)

В ней перед строкой:

include_once $sFileName;

добавляем строку:

if (!is_file($sFileName)) $sFileName = Config::Get('path.root.server') . DIRECTORY_SEPARATOR . $sFileName;

Большинство плагинов работает «из коробки» и в допилах не нуждается.

Если вам понравилась моя статья, пожалуйста, не поленитесь кликнуть любую кнопочку ниже, или кинуть ссылку на статью в свой блог или форум. Всегда рад ответить на ваши вопросы в комментариях. Спасибо 🙂

5 комментария на «Установка LiveStreet не в WebDIR»

  1. Ой мама… зачем же так сложно?
    я сделал влоб — составил список каталогов где есть .htaccess и занес их в список deny. дел на минуту

    location / {
    index index.php;
    if (!-e $request_filename) {
    rewrite ^(/.*)$ /index.php?q=$1 last;
    break;
    }
    }

    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|htm)$ {
    access_log off;
    log_not_found off;
    expires max;
    }

    location ~ ^/(classes/actions/|classes/blocks/|classes/hooks/|classes/modules/|config/|engine/classes/|engine/lib/external/CSSTidy-1.3/|engine/lib/external/DbSimple/|engine/lib/external/DklabCache/|engine/lib/external/Jevix/|engine/lib/external/JSMin-1.1.1/|engine/lib/external/kcaptcha/fonts/|engine/lib/external/phpMailer/|engine/lib/external/Smarty/|engine/lib/external/Sphinx/|engine/lib/external/XXTEA/|include/cron/|logs/|plugins/page/classes/|plugins/page/config/|plugins/page/templates/|plugins/profiler/classes/|plugins/profiler/config/|plugins/profiler/templates/|templates/|tmp/|uploads) {
    deny all;
    }

    location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
    }

    location ~ .(tpl|log)$ {
    deny all;
    }

    • Я тоже думал про большой большой регексп… и мне что-то было геморно все перечислять + установка плагина — надо опять в конфиг сервера лезть и там что-то менять и перезапускать… Оно конечно вариант как вы написали но не оч красивый ИМХО 😉

    • Немного перепилил ваш конфиг — можно использовать вместо портянки с правкой файлов.

      server {
              listen 78.47.245.185:80;
              server_name tech-today.ru www.tech-today.ru;
              access_log /home/tech-today.ru/logs/access.log;
              error_log /home/tech-today.ru/logs/error.log;
              client_max_body_size 64m;
      
              location ~ ^/(engine/lib/external|plugins/[^\/]+/templates/skin|templates/cache|templates/skin|uploads)/.+\.(js|css|jpg|gif|png|xml|xsl|swf|htm)$
              {
                  root /home/tech-today.ru/public_html;
              }
      
              location ~ ^/(engine/lib/external/kcaptcha|install)/index.php$
              {
                      fastcgi_pass    unix:/home/tech-today.ru/tmp/php-fpm.sock;
                      include         fastcgi_params;
                      fastcgi_param   SCRIPT_FILENAME /public_html$fastcgi_script_name;
                      fastcgi_param   DOCUMENT_ROOT /public_html;
              }
      
              location / {
                  try_files   $uri    $uri/   @tech_entry;
                  index       index.php index.html;
              }
      
              location ~ /\.ht { return 403; }
      
              location @tech_entry {
                      fastcgi_pass    unix:/home/tech-today.ru/tmp/php-fpm.sock;
                      include         fastcgi_params;
                      fastcgi_param   SCRIPT_FILENAME /public_html/index.php;
                      fastcgi_param   DOCUMENT_ROOT /public_html;
              }
      }
      
      
  2. Подскажите, как тут вставить фото?
    Я вот пробую, но никак не выходит 🙁

  3. Обилие интересных статей на вашем сайте меня поражает! Автору – удачи и новых интересных постов!

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

Ваш адрес email не будет опубликован.