Установка ispCP Omega в Ubuntu 10.04 x86 и х64

Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

UbuntuispCP 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 команды)

  • tar xf iscp-omega-1.0.6.tar.gz
  • cd ispcp-omega-1.0.6
  • cp docs/Ubuntu/ubuntu-packages-karmic docs/Ubuntu/ubuntu-packages-lucid

Заменить эти записи:

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 команды)

  • tar xf httpd-2.2.16.tar.bz2
  • cd httpd-2.2.16/support

Примените патчи:

--- 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 команды)

  • patch -p0 < ../../makefile.diff
  • patch -p0 -o suexec-phpfcgi.c < ../../suexec-phpfcgi.diff

Редактируем 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 команды)

  • cp suexec-phpfcgi /usr/lib/apache2
  • chown .www-data /usr/lib/apache2/suexec-phpfcgi
  • chmod 4751 /usr/lib/apache2/suexec-phpfcgi

Install the new suexec wrapper.

Установка и редактирование docs/Ubuntu/ubuntu-packages-lucid (3 команды)

  • cd ..
  • configure --prefix=/usr/lib/apache2 --enable-suexec --enable-mods-shared=most --enable-so --with-mpm=worker --with-included-apr
  • cd support
  • make suexec
FastCgiWrapper /usr/lib/apache2/suexec-phpfcgi

Создаем Chroot для виртуальных хостов

 

Каждый созданный виртуальный хост должен быть изолирован, для этого должны быть скопированы права в каждый домашний каталог виртуального хоста. Например, для виртуального хоста example.org которая работает как пользователь vu2009, выполняется следующее:

- (3 команды)

  • cp -a /usr/local/skel/* ~vu2009/
  • mkdir -p ~vu2009/var/www/virtual/example.org
  • cd ~vu2009/var/www/virtual/example.org && ln -s /htdocs htdocs

Также создайте ссылку для каждого субдомена. Если у вас есть субдомены one.example.org и two.example.org, также выполнить:

- (2 команды)

  • cd ~vu2009/var/www/virtual/example.org && ln -s /one one
  • cd ~vu2009/var/www/virtual/example.org && ln -s /two two

Обновление ispcp.conf

Убедитесь, что база данных с использует протокола TCP (127.0.0.1), а не локальный. Chroot виртуальный хост не будет в состоянии увидеть сокет MySQL, которая находится в /var/run/mysqld/mysqld.sock.

DATABASE_HOST = 127.0.0.1

Мастер обновления виртуального хоста

Вам необходимо выполнить следующее:

- (2 команды)

  • cd /var/www/fcgi/master && ln -s / fcgi
  • cp -a /var/www/fcgi/master /var/www/ispcp/gui/var/www/fgci/master

Обновление /etc/passwd, изменить vu2000 (главного пользователя) домашний каталог в /var/www/ispcp/gui. Панели управления должна быть в состоянии прочитать основные конфигурации. Этот файл никогда не меняется, так что выполним по порядку прямое копирование.

- (2 команды)

  • cp /etc/ispcp/ispcp.conf /var/www/ispcp/gui/etc/ispcp/
  • cd /var/www/ispcp/gui/var/www/ispcp/ && ln -s / gui

Chroot Apache2

- (1 команда)

  • mkdir /var/www-jail

Обновим /etc/apache2/httpd.conf :

- (1 команда)

  • mkdir /var/www-jail
ChRootDir /var/www-jail

- (2 команды)

  • mkdir -p /var/www-jail/var/www
  • mount -o bind /var/www /var/www-jail/var/www
  • mount -o bind /var/lib/apache2/fastcgi /var/www-jail/var/lib/apache2/fastcgi

Сделать их монтируемыми постояно, добавив к /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 команды)

  • make
  • mkdir -p /usr/local/skel/usr/sbin/
  • cp mini_sendmail /usr/local/skel/usr/sbin/
  • cd /usr/local/skel/usr/sbin/
  • ln -s mini_sendmail sendmail

Проверка

Создадим пару виртуальных хостов и посмотрим работу 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 команда)

  • strace -ff -p 25767

Кроме того, проверьте выход в /tmp/suexec.log. Strace'ing собственных процессов виртуальный хост является полезным, если они начинают, но не выводит, что вы хотите видеть (например, для vu2058 производства выше):

- (1 команда)

  • strace -ff -p 11292 -p 11294 -p 11295