使用 try_files 的 Nginx 反向代理提供未解析的 php 文件

使用 try_files 的 Nginx 反向代理提供未解析的 php 文件

我使用 Nginx 作为处理 PHP 的 Apache 的反向代理,这是我的 nginx 站点配置:

server {
        listen   80 default;
        server_name  localhost;

        access_log  /var/log/nginx/localhost.access.log;

        root /var/www/www.example.com/httpdocs;

        location ~ \.php$ {
                proxy_pass              http://www.example.com:80;
        }

        location ~ /\.ht {
                deny  all;
        }

        #location / {
                try_files $uri @proxy;
        #}

        location @proxy {
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;
                proxy_buffers           32 4k;
                proxy_pass              http://www.example.com:81;
        }
}

index.php我的问题是,nginx 返回的请求未经解析,所以我专门用于处理 php 文件的位置没有发挥应有的作用。

如果我请求index.php?q=whatever,这是 apache 的有效请求,那么站点将返回 500 错误:

2012/07/13 11:22:27 [alert] 8490#0: *17994 4096 worker_connections are not enough while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php?q=whatever HTTP/1.0", upstream: "http://127.0.0.1:80/index.php?q=whatever", host: "www.example.com"

答案1

    location ~ \.php$ {
            proxy_pass              http://www.example.com:80;
    }

在您的配置中,Nginx 正在监听端口 80。因此将 index.php 文件传递​​给 Nginx(端口 80)将使其无法解析。因此,假设 Apache 监听端口 81,正确的proxy_pass指令应该是...

    location ~ \.php$ {
            proxy_pass              http://www.example.com:81;
    }

要了解有关 Nginx 如何处理代理请求的更多信息,请查看官方 wikiHttpProxy模块

相关内容