【发布时间】:2020-11-08 01:54:21
【问题描述】:
我需要你的帮助来处理一个用作技术堆栈的应用程序:
- Docker NGINX
- 带有 PHP-FPM 和 Symfony 的 DOCKER
我想将页面分成不同的部分并缓存其中一些,因为生成速度很慢。
所以我尝试按照文档中的说明使用 SSI(服务器端包含):https://symfony.com/doc/current/http_cache/ssi.html
这是我的码头工人的配置:
NGINX:
FROM nginx:1.19.2
COPY docker-compose/nginx /
ADD docker-compose/nginx/nginx.conf /etc/nginx/nginx.conf
ADD docker-compose/nginx/symfony.dev.conf /etc/nginx/conf.d/default.conf
和配置文件:
nginx.conf
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
http {
server_tokens on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log on;
error_log on;
access_log /dev/stdout;
error_log /dev/stdout;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
open_file_cache max=300;
client_body_temp_path /tmp 1 2;
client_body_buffer_size 256k;
client_body_in_file_only off;
}
symfony.dev.conf
proxy_cache_path /tmp/nginx levels=1:2 keys_zone=default:10m;
server {
listen 80;
root /var/www/html/symfony/public;
client_max_body_size 40M;
location = /health {
return 200 "healthy\n";
}
location = /ping {
return 200 "pong\n";
}
location / {
ssi on;
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
ssi on;
fastcgi_pass php-fpm:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_read_timeout 300;
internal;
}
location ~ \.php$ {
return 404;
}
location /status {
access_log off;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php-fpm:9000;
fastcgi_index status.html;
}
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
}
如您所见,我在网络服务器上启用了 SSI。
此外,我在框架的配置中添加了这个(如 doc):
framework:
ssi: { enabled: true }
fragments: { path: /_fragment }
在模板/控制器中,我遵循文档:
模板
{{ render_ssi(controller('App\\Controller\\Pages\\HomeController::xxxx')) }}
控制器
public function xxxx() {
sleep(2);
$response = $this->render('pages/home/xxxx.html.twig', [
]);
$response->setSharedMaxAge(Constants::SSI_CACHE_TTL);
return $response;
}
sleep命令是为了测试cache和iss是否正常工作...
更多信息:
在文档中阅读此内容后,我在供应商处看到:render_ssi 确保仅当请求具有诸如 Surrogate-Capability: device="SSI/1.0" 之类的标头要求时才会生成 SSI 指令(通常由网络服务器)。否则会直接嵌入子响应。
所以我尝试在代码中找到决定是否使用 SSI 的块:
vendor/symfony/http-kernel/HttpCache/AbstractSurrogate.php
在这一行:
/**
* {@inheritdoc}
*/
public function hasSurrogateCapability(Request $request)
{
if (null === $value = $request->headers->get('Surrogate-Capability')) {
return false;
}
return false !== strpos($value, sprintf('%s/1.0', strtoupper($this->getName())));
}
所以我认为我的网络服务器不会将 ISS-Header (Surrogate-Capability) 发送到我的 php-fpm。
我不知道我可以改变什么来做一些测试......
如果你能帮助我,谢谢大家...
问候
编辑:
我创建了一个之前暴露过同样问题的仓库,你可以直接测试。
【问题讨论】:
标签: php docker symfony nginx ssi