问题概要:
php5-fastcgi 可与 nginx 配合使用,但无法与 nginx+varnish 配合使用(502 Bad Gateway)
有人能建议我应该做哪些改变才能使清漆发挥作用吗?
问题详情:
这是我的配置:
(监听 80)nginx(请求 8181)==>(监听 8181)varnish ==>(监听 9090)php5-fastcgi
/etc/nginx/conf.d/mydomain.com
server {
listen 80;
server_name mydomain.com;
index index.html index.htm index.php;
keepalive_timeout 30;
root /var/www/assets;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location ~\.php$ {
root /var/www/api;
add_header Access-Control-Allow-Origin *;
fastcgi_pass 127.0.0.1:8181;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ ^/(api|wp) {
root /var/www/api;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
}
/etc/默认/清漆
START=yes
NFILES=131072
MEMLOCK=82000
DAEMON_OPTS="-a :8181 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256M"
/etc/varnish/默认.vlc
backend default {
.host = "127.0.0.1";
.port = "9090";
}
sub vcl_recv {
set req.backend = default;
if (!(req.url ~ "wp-(login|admin)")) {
unset req.http.cookie;
}
return(lookup);
}
sub vcl_miss {
return(fetch);
}
sub vcl_hit {
return(deliver);
}
sub vcl_fetch {
if (!(req.url ~ "wp-(login|admin)")) {
unset beresp.http.set-cookie;
}
set beresp.ttl = 24h;
set beresp.http.X-Cacheable = "YES";
unset beresp.http.Vary;
return(deliver);
}
sub vcl_deliver {
return(deliver);
}
在/usr/bin/php5-fastcgi-p
#!/bin/bash
FASTCGI_USER=user
FASTCGI_GROUP=www-data
PORT=9090
ADDRESS=127.0.0.1
PIDFILE=/var/run/php5-fastcgi.pid
CHILDREN=4
PHP5=/usr/bin/php5-cgi
/usr/bin/spawn-fcgi -a $ADDRESS -p $PORT -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5
(在 ubuntu 10.04 lucid lynx 上)
此设置目前不起作用(502 错误网关)。
当我发出请求时,我也会在 varnishlog 中收到几条消息
0 CLI - Wr 200 19 PONG 1380029665 1.0
11 SessionOpen c 127.0.0.1 42489 :8181
11 Debug c herding
11 SessionClose c no request
11 StatSess c 127.0.0.1 42489 0 1 0 0 0 0 0 0
0 CLI - Rd ping
0 CLI - Wr 200 19 PONG 1380029668 1.0
0 CLI - Rd ping
因此我尝试了另一种配置,其中 nginx 绕过 varnish,并且它像魔法一样工作。
(在 80 上监听)nginx ==> (在 9090 上监听)php5-fastcgi
通常人们认为这是 spawn-fcgi 的错误,但我认为这是 varnish 的配置问题
(我正在使用 Ubuntu 10.04,因此使用 php-fpm 的选项不可用。)
这是我得到的网络状态监测
tcp 0 0 0.0.0.0:8181 0.0.0.0:* LISTEN 20886/varnishd
tcp 0 0 127.0.0.1:9090 0.0.0.0:* LISTEN 20989/php5-cgi
tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 20885/varnishd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1478/nginx.conf
tcp6 0 0 :::8181 :::* LISTEN 20886/varnishd
答案1
Varnish 理解 HTTP,但要连接到您的 PHP 快速 CGI 守护程序,它必须了解 CGI 标准。您无法将 Varnish 连接到您的 PHP 守护程序。必须有一个可以与 Varnish 通信并连接到 PHP 的 Web 服务器。也许设置 Varnish-Nginx-Php 更有意义。
如果您正在寻找 Php 加速,请使用 Php 本身的缓存并将其与基于 RAM 的键值存储(如 Memcached 或 Redis 或其他 No-SQL 数据库)相结合。