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