Docker + Apache + PHP-FPM静态内容

时间:2019-07-31 16:40:24

标签: php apache docker slim

我正在使用Slim / Twig向Docker容器移动PHP中的某些站点。在旧服务器中,请求进入了细长路径,将请求发送回html,然后浏览器进行了调用,以获取Apache接管的资源CSS,图像等。

将Httpd conf移动到Docker基本上是这样:

ProxyPassMatch "^/(.*\.php\/(.*)?)$" "fcgi://php:9000/var/www/html/public/index.php/$2"

仍然解决所有问题,但这实际上将诸如http://192.168.33.20:8080/index.php/admin之类的请求转发到fcgi://php:9000/var/www/html/public/index.php/$2,而Slim选择了路径的其余所有内容,因此admin并返回了由细枝渲染的正确视图。

问题是我遇到的资源。我通过composer在php应用程序中拥有大部分的CSS和前端框架。因此浏览器再次调用:

/index.php/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.js HTTP/1.1" 404

因为Slim不知道这是什么路径而apache只是转发,所以得到404

我看过的东西和缺点:

  1. 将资源放在Apache上,但这基本上像服务器一样将Apache和php耦合在一起。

  2. 创建一个容器来处理这些文件,即另一个非负载均衡器Apache来处理这些请求。这仍然很成对,也意味着我需要找到一种方法来潜在地在蓝绿色部署中存储多个版本。

  3. 将卷安装到Apachelb。不知道为什么我放弃了这个。可能是版本问题。

  4. 创建可以搜索资源的路由。到目前为止,我最喜欢的想法是添加代码复杂性。

所以我有一个问题,在Docker中有没有一种标准的处理方式?

1 个答案:

答案 0 :(得分:1)

我的标准做法是通过框架路由控制资源访问。一个示例实现(在流明中):

$router->get('/asset[/{path:.*}]', 'AssetController@load');

示例请求和响应如下:

GET /asset/js/app.js HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Accept: */*
Referer: http://localhost:8080/spa/example
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

HTTP/1.1 200 OK
Server: nginx
Content-Type: application/javascript
Content-Length: 21056410
Connection: keep-alive
Last-Modified: Sun, 31 Jul 63 19:34:21 +0000
Cache-Control: private, must-revalidate
Date: Wed, 31 Jul 2019 19:34:21 GMT
Accept-Ranges: bytes
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src  'self'; connect-src  'self'; img-src  'self'; style-src 'unsafe-inline' fonts.googleapis.com 'self'; font-src fonts.gstatic.com 'self'; script-src 'unsafe-inline'  'self' 'unsafe-eval'

您的控制器(例如,在我之前的示例中为AssetController)会小心地将URL路径转换为文件系统路径(注意..和其他技巧,请使用{{1} },并将其与代码的安装基本路径进行比较),设置realpathContent-Type标头,任何相关的缓存标头,然后流传输文件。

虽然确实增加了复杂性和一定数量的开销,但它提供了通过业务逻辑来约束资源的灵活性。

如果要考虑性能,则可以提高对Web服务器的访问权限,也可以屏蔽CDN和代理内容后面的路由。