Массовый виртуальный хостинг apache с suexec и mod_fcgid

Я следовал руководству Falco, и теперь все работает, как и ожидалось, для 2 пользователей (например, Джон и Алиса) с соответствующими каталогами (/var/www/john а также /var/ww/alice).

Теперь я хочу перейти на следующий уровень: вместо определения разных vhosts в /etc/apache2/sites-available/<username> и перезапуск Apache, мне нужен динамически настраиваемый массовый виртуальный хостинг. Скажем, мой DNS-сервер имеет записи для: another.site.example.comЯ хочу, чтобы это домашний каталог был на /var/www/another.site/web,

Проблема в том, что все эти параметры конфигурации для suexec и mod_fcgid. Я закончил этот черновик моего httpd.conf (или я должен создать файл как /etc/apache2/sites-available/mass_virtual?):

NameVirtualHost *:80

#default virtual host
<VirtualHost *:80>
  ServerName www.example.com
  ServerAlias example.com
  ServerAdmin webmaster@example.com
  DocumentRoot /var/www/root/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web-admin web-admin
    <Directory /var/www/root/web/>
      Options +ExecCGI
      Options -Indexes
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/root/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>

#3rd-level subdomain virtual hosts
<VirtualHost *:80>
  UseCanonicalName Off
  ServerAlias *.example.com
  #problematic email!
  ServerAdmin webmaster@example.com
  #is this /var/www/another.site/web or /var/www/www.another.site/web for
  #a request for www.another.site.example.com ?
  VirtualDocumentRoot /var/www/%-3+/web

  <IfModule mod_fcgid.c>
    #problematic group and user!
    SuexecUserGroup web1 web1
    <Directory /var/www/*/web/>
      Options +ExecCGI
      Options -Indexes
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/*/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>
  1. Как видно из комментариев у меня проблематично ServerAdmin webmaster@example.com, SuexecUserGroup web1 web1 и VirtualDocumentRoot /var/www/%-3+/web Конфигурация!

  2. Более того, для обеспечения безопасности я думаю IfModule не должно существовать, еслиmod_fcgid не может загрузить то и сервер, и,

  3. вместо Alow from allЯ думаю, что должен был Deny from all и вместо этого откройте каталог php-библиотеки!

Благодарю.

1 ответ

Хорошо, поскольку у меня нет ответов, я попробую половину предложенного решения (?): Использование mod_userdir для принудительного выполнения suexec.

  1. Давайте создадим следующий файл /etc/apache2/httpd.conf

    ##########################################
    ### mod_fcgid configuration directives ###
    ##########################################
    #values should be tuned depending on server memory
    FcgidMaxProcesses 1000
    FcgidMaxProcessesPerClass 100
    FcgidMinProcessesPerClass 3
    #see 'export PHP_FCGI_MAX_REQUESTS=5000' at '/var/www/php-fcgi-scripts/<user>/php-fcgi-starter'
    FcgidMaxRequestsPerProcess 5000
    FcgidIOTimeout 40
    FcgidProcessLifeTime 3600
    FcgidMaxRequestInMem 65536
    FcgidMaxRequestLen 131072
    FcgidOutputBufferSize 65536
    
  2. Давайте создадим mass_virtual в /etc/apache2/sites-available/

    #NameVirtualHost *:80
    
    #default virtual host
    <VirtualHost *:80>
      ServerName www.example.com
      ServerAlias example.com
      ServerAdmin webmaster@example.com
      DocumentRoot /var/www/web-admin/web/
    
      SuexecUserGroup web-admin web-admin
      <Directory /var/www/web-admin/web/>
        Options +ExecCGI
        Options -Indexes
        AllowOverride All
        AddHandler fcgid-script .php
        #FCGIWrapper /var/www/php-fcgi-scripts/web-admin/php-fcgi-starter .php
        FcgidWrapper /var/www/php-fcgi-scripts/web-admin/php-fcgi-starter .php
        Order allow,deny
        Allow from all
      </Directory>
    
      # ErrorLog /var/log/apache2/error.log
      # CustomLog /var/log/apache2/access.log combined
      ServerSignature Off
    
    </VirtualHost>
    
    #3rd-level subdomain virtual hosts
    <VirtualHost *:80>
      ServerAlias *.example.com
      ServerAdmin webmaster@example.com
      ##################
      ### solution 1 ###
      ##################
      #mod_vhost_alias directives: needs parameterized SuexecUserGroup(?)
      #UseCanonicalName Off
      #VirtualDocumentRoot /var/www/%-3+/web
      ##################
      ### solution 2 ###
      ##################
      #mod_userdir directives for requests: http://www.example.com/~user
      UserDir disabled root
      UserDir /var/www/*/public_html
    
      #reduntant if using requests: http://www.example.com/~user
      #SuexecUserGroup web1 web1
      <Directory /var/www/*/public_html>
        Options +ExecCGI
        Options -Indexes
        AllowOverride All
        AddHandler fcgid-script .php
        #move to .htaccess
        #FCGIWrapper /var/www/php-fcgi-scripts/*/php-fcgi-starter .php
        #FcgidWrapper /var/www/php-fcgi-scripts/*/php-fcgi-starter .php
        Order allow,deny
        Allow from all
      </Directory>
    
      # ErrorLog /var/log/apache2/error.log
      # CustomLog /var/log/apache2/access.log combined
      ServerSignature Off
    
    </VirtualHost>
    

    Проблема: если я раскомментирую первую строку, я получаю предупреждение при перезапуске сервера, что нет никаких виртуальных хостов!!

  3. Давайте создадим моего пользователя Боб

  4. Давайте создадим.htaccess в /var/www/bob/public_html

    FcgidWrapper /var/www/php-fcgi-scripts/bob/php-fcgi-starter .php
    
  5. Давайте ударим мой браузер, чтобы www.example.com/info.php или же example.com/info.php

    web-admin
    

    ... как и ожидалось, но,

  6. давайте перейдем к www.example.com/~bob/info.php

    ...trying to open info.php!!!
    

    давайте посмотрим ошибки

    <root># cat /var/log/apache2/error.log
    [notice] caught SIGTERM, shutting down
    [notice] suEXEC mechanism enabled (wrapper: /usr/lib/apache2/suexec)
    [notice] Apache/2.2.20 (Ubuntu) mod_fcgid/2.3.6 configured -- resuming normal operations
    

    Как видите, ошибок нет, НО mod_fcgid НЕ включен запуск файла.php, и apache пытается отправить его как обычный файл!!! Есть идеи как решить это?

Другие вопросы по тегам