Proxy reverso Nginx usando try_files está servindo arquivos php não analisados

1

Eu estou usando o Nginx como um proxy reverso para o Apache que está manipulando PHP, aqui está minha configuração do site 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;
        }
}

O meu problema é que os pedidos de index.php estão a ser devolvidos pelo nginx unparsed, pelo que a minha localização especificamente para lidar com ficheiros php não está a fazer o que deveria.

Se eu solicitar o index.php?q=whatever , que é uma solicitação válida para o apache, o site retornará um 500 com o erro:

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"
    
por DanH 13.07.2012 / 05:25

1 resposta

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

Na sua configuração, o Nginx está escutando na porta 80. Assim, passar o arquivo index.php para Nginx (porta 80) o deixará não analisado. Então, assumindo que o Apache escuta na porta 81, a diretiva proxy_pass correta seria ...

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

Para saber mais sobre como o Nginx lida com solicitações de proxy, confira o wiki oficial em HttpProxyModule .

    
por 13.07.2012 / 05:56