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

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

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

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

Однак, при запуску додатку у середовищі виробництва, вам знадобиться використовувати веб-сервер з повним функціоналом. Ця стаття описує декілька способів використання Symfony з Apache або Nginx.

Публічний каталог є домівкою для всіх публічних і статичних файлів вашого додатку, включаючи зображення, таблиці стилів та файли JavaScript. Це також те місце, де знаходиться фронт-контролер (index.php).

Публічний каталог слугує коренем документа при конфігурації вашого веб-сервера. У наведених нижче прикладах каталог public/ буде коренем документа. Це каталог /var/www/project/public/.

Якщо ваш хостинг-провайдер вимагає змінити каталог public/ на інше розташування (наприклад, public_html/), переконайтеся, що ви перевизначили розташування каталогу public/ .

Конфігурація PHP-FPM

Усі наведені нижче приклади конфігурації використовують менеджер процесів PHP FastCGI (PHP-FPM). Переконайтеся, що у вас встановлено PHP-FPM (наприклад, у системі на основі Debian, ви повинні встановити пакет php-fpm).

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

1
2
3
4
5
6
7
8
9
10
11
12
; /etc/php/7.4/fpm/pool.d/www.conf

; a pool called www
[www]
user = www-data
group = www-data

; використати сокет домену unix
listen = /var/run/php/php7.4-fpm.sock

; або слухати зʼєднання TCP
; listen = 127.0.0.1:9000

Apache

Якщо ви використовуєте Apache 2.4+, ви можете використовувати mod_proxy_fcgi для передачі вхідних запитів до PHP-FPM. Встановіть мод Apache2 FastCGI(libapache2-mod-fastcgi у Debian), увімкніть 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
# /etc/apache2/conf.d/example.com.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

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

    <FilesMatch \.php$>
        # при використанні PHP-FPM в якості сокета unix
        SetHandler proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://dummy

        # коли PHP-FPM сконфігуровано для використання TCP
        # SetHandler proxy:fcgi://127.0.0.1:9000
    </FilesMatch>

    DocumentRoot /var/www/project/public
    <Directory /var/www/project/public>
        AllowOverride None
        Require all granted
        FallbackResource /index.php
    </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>

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.

Tip

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

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

Caution

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

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

Caddy

При використанні Caddy на сервері ви можете використовувати таку конфігурацію:

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
# /etc/caddy/Caddyfile
example.com, www.example.com {
    root * /var/www/project/public

    # видати файли напряму, якщо їх не знайдено (наприклад, файли CSS або JS в public/)
    encode zstd gzip
    file_server

    # інакше, використовувати PHP-FPM (замінити "unix//var/..." на "127.0.0.1:9000" при використанні TCP)
    php_fastcgi unix//var/run/php/php7.4-fpm.sock {
        # за бажанням встановити значення змінних середовища, використовуваних в додатку
        # env APP_ENV "prod"
        # env APP_SECRET "<app-secret-id>"
        # env DATABASE_URL "mysql://db_user:db_pass@host:3306/db_name"

        # Сконфігурувати FastCGI, щоб розвʼязати всі символьні посилання у кореневому шляху.
        # Це гарантує, що OpCache використовує імена файлів призначення, замість
        # символьних посилань, для кешування opcode та файлів php, дивіться
        # https://caddy.community/t/root-symlink-folder-updates-and-caddy-reload-not-working/10557
        resolve_root_symlink
    }

    # повернти 404 для всіх інших файлів php, які не співпадають з фронт-контролером
    # це запобігає доступу до інших файлів php, до яких ви не хочете надавати доступ.
    @phpFile {
        path *.php*
    }
    error @phpFile "Not found" 404
}

Дивіться офіційну документацію Caddy, щоб побачити більше прикладів, таких як використання Caddy в інфраструктурі контейнера.