Назад | Перейти на главную страницу

С установленным PHP Apache (сравнительно) медленно обслуживает статический контент?

Сначала немного о том, как я установил PHP, Apache и некоторые модули Apache:

# apt-get -y install php5 php-pear libapache2-mod-php5 php-apc php5-mysql php5-mcrypt php5-xmlrpc php5-curl php5-imagick php5-gd php5-imap php5-pspell

# apt-get -y install apache2 apache2-doc apache2-utils

# a2enmod setenvif headers deflate filter expires rewrite include

И мой файл httpd.conf выглядит так (т.е. я отключил .htaccess, а вместо этого сохранил все правила в httpd.conf):

<Directory /var/www/example.com/public>

  AllowOverride None

  [...]

</Directory>

Учитывая, что это даст вам общее представление о том, как настроен мой веб-сервер, я хотел бы продолжить и задать вопросы:

  1. Верно ли, что Apache сравнительно медленно обслуживает статический контент с установленным PHP? (я думаю.)

  2. Допустим, корневой каталог моего веб-сайта - '/var/www/example.com/public', а весь статический контент (CSS, JS, изображения) находится в '/var/www/example.com/public/uploads '; Как мне преодолеть Проблема (1) без необходимости перемещать весь статический контент на сервер, на котором не установлен PHP?

Только что узнал. Можно отключить обработку PHP в каталоге (и, следовательно, в его подкаталогах), добавив что-то вроде этого в свой файл httpd.conf:

<Directory "/var/www/example.com/public/uploads">
  # Turn PHP parsing off
  php_flag engine off

  # Make .htaccess ineffective in the said directory
  AllowOverride None

  # Make index.php ineffective
  DirectoryIndex Off

  # (Optional) Show content of PHP files in browser (as if it were a text file)
  AddType text/plain .php .php3 .php4 .php5 .php6 .phtml

  RewriteEngine On

  # Return '403 Forbidden' for PHP files
  RewriteRule \.php$ - [F,L]
</Directory>

Если вы используете файл .htaccess, поместите его в каталог статического содержимого (в моем случае '/var/www/example.com/public/uploads') со следующей записью:

# Turn PHP parsing off
php_flag engine off

# Make index.php ineffective
DirectoryIndex Off

# (Optional) Show content of PHP files in browser (as if it were a text file)
AddType text/plain .php .php3 .php4 .php5 .php6 .phtml

RewriteEngine On

# Return '403 Forbidden' for PHP files
RewriteRule \.php$ - [F,L]

Кроме того, я только что понял, что если ваше приложение уже использует слой кеширования, что-то вроде Varnish, например Varnish перед Apache, обслуживающим кэшированные страницы и статический контент, вам не нужно ничего делать!

Это зависит от того, как вы настраиваете apache с помощью php, как вы оптимизируете свою конфигурацию. Если php настроен с интерфейсом CGI, тогда apache будет передавать только определенные типы файлов на php извне (так же, как, например, с nginx), поэтому влияние на другие файлы 0, в случае модуля это может быть быстрее с динамические страницы, потому что он не вызывает php извне, но может быть медленнее для других, потому что модуль php постоянно загружается с помощью apache, несмотря на то, что он все еще активен только для определенного типа файлов (в соответствии с mimetype).

  1. Да нет

  2. Используйте mod_fcgid с php

Пример php, настроенного как модуль, который анализирует только файлы .php (RHEL5 / 6, Fedora):

[root@main ~]# cat /etc/httpd/conf.d/php.conf
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>


#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
AddType application/x-httpd-php-source .phps