Конфігурація веб-сервера
Дата оновлення перекладу 2024-06-07
Конфігурація веб-сервера
Бажаним способом розробки вашого додатку Symfony є використання локального веб-сервера Symfony.
Однак, при запуску додатку у середовищі виробництва, вам знадобиться використовувати веб-сервер з повним функціоналом. Ця стаття описує декілька способів використання Symfony з Apache або Nginx.
Конфігурація 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 в інфраструктурі контейнера.