переписать — NGINX + php-fpm + Symfony 1.4 = :(

Тьфу, пытаюсь заставить NGINX / php-fpm хорошо играть с SF 1.4 уже несколько дней, и, похоже, не могу придумать правильный конфиг. Я следовал за Руководство по nginx Symfony так же как и это ТАК сообщение, но ни одна из них не помогла, и я подозреваю, что это может быть связано с тем, что они были настроены для более старых версий NGINX (я работаю с 1.6.2).

Вот мой конфиг:

server {

listen 51000;

server_name example.mpurcell.dev.example.com;
access_log /tmp/access.log;
error_log /tmp/error.log notice;
root /home/mpurcell/projects/j1n/app/example/current/code/web/;

index index.php;

location ~ ^/(app|app_dev)(/|$) {
rewrite ^(.*)$ $1.php last;
}

location ~ ^/(app|app_dev).php(/|$) {

try_files $uri =404;

include /etc/nginx/fastcgi_params;

fastcgi_split_path_info ^(.+?\.php)(/.*)$;

if (!-f $document_root$fastcgi_script_name) {
return 404;
}

fastcgi_param SERVICE_ENV 'dev';
fastcgi_param HTTPS off;

# http://wiki.nginx.org/Symfony
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;

fastcgi_pass    unix:/var/run/php-fpm.sock;
}
}

И различные ответы:

$ -> curl -v 10.0.0.7:51000

# Expected
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.6.2
< Date: Wed, 01 Oct 2014 23:34:10 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< Location: /app

$ -> curl -v 10.0.0.7:51000/app.php

# Expected
< HTTP/1.1 200 OK
< Server: nginx/1.6.2
< Date: Wed, 01 Oct 2014 23:37:48 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: private

$ -> curl -v 10.0.0.7:51000/app

# Not expected, the script executes but SF throws a 404 with the following error
#  Empty module and/or action after parsing the URL "/app" (/).
< HTTP/1.1 404 Not Found
< Server: nginx/1.6.2
< Date: Wed, 01 Oct 2014 23:39:09 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: private

И это похоже на то, что правило перезаписи из конфигурации vhost работает:

2014/10/01 23:40:30 [notice] 9668#0: *13 "^(.*)$" matches "/app", client: 10.0.0.3, server: example.mpurcell.dev.example.com, request: "GET /app HTTP/1.1", host: "dev-a-2:51000"2014/10/01 23:40:30 [notice] 9668#0: *13 rewritten data: "/app.php", args: "", client: 10.0.0.3, server: example.mpurcell.dev.example.com, request: "GET /app HTTP/1.1", host: "dev-a-2:51000"

И ради полноты cgi.fix_pathinfo по умолчанию (= 1), и я не хочу устанавливать это на 0.

Кроме того, я должен отметить, что relative_url_root для контроллера приложения задана пустая строка, так как она находится в корневом веб-каталоге.

стек:

nginx 1.6.2
php-fpm 5.4.33
php 5.4.33

0

Решение

Я думаю, что ваша проблема в том, что вы не сказали nginx, где находится Symfony. Я поместил пример конфигурации nginx, которую я использую в настоящее время, которая работает.

server {
listen 80;

server_name example.com;
chunked_transfer_encoding on;
proxy_buffering off;

charset utf-8;

root /home/mpurcell/projects/j1n/app/example/current/code/web;
access_log /tmp/access_log;
error_log /tmp/error_log;

location /sf/ {
expires max;
root /home/mpurcell/projects/j1n/app/example/current/code/lib/vendor/symfony/data/web/;
}

location ~ ^/(index|frontend_dev|backend_dev)\.php($|/) {
set  $script $uri;
set  $path_info "";

if ($uri ~ "^(.+\.php)(/.*)") {
set  $script     $1;
set  $path_info  $2;
}

include fastcgi_params;
fastcgi_param  PATH_INFO         $path_info;
fastcgi_param  SCRIPT_FILENAME   $document_root$script;
fastcgi_param  SCRIPT_NAME       $script;
fastcgi_param  HTTPS off;
fastcgi_pass  127.0.0.1:9000;
fastcgi_keep_conn on;
fastcgi_intercept_errors on;
}

location / {
if (-f $request_filename) {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
break;
}
if ($request_filename ~ ".(js|htc|ico|gif|jpg|png|css)$") {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
break;
}
index index.php;
try_files $uri /index.php?$args;
}
}

Для вас проблема, я думаю, ключ заключается в следующем:

  location /sf/ {
expires max;
root /home/mpurcell/projects/j1n/app/example/current/code/lib/vendor/symfony/data/web/;
}
0

Другие решения

Таким образом, я наконец-то получил Symfony и php-fpm, чтобы они хорошо играли друг с другом, и одной большой частью этой головоломки была замена Apache на nginx. IMO, синтаксис переписывания для nginx> apache. Итак, вот пример моей текущей конфигурации сервера приложений:

location @rewrite {
rewrite ^/(.*)$ /index.php/$1 last;
}

location /admin {
rewrite ^/admin/(.*)$ /admin/index.php/$1 last;
}

location /app {
rewrite ^/app/(.*)$ /index.php/$1 last;
}

location ~ index\.php {
...
}

Мне нужно было создать вспомогательные каталоги для каждого контроллера в веб-каталоге, например так:

/web
index.php
app.php
admin.php

/web
/app/index.php
/admin/index.php

У меня был этот конфиг в prod уже около 2 месяцев с 0 проблемами, так что, надеюсь, это поможет и другим старым школьным симфониям.

0

По вопросам рекламы [email protected]