NGINX + php-fpm + Symfony 1.4 = :(

时间:2014-10-01 23:45:30

标签: nginx rewrite symfony-1.4 php vhosts

呃,一直试图让NGINX / php-fpm与SF 1.4很好地玩几天,并且似乎无法确定正确的配置。我跟着nginx symfony guide以及SO post,但没有帮助,我怀疑它可能是因为它们是针对旧版本的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。

此外,我应该注意,app控制器的relative_url_root设置为空字符串,因为它位于根网站目录中。

堆栈:

nginx 1.6.2
php-fpm 5.4.33
php 5.4.33

3 个答案:

答案 0 :(得分: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/;
  }

答案 1 :(得分:0)

所以我终于让Symfony和php-fpm很好地相互配合,而这个难题的一大部分就是为nginx换掉apache。 IMO,nginx的重写语法&gt;阿帕奇。所以这是我当前的应用服务器配置的一个例子:

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目录中的每个控制器创建子目录,如下所示:

/web
    index.php
    app.php
    admin.php

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

我现在有了这个配置,现在已经有2个月了0期,所以希望这也有助于其他老派的symfonians。

答案 2 :(得分:0)

这是我用于symfony 1.4的配置

location ~ \.php($|/) {
        fastcgi_pass php56:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }