Apache2, virtualhost, userdir, suexec - jak to skonfigurowa

Konfiguracja serwerów, usług, itp.
siwuch86
Beginner
Posty: 143
Rejestracja: 06 lutego 2008, 11:21
Lokalizacja: Kraków

Apache2, virtualhost, userdir, suexec - jak to skonfigurować?

Post autor: siwuch86 »

Witam.

Czy jest możliwość skonfigurowania serwera apache 2.2 w taki sposób aby tylko jeden wirtualny host serwował katalogi użytkowników (mod_userdir) i uruchamiał skrypty na uprawnieniach tychże właśnie użytkowników (suexec)? W dokumentacji apache nie znalazłem informacji, żeby nie było takiej możliwości (nie znalazłem też, że się da) dlatego postanowiłem założyć temat. Oto mój obecny konfig (częściowo bazujący na domyślnym pliku konfiguracyjnym - trochę okrojony):

Kod: Zaznacz cały

$ cat httpd.conf
ServerRoot "/usr/local/apache2"
Listen 80
User www-data
Group www-data

ServerAdmin ktos@example.com

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

<IfModule log_config_module>

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog "logs/access_log" common

</IfModule>

<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

DefaultType text/plain

LoadModule fastcgi_module modules/mod_fastcgi.so

NameVirtualHost *:80

<VirtualHost *:80>

    ServerAdmin default@test.com
    ServerName default.test.com
    ServerAlias www.default.test.com
    DocumentRoot "/usr/local/apache2/vhostdocs/default"

    ErrorLog "logs/default.test.com-error_log"
    CustomLog "logs/default.test.com-access_log" common

    <Directory "/usr/local/apache2/vhostdocs/default">
       Order allow,deny
       Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *:80>

    ServerAdmin vhost1@test.com
    ServerName vhost1.test.com
    ServerAlias www.vhost1.test.com
    DocumentRoot "/usr/local/apache2/vhostdocs/vhost1"

    ErrorLog "logs/vhost1.test.com-error_log"
    CustomLog "logs/vhost1.test.com-access_log" common

    <Directory "/usr/local/apache2/vhostdocs/vhost1">
       Order allow,deny
       Allow from all
    </Directory>

    AddHandler application/x-httpd-php5 .php
    Action application/x-httpd-php5 /php-cgi
    ScriptAlias /php-cgi "/usr/local/apache2/vhostdocs/vhost1/php-fcgi"

    SuexecUserGroup vhost1 vhost1
</VirtualHost>

<VirtualHost *:80>

    ServerAdmin vhost2@test.com
    ServerName vhost2.test.com
    ServerAlias www.vhost2.test.com
    DocumentRoot "/usr/local/apache2/vhostdocs/vhost2"

    ErrorLog "logs/vhost2.test.com-error_log"
    CustomLog "logs/vhost2.test.com-access_log" common

    <Directory "/usr/local/apache2/vhostdocs/vhost2">
       Order allow,deny
       Allow from all
    </Directory>

    AddHandler application/x-httpd-php5 .php
    Action application/x-httpd-php5 /php-cgi
    ScriptAlias /php-cgi "/usr/local/apache2/vhostdocs/vhost2/php-cgi"

    UserDir public_html
    <Directory "/home/*/public_html">
       Order allow,deny
       Allow from all
    </Directory>
</VirtualHost>
"Niestety tak nie działa". Suexec działa, ponieważ skrypty dla vhost1 uruchamiane są z uprawnieniami vhost1. mod_userdir też działa, ponieważ vhost2 serwuje katalogi użytkowników, niestety robi to już na uprawnieniach serwera zamiast właściwego usera. W logu suexec nie pojawiają się żadne informacje, wygląda na to iż mod_userdir w ogóle nie próbuje używać suexec. Kilka dodatkowych informacji:

Kod: Zaznacz cały

# apachectl -V
Server version: Apache/2.2.15 (Unix)
Server built:   Aug 23 2010 10:27:18
Server's Module Magic Number: 20051115:24
Server loaded:  APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture:   32-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/usr/local/apache2"
 -D SUEXEC_BIN="/usr/local/apache2/bin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"


# apachectl -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 authn_file_module (static)
 authn_default_module (static)
 authz_host_module (static)
 authz_groupfile_module (static)
 authz_user_module (static)
 authz_default_module (static)
 auth_basic_module (static)
 include_module (static)
 filter_module (static)
 log_config_module (static)
 env_module (static)
 setenvif_module (static)
 version_module (static)
 mpm_prefork_module (static)
 http_module (static)
 mime_module (static)
 status_module (static)
 autoindex_module (static)
 asis_module (static)
 suexec_module (static)
 cgi_module (static)
 negotiation_module (static)
 dir_module (static)
 actions_module (static)
 userdir_module (static)
 alias_module (static)
 so_module (static)
 fastcgi_module (shared)
Syntax OK


# suexec -V
 -D AP_DOC_ROOT="/usr/local/apache2/vhostdocs"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="www-data"
 -D AP_LOG_EXEC="/usr/local/apache2/logs/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"
Awatar użytkownika
cyryllo
Beginner
Posty: 120
Rejestracja: 11 grudnia 2007, 00:33
Lokalizacja: Gdańsk

Post autor: cyryllo »

Może takie rozwiązanie ci pomoże http://www.howtoforge.com/perfect-serve ... ispconfig3
siwuch86
Beginner
Posty: 143
Rejestracja: 06 lutego 2008, 11:21
Lokalizacja: Kraków

Post autor: siwuch86 »

Niestety nie ma w tym linku rozwiązania. Natomiast ja znalazłem problem więc sam sobie odpowiem. W module mod_userdir jest błąd, więcej na ten temat, łącznie z łatką, można przeczytać tutaj: https://issues.apache.org/bugzilla/show ... i?id=49439 .

Witam ponownie.
Nieco zmieniłem config, gdyż poprzedni nie uruchamiał php poprzez fastcgi. Obecnie ustawienia virtualhostów wyglądają następująco (trochę eksperymentuję):

Kod: Zaznacz cały

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin default@test.com
    DocumentRoot "/usr/local/apache2/vhostdocs/default"
    ServerName default.test.com
    ServerAlias www.default.test.com

    ErrorLog "logs/default.test.com-error_log"
    CustomLog "logs/default.test.com-access_log" common

    <Directory "/usr/local/apache2/vhostdocs/default">
         Order allow,deny
         Allow from all
    </Directory>
</VirtualHost>

######################## VHOST 1 ########################

<VirtualHost *:80>
    ServerAdmin vhost1@test.com
    DocumentRoot "/usr/local/apache2/vhostdocs/vhost1"
    ServerName vhost1.test.com
    ServerAlias www.vhost1.test.com

    Action php-fastcgi /php-fcgi
    AddHandler php-fastcgi .php

    <Location /php-fcgi>
         SetHandler fastcgi-script
         Options +ExecCGI
    </Location>

    <Directory "/usr/local/apache2/vhostdocs/vhost1">
         Order allow,deny
         Allow from all
    </Directory>

    DirectoryIndex index.php index.html
    SuexecUserGroup vhost1 vhost1

    ErrorLog "logs/vhost1.test.com-error_log"
    CustomLog "logs/vhost1.test.com-access_log" common

</VirtualHost>
Chwilowo podczas eksperymentów zrezygnowałem z mod_userdir. Problem mam natomiast taki, że raz uruchomione php zostaje już na wieczność (a przynajmniej przez jedną dobę fastcgi nie ubił procesu php). Wiem, że jedną z głównych cech odróżniających fastcgi od cgi jest to, że programy nie są uruchamiane za każdym razem od nowa ale zostają i czekają na kolejne zadania, ale... czy da się tak skonfigurować, że jeśli po jakimś czasie (dajmy na to 5 minut) po zakończeniu przetwarzania ostatniego skryptu proces będzie wisiał bezczynnie to zostanie on zatrzymany? Niektóre strony odwiedzane są rzadziej niż raz na dobę więc nie ma większego sensu, żeby proces php ciągle czekał na pojawienie się kolejnego zadania.
ODPOWIEDZ