Perl CGI::Fast закрывает соединения без отправки данных

Я пытаюсь развернуть приложение Perl, которое использует CGI::Application через Nginx, используя FastCGI для связи между ними.

Nginx продолжает возвращать "502 Bad Gateway", и журнал ошибок заполняется так:

2015/02/03 12:40:03 [ошибка] 11209#0: *2 восходящее преждевременно закрытое соединение при чтении заголовка ответа из восходящего потока, клиент: 10.1.1.23, сервер: www.example.com, запрос: "GET / test.fcgi HTTP / 1.1 ", upstream:" http://127.0.0.1:5001/test.fcgi ", хост: "www.example.com"

Вот конфигурация сайта Nginx:

upstream @perl {
#   I had been trying to use a socket, but I switched to TCP to try WireShark.
#   server unix:/var/run/nginx/my-app.sock;
    server 127.0.0.1:5001;
}

server {
    listen       80;
    listen       443 ssl;

    server_name www.example.com;
    root /home/example/sites/www.example.com;

    location ~* \.fcgi(/|$) {

        fastcgi_split_path_info ^(.+?\.cgi)(/.*)$;
        # (I know that the `if` is old-style, and that `try_files` is better, but that shouldn't affect whether it works or not.)
        if (!-f $document_root$fastcgi_script_name) {
                return 404;
        }

        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port 443;
        proxy_pass http://@perl;
    }
}

Чтобы увидеть, связана ли проблема с самим приложением Perl, я создал новое приложение fcgi на основе тестового кода, найденного в CGI::Fast документация:

#!/usr/bin/perl -wT

use CGI::Fast;

# Added this to see if there are errors.    
# See http://perldoc.perl.org/CGI/Carp.html
BEGIN {
    use CGI::Carp qw(carpout);
    open(LOG, ">>/home/example/sites/www.example.com/err.log") or
      die("Unable to open mycgi-log: $!\n");
    carpout(LOG);
}

local $count = 0;

$ENV{FCGI_SOCKET_PATH} = "127.0.0.1:5001";
$ENV{FCGI_LISTEN_QUEUE} = 100;

while ( my $q = new CGI::Fast ) {
    $count++;
    print $q->header( "text/plain" ),
          "You are request number $count. Have a good day!\n";
}

Когда я бегу ./test.fcgi Я могу видеть в netstat что он привязан к порту 5001. Когда я захожу по URL в браузере, я все равно получаю 502 с этим супер-простым приложением. В журнале ошибок нет ничего, что Carp пишет в.

Я не хочу использовать простой CGI ( через скрипт-обертку) из-за долгого времени запуска приложения, и я не могу конвертировать все приложение в Plack/PSGI.

Как я могу понять, почему Nginx не разговаривает с Perl CGI::Fast Даже на простой пример из документов?

1 ответ

Решение

Вы используете сервер FastCGI, но вы говорите Nginx подключиться к HTTP-серверу. Это не один и тот же протокол.

Чтобы подключиться к серверу FastCGI из Nginx, используйте ngx_http_fastcgi_module не ngx_http_proxy_module Например:

fastcgi_pass 127.0.0.1:5001;

Обратите внимание, что proxy_set_header Модуль здесь не применим, так как FastCGI использует переменные среды CGI, а не заголовки. Если вам нужно установить дополнительные заголовки, вы можете сделать это, используя fastcgi_param директива, например

fastcgi_param ENVIRONMENT_VARIABLE $value;

Nginx поставляется с некоторыми стандартами fastcgi_param директивы в файле, который вы, вероятно, захотите просто импортировать оптом:

include fastcgi_params;
Другие вопросы по тегам