我在 php-fpm 的日志中发现错误“警告:[pool www] child 3715 在 stderr 中说:“错误:连接不允许:IP 地址‘xxxx’已被删除。””,其中‘xxxx’是我服务器的公共 IP。
由于 php-fpm 中设置了“listen.allowed_clients = 127.0.0.1”,所以错误是合理的。但是我想知道为什么 nginx 会用它的公网 ip 连接到 php-fpm,nginx 和 php-fpm 实际上在同一台服务器上。有没有办法改变 nginx 的行为?
更新:添加了详细配置。
在 nginx.conf 中:
用户 nginx; 工作进程 4; 错误日志/var/log/nginx/error.log; pid /运行/nginx.pid; 事件 { 工作者连接1024; } http { 包括/etc/nginx/mime.types; 默认类型应用程序/八位字节流; log_format 主要'$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; 访问日志 /var/log/nginx/access.log 主要; 发送文件; 保持活动超时 65; 包括/etc/nginx/conf.d/*.conf; 索引 index.html index.htm; 上游 php { 服务器 127.0.0.1:9000; } }
在/etc/nginx/conf.d/test.conf中:
服务器 { 监听443默认服务器ssl; ssl_证书 /usr/share/nginx/html/xxx.crt; ssl_certificate_key /usr/share/nginx/html/xxx/xxx.key; ## 您的网站名称在此。 服务器名称 xxx; ## 您唯一的路径参考。 根目录/usr/share/nginx/html/xxx; ## 这应该在你的 http 块中,如果在的话,这里就不需要了。 包括/etc/nginx/mime.types; 索引 index.php 位置 ~ \.php$ { #注意:你应该在 php.ini 中添加“cgi.fix_pathinfo = 0;” 包括 fastcgi.conf; fastcgi_intercept_errors开启; fastcgi_pass php; } }
在 fastcgi.conf 中:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param 内容类型 $内容类型; fastcgi_param 内容长度 $内容长度; fastcgi_param 脚本名称 $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $服务器协议; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param 服务器软件 nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $远程端口; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $服务器端口; fastcgi_param SERVER_NAME $服务器名称; # 仅限 PHP,如果 PHP 是使用 --enable-force-cgi-redirect 构建的,则需要此配置 fastcgi_param REDIRECT_STATUS 200;
php-fpm 状态:
[root@test-server ~]# netstat -tulnp | grep 9000 tcp 0 0 127.0.0.1:9000 0.0.0.0:* 监听 4134/php-fpm: master
在 php-fpm 日志中:
[2015 年 8 月 3 日 09:55:02] 警告:[pool www] 子进程 4109 在 stderr 中显示:“错误:连接不允许:IP 地址‘1.2.3.4’已被删除。”
在我的服务器上:server_name 'xxx' 确实被 dns 解析为 '1.2.3.4',我用这些假的 server_name 和公共 ip 替换了我的真实 server_name 和公共 ip。如果造成混淆,请见谅。
上述所有配置文件很长时间都没有改变。在我重新启动服务器之前,一切都很好。我记得我在 /etc/hosts 中添加了一行“1.2.3.4 xxx”,但删除它没有帮助。
目前我已修改了 php-fpm 中的 listen.allowed_clients 来绕过此问题。但我对 nginx 和 php-fpm 的这种行为感到好奇。
答案1
要明确设置请求发起 IP 地址,您需要使用以下之一fastcgi_bind/代理绑定指令与相应的 *_pass 指令一起。
此指令出现在版本 0.8.22 中。使到 FastCGI 服务器的传出连接源自指定的本地 IP 地址和可选端口(1.11.2)。参数值可以包含变量(1.3.12)。特殊值 off(1.3.12)取消从上一个配置级别继承的 fastcgi_bind 指令的效果,该指令允许系统自动分配本地 IP 地址和端口。