Удобна за NginX PHP рамка

Търся PHP рамка, която, ако имам късмет, работи само в nginx под FastCGI, в противен случай такава, която не изисква прекалено много настройки.


person Rixius    schedule 22.10.2010    source източник
comment
Хм, какви проблеми срещнахте с една от 200-те съществуващи PHP рамки?   -  person mario    schedule 22.10.2010
comment
Рамките не се интересуват от уеб сървъра. Просто трябва да го настроите правилно.   -  person Galen    schedule 22.10.2010
comment
@Galen: Съдържанието на $_SERVER варира в зависимост от уеб сървъра, така че настройката наистина е необходима.   -  person cmc    schedule 19.07.2011


Отговори (3)


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. Това прекъсва URL адресите с pathinfo и symfony разчита на тях. Решението, използвано тук, е изрично да посочите файловете, които се анализират като php.

За повече информация вижте nginx+php-cgi предупреждение за сигурност

Платформи

Това работи и е сигурно на Debian Squeeze системи, които използват dotdeb за nginx и php-fpm пакети, както и Ubuntu 10.04 Lucid Lynx системи, които използвайте ppa/brianmercer за php-fpm. Може или не може да работи и да е защитен на други системи.

Бележка за употреба

За да добавите друг PHP файл, допълнителен файл.php за анализиране, използвайте този синтаксис и в двата блока за местоположение:

местоположение ~ ^(index|frontend|frontend_dev|backend|backend_dev|additionalfile).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;
  }
}
person cmc    schedule 19.07.2011
comment
Трябваше да премахна $ от първия ви блок location във версия 1.4, за да работят този вид пътища за мен: /backend_dev.php/module/action. Това лошо ли е от гледна точка на сигурността? - person Sebastián Grignoli; 16.02.2013
comment
@SebastiánGrignoli Да, това ще причини потенциална уязвимост на сигурността, както и опасност за безопасността. Някой може да качи файл, наречен index.php.jpg, съдържащ злонамерен php код и nginx ще го изпълни. Или можете да качите файл index.php.txt, в който сте възнамерявали да покажете на приятелите си своя примерен код за вашата рекурсивна версия на функцията за премахване на връзката на php. - person cmc; 28.02.2013
comment
Но докато злонамереният index.php.jpg на трета страна не се намира в корена на сайта, той няма да съответства на израза и следователно няма да се изпълни. нали - person Sebastián Grignoli; 28.02.2013
comment
Ти си прав. Но това е малко като да спорите, че малка мина в къщата ви е по-добра от голяма. - person cmc; 28.02.2013
comment
Целият подход на Nginx към сигурността ми изглежда така. - person Sebastián Grignoli; 05.03.2013

Както отбелязаха някои коментатори, просто трябва да настроите правилно nginx. Ето публикация, която настройва nginx за codeigniter.

person rojoca    schedule 22.10.2010
comment
Търсих рамки, които изискват малко настройка на tono, или публикации, илюстриращи как да настроите някои, благодаря ви за това, не се натъкнах на това; това помага много. - person Rixius; 22.10.2010
comment
Ако искате да извлечете максимума от nginx, наистина трябва да научите всички тънкости на неговата конфигурация. Ако искате лесна настройка, по-добре е да използвате apache - person rojoca; 22.10.2010
comment
Колкото повече четях, толкова повече осъзнавах, че си абсолютно прав Rojoca, просто бях мързелив и връзката ти за codeignitor помогна чудеса. - person Rixius; 11.12.2010

Това репо ми помогна със symfony 1.4 на nginx+php-fpm [https://raw.githubusercontent.com/korjavin/docker-nginx-symfony/my/default][1]

person MaximKostrikin    schedule 21.03.2015