呃,一直试图让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
答案 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;
}