如何让 nginx 使用 127.0.0.1 而不是服务器的公网 IP 连接 php-fpm?

如何让 nginx 使用 127.0.0.1 而不是服务器的公网 IP 连接 php-fpm?

我在 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 地址和端口。

相关内容