Массовый виртуальный хостинг 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>
Как видно из комментариев у меня проблематично
ServerAdmin webmaster@example.com
,SuexecUserGroup web1 web1
иVirtualDocumentRoot /var/www/%-3+/web
Конфигурация!Более того, для обеспечения безопасности я думаю
IfModule
не должно существовать, еслиmod_fcgid
не может загрузить то и сервер, и,вместо
Alow from all
Я думаю, что должен былDeny from all
и вместо этого откройте каталог php-библиотеки!
Благодарю.
1 ответ
Хорошо, поскольку у меня нет ответов, я попробую половину предложенного решения (?): Использование mod_userdir для принудительного выполнения suexec.
Давайте создадим следующий файл /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
Давайте создадим
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>
Проблема: если я раскомментирую первую строку, я получаю предупреждение при перезапуске сервера, что нет никаких виртуальных хостов!!
Давайте создадим моего пользователя Боб
Давайте создадим.htaccess в
/var/www/bob/public_html
FcgidWrapper /var/www/php-fcgi-scripts/bob/php-fcgi-starter .php
Давайте ударим мой браузер, чтобы
www.example.com/info.php
или жеexample.com/info.php
web-admin
... как и ожидалось, но,
давайте перейдем к
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 пытается отправить его как обычный файл!!! Есть идеи как решить это?