使用Symfony3提供远程静态文件服务

8

我有一个关于 Nginx 配置的问题。我有两个服务器,一个是 Nginx 服务器,另一个是我的 symfony3 Web 应用程序所在的服务器。

这是我的配置:

location /portal/mysite/ {

    set $frontRoot /srv/data/apps/mysite-portal-stag/current/web;
    set $sfApp app.php; # Change to app.php for prod or app_dev.php for dev

    root  /srv/data/apps/mysite-portal-stag/current/web;

    rewrite ^/portal/mysite/(.*)$ /$1 break; 
    try_files $uri @sfFront;

}
location @sfFront {

    root  /srv/data/apps/mysite-portal-stag/current/web;

    fastcgi_pass myserver:myport;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $frontRoot/$sfApp;

    fastcgi_param SCRIPT_NAME /portal/mysite/$sfApp;

}

该网站的所有PHP脚本都可以正常工作,但是所有静态资产(静态文件)却无法正常显示。我对Nginx的工作原理不够了解,无法确定哪些是静态文件,并且无法通过代理告诉它们不是脚本。请帮忙解决这个问题。

尝试将 include fastcgi_params 更改为 include fastcgi.conf 并删除您设置的 fastcgi_param。而是添加fastcgi_split_path_info ^(.+\.php)(/.*)$;。在我看来,您传递的路径可能是错误的,这就是为什么事情只有部分工作的原因。我使用反向代理的 php-fpmnginx 完全正常工作。 - tftd
@JeanDoux,希望你会发现我的回答有用,并且遵守你的赏金协议;否则,如果有任何不清楚的地方,请随时让我知道,我很乐意帮你澄清剩下的问题。 - cnst
2个回答

7
try_files指令会自动查找静态文件并将其作为静态文件提供,如果没有找到则将请求作为脚本处理。
  • http://nginx.org/r/try_files

    按照指定的顺序检查文件是否存在,并使用找到的第一个文件进行请求处理;处理在当前上下文中执行。根据root和alias指令从file参数构造文件路径。通过在名称末尾指定斜杠“$uri /”来检查目录的存在。如果没有找到任何文件,则会对最后一个参数中指定的uri进行内部重定向。

请注意,尽管您已经使用了try_files,但似乎您的路径处理可能不符合规范。


关于你自己的临时解决方案,使用rewrite或两个没有问题, 但是,看起来你会从alias指令中受益。

然而,你从未解释过为什么要从/tmp提供内容。请注意,一些cron脚本通常会自动清除/tmp中的文件,例如,在OpenBSD上,/etc/daily脚本会自动查找并删除7天前的文件(按照daily的频率,如名称所示)。


总之,你首先应该确定Web视图文件系统和你的文件系统之间的适当映射关系。接下来,如果找到前缀,只需为资产使用单独的位置和别名。否则,确定try_files的路径以使其按预期工作。

1

我找到了一个很丑陋的解决方案,直到有更好的解决方案出现,这是我所做的:

  • 我复制了所有的资产库并将其复制到我的代理服务器上,其中nginx位于其中。

这是我的新配置:

location /portal/mysite/ {

    set $frontRoot /srv/data/apps/mysite-portal-stag/current/web;
    set $sfApp app.php; 

    root  /srv/data/apps/mysite-portal-stag/current/web;

    rewrite ^/portal/mysite/(.*)$ /$1 break;
    try_files $uri @sfFront;

}
location /portal/mysite/asset {
    root  /tmp/mysite/asset;
    rewrite ^/portal/mysite/asset/(.*)$ /$1 break;
}
location @sfFront {

    set $frontRootWeb /srv/data/apps/mysite-portal-stag/current/web;
    root  /srv/data/apps/mysite-portal-stag/current/web;

    fastcgi_pass myAdressWeb:myPort;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $frontRoot/$sfApp;

    fastcgi_param SCRIPT_NAME /portal/mysite/$sfApp;

} 

现在它正在工作,所有的js/css和图片都被找到了。

如果有人想提供更加“简洁”的答案,他可以随时回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接