Symfony 1.4 с nginx - это просто фантастика. Я уже сделал настройку, вот обобщение моей производственной конфигурации, которое я могу поручить, пригодно для производственного использования.
server {
listen 80;
server_name mysite.com;
root /var/www/mysite.com/web;
access_log /var/log/nginx/mysite.com.access.log;
error_log /var/log/nginx/mysite.com.error.log;
location ~ ^/(index|frontend|frontend_dev|backend|backend_dev)\.php$ {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param HTTPS off;
fastcgi_pass 127.0.0.1:9000;
}
location / {
index index.php;
try_files $uri /index.php?$args;
}
}
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/certs/mysite.com.crt;
ssl_certificate_key /etc/ssl/private/mysite.com.key;
server_name mysite.com;
root /var/www/mysite.com/web;
access_log /var/log/nginx/mysite.com.access.log;
error_log /var/log/nginx/mysite.com.error.log;
location ~ ^/(index|frontend|frontend_dev|backend|backend_dev)\.php$ {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_pass 127.0.0.1:9000;
}
location / {
index index.php;
try_files $uri /index.php?$args;
}
}
PHP 5.4 Примечание
php5-fpm 5.4, поставляемый с dotdeb, теперь использует сокеты вместо loopback по умолчанию. Если вы используете PHP 5.4 и вы получаете ошибку шлюза в вышеупомянутой конфигурации, попробуйте заменить все экземпляры 127.0.0.1:9000
на unix:/var/run/php5-fpm.sock
.
php-fpm 5.4 также ограничивает расширения файлов, которые могут быть проанализированы как PHP, теми, которые указаны в security.limit_extensions
. Это может быть интересно, если вы изменили регулярное выражение местоположения, добавив в него другие расширения, чем .php
. Приведенное ниже примечание по безопасности остается в силе.
Примечание по безопасности
Этот конфиг анализирует только файлы index.php, frontend.php, frontend_dev.php, backend.php и backend_dev.php с PHP.
С php и nginx в целом, а не только с symfony, используя
location \.php$ {
...
}
вызывает уязвимость безопасности, связанную с URL-адресами, использующими pathinfo, например: /index.php/foo/bar.
Обычный обходной путь - установить fix_pathinfo = 0 в php.ini. Это нарушает pathinfo URL, и Symfony полагается на них. Решением, используемым здесь, является явное указание файлов, которые анализируются как php.
Дополнительные сведения см. В предупреждении о безопасности nginx + php-cgi.
1029 * Платформа *
Это работает и безопасно в Debian Squeeze системах, которые используют dotdeb для пакетов nginx и php-fpm , а также Ubuntu 10.04 Lucid Lynx систем, которые используйте ppa / brianmercer для php-fpm . Это может или не может работать и быть безопасным в других системах.
Примечание по использованию
Чтобы добавить еще один PHP-файл Additionalfile.php для анализа, используйте этот синтаксис в обоих блоках расположения:
location ~ ^ (index | frontend | frontend_dev | backend | backend_dev | дополнительный файл) .php $ {
...
}
Редактировать: Выход Symfony 2.0! Вот конфиг, адаптированный из конфига 1.4 выше:
server {
listen 80;
server_name symfony2;
root /var/www/symfony2/web;
error_log /var/log/nginx/symfony2.error.log;
access_log /var/log/nginx/symfony2.access.log;
location / {
index app.php;
if (-f $request_filename) {
break;
}
rewrite ^(.*)$ /app.php last;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ (app|app_dev).php {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param HTTPS off;
fastcgi_pass 127.0.0.1:9000;
}
}
server {
listen 443;
server_name symfony2;
root /var/www/symfony2/web;
ssl on;
ssl_certificate /etc/ssl/certs/symfony2.crt;
ssl_certificate_key /etc/ssl/private/symfony2.key;
error_log /var/log/nginx/symfony2.error.log;
access_log /var/log/nginx/symfony2.access.log;
location / {
index app.php;
if (-f $request_filename) {
break;
}
rewrite ^(.*)$ /app.php last;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ (app|app_dev).php {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param HTTPS off;
fastcgi_pass 127.0.0.1:9000;
}
}