ispCP Omega является открытым исходным кодом для всех потребностей веб-хостинга . Разработчики, как всегда выполняют своевременное обновление, делая доступным ispCP Omega для CentOS, Debian, Fedora, FreeBSD, Gentoo, OpenBSD, OpenSuse, RedHat, Slackware, Suse и Ubuntu. В данном материале речь пойдет об установке ispCP Omega на Ubuntu server 10.04.
Установить сервера Ubuntu server 10.04
Здесь я не буду много писать, так как уже не раз описывал процесс установки Ubuntu server 10.04 , который можно найти в материалах:
Установка ispCP Omega
Скачать ispCP Omega на страницах официального сайта isp-control.net. Это руководство основано на версии программы 1.0.6.
Установка и редактирование docs/Ubuntu/ubuntu-packages-lucid (3 команды) |
|
Заменить эти записи:
libmd5-perl libmysqlclient15off
На эти:
libdigestmd5-perl libmysqlclient16
Следуем по порядку в docs/Ubuntu/INSTALL. При запуске установки ispCP Omega, убедитесь, что выбрано FastCGI по умолчанию. PS auxf. Вывод должен выглядеть очень похожим на это:
root 25761 0.0 1.7 138304 36360 ? Ss 10:56 0:00 /usr/sbin/apache2 -k start root 25762 0.0 0.0 4096 580 ? S 10:56 0:00 \_ /bin/sh -c /var/www/ispcp/engine/ispcp-apache-logger -e root 25764 0.0 0.7 62624 15416 ? S 10:56 0:00 | \_ /usr/bin/perl /var/www/ispcp/engine/ispcp-apache-logger -e root 25763 0.0 0.0 4096 576 ? S 10:56 0:00 \_ /bin/sh -c /var/www/ispcp/engine/ispcp-apache-logger root 25765 0.0 0.7 62624 15416 ? S 10:56 0:00 | \_ /usr/bin/perl /var/www/ispcp/engine/ispcp-apache-logger www-data 25766 0.0 1.6 138004 34416 ? S 10:56 0:00 \_ /usr/sbin/apache2 -k start www-data 25767 0.0 1.6 138004 34372 ? S 10:56 0:00 \_ /usr/sbin/fcgi-pm -k start vu2000 25768 0.0 0.4 147120 8936 ? Ss 10:56 0:00 | \_ /usr/bin/php5-cgi vu2000 25826 0.0 0.7 155448 15156 ? S 10:56 0:00 | \_ /usr/bin/php5-cgi vu2000 25827 0.0 0.1 147120 3788 ? S 10:56 0:00 | \_ /usr/bin/php5-cgi www-data 25769 0.0 1.8 427808 37468 ? Sl 10:56 0:00 \_ /usr/sbin/apache2 -k start www-data 25778 0.0 1.7 427688 36796 ?
Компиляции пользовательских Suexec Wrapper
Скачать Apache HTTPd источников с официальной странички страницы. Этот материал основан на версии продукта 2.2.16.
Установим и войдем в новый каталог (2 команды) |
|
Примените патчи:
--- Makefile.in.old 2009-04-21 09:59:33.000000000 -0400 +++ Makefile.in 2009-04-21 10:04:11.000000000 -0400 @@ -59,9 +59,13 @@ $(LINK) $(checkgid_LTFLAGS) $(checkgid_OBJECTS) $(PROGRAM_LDADD) suexec_OBJECTS = suexec.lo -suexec: $(suexec_OBJECTS) +suexec: $(suexec_OBJECTS) suexec-phpfcgi $(LINK) $(suexec_OBJECTS) +suexec-phpfcgi_OBJECTS = suexec-phpfcgi.lo +suexec-phpfcgi: $(suexec-phpfcgi_OBJECTS) + $(LINK) $(suexec-phpfcgi_OBJECTS) + htcacheclean_OBJECTS = htcacheclean.lo htcacheclean: $(htcacheclean_OBJECTS) $(LINK) $(htcacheclean_LTFLAGS) $(htcacheclean_OBJECTS) $(PROGRAM_LDADD)
--- suexec.c 2010-07-12 11:26:29.000000000 +0200 +++ suexec-phpfcgi.c 2010-09-14 10:07:36.581742585 +0200 @@ -259,6 +259,7 @@ char *cmd; /* command to be executed */ char cwd[AP_MAXPATH]; /* current working directory */ char dwd[AP_MAXPATH]; /* docroot working directory */ + char nwd[AP_MAXPATH]; /* after-chroot working dir */ struct passwd *pw; /* password entry holder */ struct group *gr; /* group entry holder */ struct stat dir_info; /* directory info holder */ @@ -456,7 +457,6 @@ log_err("cannot run as forbidden uid (%d/%s)\n", uid, cmd); exit(107); } - /* * Error out if attempt is made to execute as root group * or as a GID less than AP_GID_MIN. Tsk tsk. @@ -466,6 +466,42 @@ exit(108); } + + int striplen = strlen (target_homedir); + + char* tlen = strchr(target_homedir, '/'); + char* hlen = strchr(tlen+1, '/'); + char* ulen = strchr(hlen+1, '/'); + char* chroot_dir = strndup(target_homedir, striplen); + char* pt = getenv("PATH_TRANSLATED"); + if (pt != 0) { + setenv("PATH_TRANSLATED", pt + (ulen - target_homedir), 1); + } + + setenv("DOCUMENT_ROOT", "/", 1); + + if (getcwd(nwd, AP_MAXPATH) == NULL) { + log_err("cannot get current working directory (prechroot)\n"); + exit(111); + } + + char* trunc_nwd = strndup("/fcgi", 5); + + if (chdir(chroot_dir)) { + log_err("crit: can't chdir to chroot dir (%s)",chroot_dir); + exit(121); + } + + if (chroot(chroot_dir) != 0) { + log_err("emerg: failed to chroot (%s, %s)\n", chroot_dir, cmd); + exit(122); + } + + if (chdir (trunc_nwd)) { + log_err("crit: can't chdir to %s inside chroot %s\n", trunc_nwd, chroot_dir); + exit(42); + } + /* * Change UID/GID here so that the following tests work over NFS. * @@ -498,22 +534,11 @@ exit(111); } - if (userdir) { - if (((chdir(target_homedir)) != 0) || - ((chdir(AP_USERDIR_SUFFIX)) != 0) || - ((getcwd(dwd, AP_MAXPATH)) == NULL) || - ((chdir(cwd)) != 0)) { - log_err("cannot get docroot information (%s)\n", target_homedir); - exit(112); - } - } - else { - if (((chdir(AP_DOC_ROOT)) != 0) || - ((getcwd(dwd, AP_MAXPATH)) == NULL) || - ((chdir(cwd)) != 0)) { - log_err("cannot get docroot information (%s)\n", AP_DOC_ROOT); - exit(113); - } + if (((chdir(getenv("DOCUMENT_ROOT"))) != 0) || + ((getcwd(dwd, AP_MAXPATH)) == NULL) || + ((chdir(cwd)) != 0)) { + log_err("cannot get docroot information (%s)\n", AP_DOC_ROOT); + exit(113); } if ((strncmp(cwd, dwd, strlen(dwd))) != 0) { @@ -565,7 +590,7 @@ * Error out if the target name/group is different from * the name/group of the cwd or the program. */ - if ((uid != dir_info.st_uid) || +/* if ((uid != dir_info.st_uid) || (gid != dir_info.st_gid) || (uid != prg_info.st_uid) || (gid != prg_info.st_gid)) { @@ -575,7 +600,7 @@ dir_info.st_uid, dir_info.st_gid, prg_info.st_uid, prg_info.st_gid); exit(120); - } + }*/ /* * Error out if the program is not executable for the user. * Otherwise, she won't find any error in the logs except for
Применим патч (2 команды) |
|
Редактируем suexec.h:
AP_HTTPD_USER www-data AP_UID_MIN 2000 AP_GID_MIN 2000 AP_LOG_EXEC "/tmp/suexec.log" AP_DOC_ROOT "/"
Установка и редактирование docs/Ubuntu/ubuntu-packages-lucid (3 команды) |
|
Install the new suexec wrapper.
Установка и редактирование docs/Ubuntu/ubuntu-packages-lucid (3 команды) |
|
FastCgiWrapper /usr/lib/apache2/suexec-phpfcgi
Создаем Chroot для виртуальных хостов
Каждый созданный виртуальный хост должен быть изолирован, для этого должны быть скопированы права в каждый домашний каталог виртуального хоста. Например, для виртуального хоста example.org которая работает как пользователь vu2009, выполняется следующее:
- (3 команды) |
|
Также создайте ссылку для каждого субдомена. Если у вас есть субдомены one.example.org и two.example.org, также выполнить:
- (2 команды) |
|
Обновление ispcp.conf
Убедитесь, что база данных с использует протокола TCP (127.0.0.1), а не локальный. Chroot виртуальный хост не будет в состоянии увидеть сокет MySQL, которая находится в /var/run/mysqld/mysqld.sock.
DATABASE_HOST = 127.0.0.1
Мастер обновления виртуального хоста
Вам необходимо выполнить следующее:
- (2 команды) |
|
Обновление /etc/passwd, изменить vu2000 (главного пользователя) домашний каталог в /var/www/ispcp/gui. Панели управления должна быть в состоянии прочитать основные конфигурации. Этот файл никогда не меняется, так что выполним по порядку прямое копирование.
- (2 команды) |
|
Chroot Apache2
- (1 команда) |
|
Обновим /etc/apache2/httpd.conf :
- (1 команда) |
|
ChRootDir /var/www-jail
- (2 команды) |
|
Сделать их монтируемыми постояно, добавив к /etc/fstab:
/var/www /var/www-jail/var/www none bind /var/lib/apache2/fastcgi /var/www-jail/var/lib/apache2/fastcgi none bind
Sendmail Mini
Postfix имеет много зависимостей, поэтому предпочтительно, не включать его в виртуальные домены корневых каталогах. Вместо этого, скачать и скомпилировать mini_sendmail из отсюда. Она не будет работать статически связано между собой. Отредактируем Makefile:
CFLAGS = -g #LDFLAGS = -s -static LDFLAG = -g
--- mini_sendmail-1.3.6/mini_sendmail.c 2005-06-29 19:37:15.000000000 +0200 +++ mini_sendmail-1.3.6-mine/mini_sendmail.c 2010-10-01 15:12:40.947187053 +0200 @@ -30,7 +30,7 @@ ** don't want the features you can undef the symbols; some of them mean ** a significant savings in executable size. */ -#define DO_RECEIVED /* whether to add a "Received:" header */ +#undef DO_RECEIVED /* whether to add a "Received:" header */ #define DO_GETPWUID /* whether to try a getpwuid() if getlogin() fails */ #define DO_MINUS_SP /* whether to implement the -s and -p flags */ #define DO_DNS /* whether to do a name lookup on -s, or just IP# */ @@ -122,6 +122,8 @@ { if ( strncmp( argv[argn], "-f", 2 ) == 0 && argv[argn][2] != '\0' ) fake_from = &(argv[argn][2]); + else if ( strncmp( argv[argn], "-f", 2) == 0) + fake_from = &(argv[++argn][0]); else if ( strcmp( argv[argn], "-t" ) == 0 ) parse_message = 1; #ifdef DO_MINUS_SP @@ -145,33 +147,32 @@ ++argn; } - username = getlogin(); - if ( username == (char*) 0 ) - { + if ( fake_from == (char*) 0 ) { + username = getlogin(); + if ( username == (char*) 0 ) { #ifdef DO_GETPWUID - struct passwd* pw = getpwuid( getuid() ); - if ( pw == (struct passwd*) 0 ) - { - (void) fprintf( stderr, "%s: can't determine username\n", argv0 ); - exit( 1 ); + struct passwd* pw = getpwuid( getuid() ); + if ( pw == (struct passwd*) 0 ) { + (void) fprintf( stderr, "%s: can't determine username\n", argv0 ); + exit( 1 ); } - username = pw->pw_name; + username = pw->pw_name; #else /* DO_GETPWUID */ - (void) fprintf( stderr, "%s: can't determine username\n", argv0 ); - exit( 1 ); + (void) fprintf( stderr, "%s: can't determine username\n", argv0 ); + exit( 1 ); #endif /* DO_GETPWUID */ } - - if ( gethostname( hostname, sizeof(hostname) - 1 ) < 0 ) - show_error( "gethostname" ); - - if ( fake_from == (char*) 0 ) (void) snprintf( from, sizeof(from), "%s@%s", username, hostname ); - else + } else { if ( strchr( fake_from, '@' ) == (char*) 0 ) (void) snprintf( from, sizeof(from), "%s@%s", fake_from, hostname ); else (void) snprintf( from, sizeof(from), "%s", fake_from ); + } + + if ( gethostname( hostname, sizeof(hostname) - 1 ) < 0 ) + show_error( "gethostname" ); + /* Strip off any angle brackets in the from address. */ while ( from[0] == '<' )
- (2 команды) |
|
Проверка
Создадим пару виртуальных хостов и посмотрим работу PHP. Если все пойдет хорошо, то ps auxf на выходе должен выглядеть похожим на:
root 25761 0.0 1.7 138304 36360 ? Ss 10:56 0:00 /usr/sbin/apache2 -k start root 25762 0.0 0.0 4096 580 ? S 10:56 0:00 \_ /bin/sh -c /var/www/ispcp/engine/ispcp-apache-logger -e root 25764 0.0 0.7 62624 15424 ? S 10:56 0:00 | \_ /usr/bin/perl /var/www/ispcp/engine/ispcp-apache-logger -e root 25763 0.0 0.0 4096 576 ? S 10:56 0:00 \_ /bin/sh -c /var/www/ispcp/engine/ispcp-apache-logger root 25765 0.0 0.7 62624 15452 ? S 10:56 0:00 | \_ /usr/bin/perl /var/www/ispcp/engine/ispcp-apache-logger www-data 25766 0.0 1.6 138004 34416 ? S 10:56 0:00 \_ /usr/sbin/apache2 -k start www-data 25767 0.0 1.6 138004 34440 ? S 10:56 0:00 \_ /usr/sbin/fcgi-pm -k start vu2000 25768 0.0 0.4 147120 8936 ? Ss 10:56 0:00 | \_ /usr/bin/php5-cgi vu2000 25826 0.0 0.7 155448 15332 ? S 10:56 0:00 | | \_ /usr/bin/php5-cgi vu2000 25827 0.0 0.7 155192 14984 ? S 10:56 0:00 | | \_ /usr/bin/php5-cgi vu2007 11282 0.0 0.3 124356 7968 ? Ss 15:16 0:00 | \_ /usr/bin/php5-cgi vu2007 11284 0.1 0.5 129676 11560 ? S 15:16 0:00 | | \_ /usr/bin/php5-cgi vu2007 11285 0.1 0.5 131340 11756 ? S 15:16 0:00 | | \_ /usr/bin/php5-cgi vu2058 11292 1.0 0.3 124356 7972 ? Ss 15:17 0:00 | \_ /usr/bin/php5-cgi vu2058 11294 13.0 1.3 145292 27836 ? S 15:17 0:00 | \_ /usr/bin/php5-cgi vu2058 11295 0.0 0.1 124356 3512 ? S 15:17 0:00 | \_ /usr/bin/php5-cgi www-data 25769 0.0 1.8 428520 38416 ? Sl 10:56 0:00 \_ /usr/sbin/apache2 -k start www-data 25778 0.0 1.8 428356 38008 ?
Полезные инструменты отладки включают strace'ing FastCGI Process Manager (PID 25767 производства выше), если виртуальный хост не будет запуска:
- (1 команда) |
|
Кроме того, проверьте выход в /tmp/suexec.log. Strace'ing собственных процессов виртуальный хост является полезным, если они начинают, но не выводит, что вы хотите видеть (например, для vu2058 производства выше):
- (1 команда) |
|