我有一台 Digitalocean 服务器,上面有 ubuntu linux、nginx 1.4.6(运行在 80 端口)、varnish 3.0.5(运行在 8080 端口),我有两个域名,分别是 siteA.com 和 siteB.com。在 nginx 的 default.conf 中,我配置了前门(80)以 root 身份使用 siteA 文件夹,代码如下:
server {
listen *:8080 default_server;
root /home/sitea;
index index.html index.htm index.php;
server_name IP_domain_siteA;
location / {
autoindex on;
autoindex_exact_size off;
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
}
location ~ \.php$ {
try_files $uri =404;
expires off;
fastcgi_read_timeout 900s;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
但我希望 SiteB 使用相同的端口通过 2 个域访问同一个服务器。所以当我访问时:
siteA.com => carry my server folder:
/home/siteA/index.php
siteB.com => carry the same server folder (same ip as well):
/home/siteB/index.html
我该怎么做?我已经尝试了所有方法,甚至在 default.VCL (Varnish 配置) 中包含了这些后端行。
backend siteA{
.host = "sitea.com";
.port = "8080";
}
backend siteB{
.host = "siteb.com";
.port = "8080";
}
sub vcl_recv {
if (req.http.host == "sitea.com") {
#You will need the following line only if your backend has multiple virtual host names
set req.http.host = "sitea.com";
set req.backend = siteA;
return (lookup);
}
if (req.http.host == "siteb.com") {
#You will need the following line only if your backend has multiple virtual host names
set req.http.host = "siteb.com";
set req.backend = siteB;
return (lookup);
}
}
它没有解决,它返回错误:
后端主机“siteB.com”:解析为多个 IPv4 地址。仅允许一个地址。
我已经使用虚拟主机, 对于其他文件夹使用 nginx 但只能更改端口,server_name 行指向域 A 或域 B,不起作用....因为是同一个 IP
我能做什么?有人有什么建议吗?谢谢
编辑1:
两个站点的 nginx 配置在这里(siteA):
server {
listen *:8080 default_server;
root /var/www/public/sitea;
try_files $uri $uri/ @handler;
index index.php index.html index.htm;
# Make site accessible from http://localhost/
##domain address 1 of server...
server_name www.sitea.com.br sitea.com.br;
#location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
#try_files $uri $uri/ =404;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules
#}
## These locations would be hidden by .htaccess normally
location ^~ /app/ { deny all; }
location ^~ /includes/ { deny all; }
location ^~ /lib/ { deny all; }
location ^~ /media/downloadable/ { deny all; }
location ^~ /pkginfo/ { deny all; }
location ^~ /report/config.xml { deny all; }
location ^~ /var/ { deny all; }
location /var/export/ { ## Allow admins only to view export folder
auth_basic "Restricted"; ## Message shown in login window
auth_basic_user_file htpasswd; ## See /etc/nginx/htpassword
autoindex on;
proxy_read_timeout 150;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location @handler { ## Magento uses a common front handler
rewrite / /index.php;
}
location ~ .php/ { ## Forward paths like /js/index.php/x.js to relevant handler
rewrite ^(.*.php)/ $1 last;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_read_timeout 120;
include fastcgi_params;
}
}
另一个站点(siteB):
server {
listen 8090;
client_max_body_size 20M;
root /var/www/public/siteb;
index index.html index.htm index.php;
##domain address 2 of server...
server_name www.siteb.com.br siteb.com.br;
location / {
autoindex on;
try_files $uri $uri/ /index.php?q=$request_uri;
autoindex_exact_size off;
proxy_pass http://localhost:8080;
}
location ~ \.php$ {
#try_files $uri =404;
expires off;
fastcgi_read_timeout 900s;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
答案1
如果你正在使用 Varnish,你可以配置清除到其他网站,例如在 default.vcl 上:
acl purge {
"localhost";
"127.0.0.1";
"siteb.com";
}
以及 nginx 配置:
server {
listen 8080 default_server;
server_name sitea.com;
...
}
server {
listen 8080;
server_name siteb.com;
...
}
如果将两个网站都缓存在 varnish 上,nginx 就无法正确区分。也许有更好的方法,但这种方法也行得通。
答案2
您收到的错误表明 siteB.com 有多个 IPv4 地址。不要使用 DNS 名称指定后端主机,只需使用 localhost 或 127.0.0.1。这可能会安抚 varnish,并消除可能导致延迟或(显然在本例中)出错的 DNS 查找。我自己对 varnish 不太熟悉,但我还认为您只需要指定一个后端(因为它实际上是这里的同一个框),并确保正确的主机标头能够传递到 nginx。说到这个……
您不需要设置任何其他代理。Nginx 很乐意让您指定两个监听同一端口的虚拟主机,并使用 server_name 指令匹配传入请求的主机标头。任何与已知 server_name 不匹配的请求都将被默认服务器块捕获,通常是第一个指定的服务器块,除非您使用 listen 指令上的 default_server 选项覆盖它。请参阅以下示例:
server {
listen 8080;
server_name siteA.com;
...
}
server {
listen 8080 default_server;
server_name siteB.com;
...
}
这里,两个服务器块都在监听端口 8080,并且 nginx 通过匹配主机标头来了解哪些请求是针对哪个站点的。如果它收到一个没有主机匹配的请求,它通常会将其传递给 siteA.com 的块作为第一个定义的块,但我们明确地通过声明 siteB.com 的块是该端口上请求的默认服务器来覆盖该行为。
由于您的 varnish 配置确保在将请求传递到后端之前设置适当的主机标头,因此这应该是您需要做的全部工作,以便从后端为多个站点提供服务。我本不应该认为在这种情况下您甚至需要在 varnish 中手动执行此操作,因为您不会覆盖标头;这似乎主要是为了规范化(即同时收集 www.site.com 和 site.com,这样您就不会缓存相同内容的两个副本)。我的阅读表明您也不需要指定多个后端,因为它是您正在查看的同一端口上的同一服务器。Varnish 应该足够智能,可以根据不同的主机分离缓存。