配置的重点在server这个node上,其他用nginx默认配置就行,这里就只写出server那一块的配置。因为symfony需要一些php $_SERVER里的变量来做路由,但是nginx赋给php的$_SERVER值并不是完全正确的,我也是查了不少资料才调好的,希望能对想让symfony在nginx上跑的同学有所帮助


http {
  ...
  server {
    listen      80; #nginx的端口
    server_name localhost; #网站网址,这里以localhost为例
    root        /path/to/root; #根目录路径
    chareset    utf-8;
    location /sf/ { #如果url匹配"/sf/"
      alias /path/to/symfony/data/web/sf/; #访问/sf下面的资源所在的目录
    }
    location ~ ^/.+\.php(/.*)?$ { #如果匹配类似/frontend_dev.php/*这样的
      set $script $fastcgi_script_name; #像/frontend_dev.php这样的url,直接把$fastcgi_script_name赋值给$script
      if ($document_uri ~ ^(.+\.php)(/.*)) { #如果又匹配/frontend_dev.php/article/1这样的
        set $script    $1; #把frontend_dev.php赋值给$script
        set $path_info $2; #把/article/1赋值给$path_info,如果用nginx默认的配置,$_SERVER['path_info']会不正确而导致symfony找不到正确的路由
      }
      fastcgi_pass  127.0.0.1:9000; #php-cgi服务
      #下面开始给php的$_SERVER相关变量赋值,不写对都有可能运行不了symfony
      include       fastcgi_params; #这里面有很多nginx默认给php的$_SERVER赋的环境变量值,
                                    #如果你想要把这句放后面的话,下面已经赋过值的记得注释掉,否则又被覆盖回原来的错误值
      fastcgi_param SCRIPT_FILENAME $document_root$script;
      fastcgi_param SCRIPT_NAME     $script;
      fastcgi_param PATH_INFO       $path_info;
      fastcgi_param DOCUMENT_URI    $document_uri;
      
    }
    location / { #当前面的规则都不匹配,就运行这个(剩下的url肯定都匹配/)
      if (-f $request_filename) { #如果资源(像css,js这样的文件)和请求的url是匹配的,也就是说能根据url直接找到
        expires max; #那就永不过期
        break;       #并且不往下执行了
      }
      #否则得话都给他rewrite到index.php上去
      rewrite .* /index.php last;
    }
  }
}
关于path_info部分还有更简单的写法,而且是官方例子,参见我另外一篇博客。

另外配置symfony等单一入口框架也有更好的例子,参见我新写的文章