我不知道这是一个错误还是我错误地定义了缓存,我有一个 nginx 缓存(反向代理)服务器,由 2 个不同的域(mydomain1.com
和mydomain2.com
)使用,不同的内容,而不是别名域。
我定义了一个缓存,然后在 nginx 中定义了两个域/虚拟主机并将其设置为使用该缓存,两个域都从同一源服务器获取数据,但它们将不同的虚拟主机传递给源服务器,因此它们获取正确的内容。
问题是 nginx 似乎混合了两台服务器上的缓存,访问一个主页显示另一台的缓存主页。
我需要为每个 vhost 定义一个单独的缓存吗?
NGINX 不应该也将虚拟主机与每个请求相关联吗?它似乎只是关联了一个源服务器、端口等。
这是缓存主页的头部,显示两个虚拟主机之间没有任何区别:
KEY: http://source.example.com:81/
HTTP/1.1 200 OK
Date: Sun, 02 Feb 2020 00:54:33 GMT
Server: Apache/2.4.6 (CentOS) mpm-itk/2.4.7-04 OpenSSL/1.0.2k-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Expires: Sun, 02 Feb 2020 02:54:33 GMT
Cache-Control: public, max-age=7200
X-Mod-Pagespeed: 1.13.35.2-0
Vary: Accept-Encoding
我的 NGINX 缓存设置:
proxy_cache_path /ramdisk/nginx_cache levels=1:2 keys_zone=nginx_ramdisk_cache:512m max_size=3g
inactive=30d use_temp_path=off;
# defining domain 1
server {
[...]
server_name mydomain1.com;
location / {
proxy_pass http://source.example.com:81;
proxy_set_header Host mydomain1.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache nginx_ramdisk_cache;
}
}
# defining domain 2
server {
[...]
server_name mydomain2.com;
location / {
proxy_pass http://source.example.com:81;
proxy_set_header Host mydomain2.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache nginx_ramdisk_cache;
}
}
在源服务器(apache)上,我的 2 个虚拟主机定义如下:
<VirtualHost *:81>
ServerName mydomain1.com
DocumentRoot /var/www/html/mydomain1.com
</VirtualHost>
<VirtualHost *:81>
ServerName mydomain2.com
DocumentRoot /var/www/html/mydomain2.com
</VirtualHost>
像个怪人一样回答我自己的问题;
为了让 nginx 区分两个 url 使用的相同路径(例如
/
),它需要使用proxy_cache_key
,默认情况下似乎是$scheme$proxy_host$request_uri
,这在我的情况下不起作用,当两个 nginx 域从同一源服务器获取数据时(通过发送不同的主机头),他们最终都会使用这样的密钥:KEY: http://source.example.com:81
(我理解 $proxy_host 是 = 源服务器)解决方案:指定一个
proxy_cache_key
包含当前的$host
,而不是$proxy_host
;