Конфигурация веб-сервера

Предпочитаемым способом разработки вашего приложения Symfony является использование внутреннего веб-сервера PHP. Однако, при использовании более старой версии PHP или при загрузке приложения в окружении производства, вам понадобится использовать веб-сервер с полным функционалом. Эта статья описывает несколько способов использования Symfony с Apache или Nginx.

При использовании Apache, вы можете сконфигурировать PHP как Apache-модуль или с FastCGI, используя PHP FPM. FastCGI также является предпочитаемым способом использования PHP с Nginx.

Веб-каталог - это дом всех публичных и статических файлов вашего приложения, включая изображения, таблицы стилей, и файлы Java-скриптов. Также там живут фронт-контроллеры (app.php и app_dev.php).

Веб-каталог служит в качестве корня документа при конфигурации вашего веб-сервера. В примерах ниже, каталог web/ будет корнем документа. Этот каталог - /var/www/project/web/.

Если ваш провайдер хостинга требует, чтобы вы изменили каталог web/ на другую локацию (например, public_html/), то убедитесь в том, что вы переопределите локацию каталога web/.

Apache с mod_php/PHP-CGI

Минимальной конфигурацией необходимой для запуска вашего приложения под Apache является:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    DocumentRoot /var/www/project/web
    <Directory /var/www/project/web>
        AllowOverride All
        Order Allow,Deny
        Allow from All
    </Directory>

    # Уберите комментарии из следующих строк, если вы установили ресурсы как символьные ссылки
    # или столкнётесь с проблемами при компиляции ресурсов LESS/Sass/CoffeeScript
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

Tip

If your system supports the APACHE_LOG_DIR variable, you may want to use ${APACHE_LOG_DIR}/ instead of hardcoding /var/log/apache2/.

Используйте следующую оптимизированную конфигурацию, чтобы отключить поддержку .htaccess и увеличить производительность веб-сервера:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    DocumentRoot /var/www/project/web
    <Directory /var/www/project/web>
        AllowOverride None
        Order Allow,Deny
        Allow from All

        <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ app.php [QSA,L]
        </IfModule>
    </Directory>

    # Уберите комментарии из следующих строк, если вы установили ресурсы как символьные ссылки
    # или столкнётесь с проблемами при компиляции ресурсов LESS/Sass/CoffeeScript
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    # по желанию отключите RewriteEngine для каталогов ресурсов,
    # что позволит apache просто отвечать ошибкой 404, когда файлы
    # не найдены, вместо того, чтобы передавать запрос в symfony
    <Directory /var/www/project/web/bundles>
        <IfModule mod_rewrite.c>
            RewriteEngine Off
        </IfModule>
    </Directory>
    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

Tip

Если вы используете php-cgi, Apache не передаёт базовые HTTP имя пользователя и пароль в PHP по умолчанию. Чтобы обойти это ограничение, вам стоит использовать следующий отрезок конфигурации:

1
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Использование mod_php/PHP-CGI с Apache 2.4

В Apache 2.4, Order Allow,Deny был заменён Require all granted. Поэтому вам нужно будет изменить ваши настройки доступа Directory следующим образом:

1
2
3
4
<Directory /var/www/project/web>
    Require all granted
    # ...
</Directory>

Для продвинутых опций конфигурации Apache, прочтите официальную `Документацию Apache`_.

Apache с PHP-FPM

Чтобы воспользоваться PHP5-FPM в Apache, вам для начала надо убедиться в том, что у вас установлены менеджер бинарный процессов FastCGI php-fpm и модуль Apache FastCGI (например, в системе, основанной на Debian, вам понадобится установить пакеты libapache2-mod-fastcgi и php5-fpm).

PHP-FPM использует так называемые пулы для обработки входящих FastCGI-запровос. Вы можете сконфигурировать произвольное количество пулов в конфигурации FPM. В пуле, вы конфигурируете либо канал TCP (IP и порт), либо канал Unix-домена для прослушивания. Каждый пул также можно запускать под разными UID и GID:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
; a pool called www
[www]
user = www-data
group = www-data

; использовать канал unix-домена
listen = /var/run/php5-fpm.sock

; или прослушивать канал TCP
listen = 127.0.0.1:9000

Использование mod_proxy_fcgi с Apache 2.4

