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

Дата оновлення перекладу 2022-06-02

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

Бажаним способом розробки вашого додатку Symfony є використання локального веб-сервера Symfony.

Однак, при запуску додатку у середовищі виробництва, вам знадобиться використовувати веб-сервер з повним функціоналом. Ця стаття описує декілька способів використання 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/ .

Додавання правил перезапису

Найпростіший спосіб встановити пакет Symfony apache - виконавши наступну команду:

1
$ composer require symfony/apache-pack

Цей пакет встановлює файл .htaccess у каталозі public/, який містить правила перезапису, необхідні для обслуговування додатку Symfony.

На серверах виробництва ви можете перемістити правила .htaccess у головний файл конфігурації Apache, щоб покращити продуктивність. Щоб зробити це, скопіюйте зміст .htaccess у конфігурацію <Directory>, асоційовану з каталогом додатку Symfony public/ (та замініть AllowOverride All на AllowOverride None):

1
2
3
4
5
6
7
8
9
10
<VirtualHost *:80>
    # ...
    DocumentRoot /var/www/project/public

    <Directory /var/www/project/public>
        AllowOverride None

        # Скопіюйте зміст .htaccess сюди
    </Directory>
</VirtualHost>

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/public
    <Directory /var/www/project/public>
        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

Якщо ваша система підтримує змінну APACHE_LOG_DIR, ви можете захотіти використати ${APACHE_LOG_DIR}/ замість жорсткого кодування /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
36
<VirtualHost *:80>
    ServerName domain.tld
    ServerAlias www.domain.tld

    DocumentRoot /var/www/project/public
    DirectoryIndex /index.php

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

        FallbackResource /index.php
    </Directory>

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

    # за бажанням, відключіть RewriteEngine для каталогів ресурсів,
    # що дозволить apache просто відповідати помилкою 404, коли файли
    # не знайдено, замість того, щоб передавати запит у symfony
    <Directory /var/www/project/public/bundles>
        DirectoryIndex disabled
        FallbackResource disabled
    </Directory>
    ErrorLog /var/log/apache2/project_error.log
    CustomLog /var/log/apache2/project_access.log combined

    # за бажанням, встановіть значення змінних середовища, які використовуються додатком
    #SetEnv APP_ENV prod
    #SetEnv APP_SECRET <app-secret-id>
    #SetEnv DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name"
</VirtualHost>

Caution

Використовуйте FallbackResource в Apache 2.4.25 або вище у зв'язку з проблемою, яка викликає підвисання кореня /, яка була виправлена у цьому релізі.

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 і php7.4-fpm).

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

1
2
3
4
5
6
7
8
9
10
; пул під назвою www
[www]
user = www-data
group = www-data

; використати сокет unix-домена
listen = /var/run/php/php7.4-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
52
server {
    server_name domain.tld www.domain.tld;
    root /var/www/project/public;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

    # за бажанням, відключіть повернення до PHP-скрипта для ресурсів каталогів;
    # nginx поверне помилку 404, якщо файли не будуть знайдені, замість передачі
    # запиту Symfony (покращує продуктивність, але сторінка Symfony 404 не відображається)
    # location /bundles {
    #     try_files $uri =404;
    # }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;

        # за бажанням, встановіть значення змінних середовища, які використовуються у додатку
        # fastcgi_param APP_ENV prod;
        # fastcgi_param APP_SECRET <app-secret-id>;
        # fastcgi_param DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name";

        # коли ви використовуєте символьні посилання для вказівки кореню документа на
        # поточну версію вашого додатку, ви маєте передати PHP FPM реальний шлях
        # додатку замість шляху символьного посилання.
        # Інакше OPcache PHP може може хибно визначити зміни у ваших PHP-файлах
        # (див. https://github.com/zendtech/ZendOptimizerPlus/issues/126, щоб дізнатися
        # більше інформації).
        # Caveat: Коли PHP-FPM розташований на іншій машині, ніж nginx
        #         $realpath_root може не вирішитися так, як ви очікуєте! В цьому випадку спробуйте
        #         використати $document_root.
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        # Уникає URI, що містять фронт-контролер. Це призведе до 404:
        # http://domain.tld/index.php/some-path
        # Видаліть внутрішню директиву, щоб дозволити такі URI
        internal;
    }

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

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

Tip

Якщо ви використовуєте NGINX Unit, прочитайте офіційну статтю про те, Як запускати додатки Symfony, використовуючи NGINX Unit.

Note

В залежності від вашої конфігурації PHP-FPM, fastcgi_pass також може бути fastcgi_pass 127.0.0.1:9000.

Tip

Це виконує лише app.php, app_dev.php і config.php у веб-каталозі. Всі інші файли, що закінчуються на ".php", отримають відмову.

Якщо у вас є інші PHP-файли у вашому веб-каталозі, які необхідно виконати, переконайтеся в тому, що ви включили їх в блок location вище.

Caution

Після розгортання у виробництво, переконайтеся, що ви не можете отримати доступ до скрипта index.php (тобто http://example.com/index.php).

Для просунутих опцій конфігурації Nginx, прочитайте офіційну Документацію Nginx.