Docker + Apache + PHP-FPM静态内容
Docker + Apache + PHP-FPM static content
我正在使用 Slim/Twig 将 PHP 中的一些站点移动到 docker 容器。在旧服务器中,一个请求传入 slim 路由请求发回 html,然后浏览器进行调用以获取资源 CSS、图像等,apache 接管了这些资源。
转向 Docker httpd conf 本质上是这样的:
ProxyPassMatch "^/(.*\.php\/(.*)?)$" "fcgi://php:9000/var/www/html/public/index.php/"
仍在解决所有问题,但这实质上是将 http://192.168.33.20:8080/index.php/admin
之类的请求转发到 fcgi://php:9000/var/www/html/public/index.php/
,Slim 会选择所有其余路径,因此 admin
和 returns树枝呈现的正确视图。
我运行遇到的问题是资源。我的大部分 css 和前端框架都通过 composer 在 php 应用程序中。所以浏览器再次调用:
/index.php/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.js HTTP/1.1" 404
获取 404
因为 Slim 不知道这条路径是什么,apache 只是转发。
我看过的和缺点:
将资源放在 Apache 上,但这基本上将 Apache 和 php 结合在一起,就像服务器一样。
正在创建一个容器来为这些文件提供服务,即另一个非负载均衡器 Apache 来为这些请求提供服务。这仍然结合,也意味着我需要找到一种方法来在蓝绿色部署中存储多个版本。
将一个卷装载到 Apache lb。不知道为什么我放弃了这个。可能是版本问题。
创建一个可以搜索资源的路由。到目前为止我最喜欢的想法但是增加了代码的复杂性。
所以我的问题是 Docker 中有处理这个问题的标准方法吗?
我的标准做法是通过框架路由来控制资源访问。示例实现(在 Lumen 中):
$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 路径转换为文件系统路径(注意 ..
和其他技巧,使用 realpath
并将其与代码的安装基本路径进行比较),设置 Content-Type
和 Content-Length
headers,任何相关的缓存 headers,然后流式传输文件。
虽然这确实增加了复杂性和一定的开销,但它提供了通过业务逻辑限制资源的灵活性。
如果担心性能,您可以提升对 Web 服务器的访问或屏蔽 CDN 和代理内容后面的路由。
我正在使用 Slim/Twig 将 PHP 中的一些站点移动到 docker 容器。在旧服务器中,一个请求传入 slim 路由请求发回 html,然后浏览器进行调用以获取资源 CSS、图像等,apache 接管了这些资源。
转向 Docker httpd conf 本质上是这样的:
ProxyPassMatch "^/(.*\.php\/(.*)?)$" "fcgi://php:9000/var/www/html/public/index.php/"
仍在解决所有问题,但这实质上是将 http://192.168.33.20:8080/index.php/admin
之类的请求转发到 fcgi://php:9000/var/www/html/public/index.php/
,Slim 会选择所有其余路径,因此 admin
和 returns树枝呈现的正确视图。
我运行遇到的问题是资源。我的大部分 css 和前端框架都通过 composer 在 php 应用程序中。所以浏览器再次调用:
/index.php/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.js HTTP/1.1" 404
获取 404
因为 Slim 不知道这条路径是什么,apache 只是转发。
我看过的和缺点:
将资源放在 Apache 上,但这基本上将 Apache 和 php 结合在一起,就像服务器一样。
正在创建一个容器来为这些文件提供服务,即另一个非负载均衡器 Apache 来为这些请求提供服务。这仍然结合,也意味着我需要找到一种方法来在蓝绿色部署中存储多个版本。
将一个卷装载到 Apache lb。不知道为什么我放弃了这个。可能是版本问题。
创建一个可以搜索资源的路由。到目前为止我最喜欢的想法但是增加了代码的复杂性。
所以我的问题是 Docker 中有处理这个问题的标准方法吗?
我的标准做法是通过框架路由来控制资源访问。示例实现(在 Lumen 中):
$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 路径转换为文件系统路径(注意 ..
和其他技巧,使用 realpath
并将其与代码的安装基本路径进行比较),设置 Content-Type
和 Content-Length
headers,任何相关的缓存 headers,然后流式传输文件。
虽然这确实增加了复杂性和一定的开销,但它提供了通过业务逻辑限制资源的灵活性。
如果担心性能,您可以提升对 Web 服务器的访问或屏蔽 CDN 和代理内容后面的路由。