服务器报500错误,查看nginx的error log,发现如下报错:

768 worker_connections are not enough while connecting to upstream

看起来似乎是连接数不够造成的,我查看了nginx.conf,相关配置为:

worker_processes 4;

events {
  worker_connections 768;
}

一般情况下,如果是生产环境,很有可能确实是由于并发数过大而造成的。

似乎调大这个配置数就够了,可我觉得不太对劲,因为我是在本地的测试环境遇到了这个问题,没啥并发啊。

以下是我的配置内容:

server
{
  listen 80;
  server_name domain.com;
  location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:1111;
  }
}

server
{
  listen 80;
  server_name xxx.domain.com;
  location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://domain.com;
  }
}

我希望在访问http://xxx.domain.com的时候,自动代理到http://domain.com,而后者再代理到这台服务器的1111端口。

经过细致测试和排查,最后恍然大悟,错误出现在:

proxy_set_header Host $host;

这条指令会把请求头部的Host修改成xxx.domain.com,因为xxx.domain.com和domain.com都指向同一个服务器,所以代理之后,因为Host仍然是xxx.domain.com,所以又会回到同一条配置,这就造成了死循环,导致连接数迅速耗尽。

附注

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

以上三条指令经常是一起出现,因为在用nginx配置反向代理的时候,如果没有相关配置,真实服务器收到的所有请求的ip都是nginx服务器的ip,这样,真实服务器就无法拿到确切的客户端ip,而且还有可能触发同一ip的访问限制,所以要做这样的配置。

即使是平时经常耳熟能详的东西,也不见得任何时候都不会有问题,以后碰到问题,要多多思考,多多学习~