【问题标题】:NGINX + php-fpm + Symfony 1.4 = :(NGINX + php-fpm + Symfony 1.4 = :(
【发布时间】:2014-11-26 22:42:50
【问题描述】:

呃,几天来一直试图让 NGINX/php-fpm 与 SF 1.4 很好地配合,但似乎无法确定正确的配置。我关注了nginx symfony guideSO 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

而且看起来虚拟主机配置中的重写规则确实有效:

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 设置为空字符串,因为它位于根 Web 目录中。

堆栈:

nginx 1.6.2
php-fpm 5.4.33
php 5.4.33

【问题讨论】:

  • 检查您的配置是否适用于正确版本的框架:如果您使用的是 sf 1.4,则发布 sf 2.x 的配置(app*.php 是典型的 sf2.x 和前端* .php backendé.php 是典型的 sf1.4)。希望对您有所帮助。
  • 我发布的链接指向 SF2,但在同一个链接中引用了 1.4 NGINX 配置,我尝试使用但也没有工作。对于我的 SF1 项目,我使用的是 app、admin、api 控制器,而不是蹩脚的 fe 和 be 控制器。

标签: nginx rewrite symfony-1.4 php vhosts


【解决方案1】:

我认为你的问题是你没有告诉 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/;
  }

【讨论】:

    【解决方案2】:

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

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

    我已经在 prod 中使用这个配置大约 2 个月了,有 0 个问题,所以希望这对其他老派 symfonians 也有帮助。

    【讨论】:

      【解决方案3】:

      这是我用于 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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        相关资源
        最近更新 更多