Если вы запускаете Apache 2.4, вы с лёгкостью можете использовать mod_proxy_fcgi, чтобы передать входящие запросы PHP-FPM. Сконфигурируйте PHP-FPM для прослушивания канала TCP или Unix-домена, включите mod_proxy и mod_proxy_fcgi в вашей конфигурации Apache, и используйте указание SetHandler, чтобы передавать запросы PHP-файлов PHP FPM:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    # Уберите комментарии из следующей строки, чтобы заставить Apache передать заголовок
    # авторизации (Authorization) PHP: необходимо для "basic_auth" в PHP-FPM и FastCGI
    # SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    # Для версии Apache 2.4.9 или новее
    # Использование SetHandler помогает избежаь проблем при исползовании ProxyPassMatch в комбинации
    # с mod_rewrite или mod_autoindex
    <FilesMatch \.php$>
        SetHandler proxy:fcgi://127.0.0.1:9000
        # Для Unix-каналов, Apache 2.4.10 или новее,
        # SetHandler proxy:unix:/path/to/fpm.sock|fcgi://dummy
    </FilesMatch>

    # Если вы используете более раннюю версию Apache, чем 2.4.9, вы должны рассмотреть вариант
    # обновления или используйте вместо этого
    # ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/web/$1

    # Если вы запускаете ваше приложение Symfony на субпути вашего документа корня,
    # регулярное выражение должно быть изменено соответственно:
    # ProxyPassMatch ^/path-to-app/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/web/$1

    DocumentRoot /var/www/project/web
    <Directory /var/www/project/web>
        # enable the .htaccess rewrites
        AllowOverride All
        Require all granted
    </Directory>

    # Уберите комментарии из следующих строк, если вы устанавливаете ресурсы как символьные ссылки
    # или столкнётесь с проблемами при компиляции ресурсов LESS/Sass/CoffeeScript
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

PHP-FPM с Apache 2.2

В версии Apache 2.2, или старее, вы не можете использовать mod_proxy_fcgi. Вам нужно использовать вместо этого указание FastCgiExternalServer. Поэтому, ваша конфигурация Apache должна выглядеть как-то так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization

    DocumentRoot /var/www/project/web
    <Directory /var/www/project/web>
        # включите перезапись .htaccess
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>

    # уберите комментарии из следующих строк, если вы устаналиваете ресурсы как символьные ссылки
    # или столкнётесь с проблемами при компиляции ресурсов LESS/Sass/CoffeeScript
    # <Directory /var/www/project>
    #     Options FollowSymlinks
    # </Directory>

    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>

Если вы предпочитаете использовать Unix-канал, то вместо этого вам стоит использовать опцию -socket:

1
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization

Nginx

Минимальной конфигурацией для запуска вашего приложения под Nginx является:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
server {
    server_name domain.tld www.domain.tld;
    root /var/www/project/web;

    location / {
        # попробуйте обслужить файл напрямую, резервный откат - app.php
        try_files $uri /app.php$is_args$args;
    }
    # DEV
    # Это правило стоит помещать только в вашем окружении разработки
    # В производстве не включайте это и не развёртывайте app_dev.php или config.php
    location ~ ^/(app_dev|config)\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        # Когда вы используете символьные ссылки для связи корня документа
        # с текущей версией вашего приложения, вы должны передать настоящий
        # путь приложения, вместо пути к символьной ссылке PHP FPM.
        # В обратном случае, OPcache PHP может некорректно уловить изменения
        # в ваших PHP-файлах (смотрите https://github.com/zendtech/ZendOptimizerPlus/issues/126,
        # чтобы узнать больше).
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }
    # PROD
    location ~ ^/app\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        # Когда вы используете символьные ссылки для связи корня документа
        # с текущей версией вашего приложения, вы должны передать настоящий
        # путь приложения, вместо пути к символьной ссылке PHP FPM.
        # В обратном случае, OPcache PHP может некорректно уловить изменения
        # в ваших PHP-файлах (смотрите https://github.com/zendtech/ZendOptimizerPlus/issues/126,
        # чтобы узнать больше).
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        # Предотвращает URI, которые включают фронт-контроллер. Это вызовет ошибку 404:
        # http://domain.tld/app.php/some-path
        # Удалите внутренне указание, чтобы внутренне разрешить такие URI, как эта;
    }

    # вернуть 404 для всех других файлов, не соответствующих фронт-контроллеру
    # это предотвращает доступ к другим php-файлам, которые вы не хотите делать доступными.
    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}

Note

В зависимости от вашей конфигурации PHP-FPM config, fastcgi_pass также может быть fastcgi_pass 127.0.0.1:9000.

Tip

Это выполняет только app.php, app_dev.php и config.php в веб-каталоге. Все другие файлы, заканчивающиеся на ".php", получат отказ.

Если у вас есть другие PHP-файлы в вашем веб-каталоге, которые нужно выполнить, убелитесь в том, что вы включили их в блок location выше.

Caution

После развёртывания в производство, убедитесь, что вы не можете получить доступ к скриптам app_dev.php или``config.php`` (т.е. http://example.com/app_dev.php и http://example.com/config.php). Если вы можете получить к ним доступ, обязательно удалте раздел DEV из конфигурации выше.

Note

По умолчанию, приложения Symfony включают несколько файлов .htaccess, чтобы конфигурировать перенаправления и чтобы избегать неавторизованный доступ к некоторым чувствительным каталогам. Эти файлы полезны только при использовании Apache, так что вы можете спокойно удалить их при использованииNginx.

Для продвинутых опций конфигурации Nginx, прочтите официальную Документацию Nginx.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.