我有三台服务器;两台运行 nginx 的 Web 服务器和一台也运行 nginx 的负载均衡器。我可以在负载均衡器和 Web 服务器之间 ping/telnet/curl,但当我尝试在浏览器中访问负载均衡器 IP 时,出现 502 错误。
这是我的 Web 服务器 nginx 配置文件:
fastcgi_cache_path /home/user/website.com/cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
server_name 1.1.1.1;
access_log /home/user/website.com/logs/access.log;
error_log /home/user/website.com/logs/error.log;
root /home/user/website.com/public/;
index index.php;
set $skip_cache 0; # POST requests and urls with a query string should always go to PHP if ($request_method = POST) { set $skip_cache 1$
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 60m;
include fastcgi_params;
}
location ~ /purge(/.*) {
fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
location ~* \.(pdf)$ {
expires 30d;
}
}
这是我的负载均衡器 nginx 配置文件:
upstream backend {
server 1.1.1.1:9000;
server 1.1.1.2:9000;
}
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server_name 1.1.1.3;
location ~* \.php$/ {
gzip on;
try_files $uri =404;
include fastcgi_params;
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
}
}
我在我的 Web 服务器上的访问/错误日志文件中没有发现任何异常,但我的负载均衡器 nginx 错误日志中出现了此错误:
2015/08/06 03:47:59 [error] 3650#0: *17 upstream prematurely closed connection while reading response header from upstream, client: 104.183.250.151, server: 1.1.1.3, request: "GET / HTTP/1.1", upstream: "http://1.1.1.2:80/", host: "1.1.1.3"
顺便说一句,我的 IP 实际上不是 1.1.1.1。我已针对此问题替换了我的实际 IP。
答案1
错误消息告诉您上游(即您代理的 Web 服务器)在发送任何响应标头之前关闭了连接。检查后端 Web 服务器的日志以查看实际发生了什么。
答案2
在平衡器的上游部分,你告诉负载平衡器通过端口 9000 进行连接,但虚拟主机正在监听端口 80,而不是 9000。这就是坏网关的原因