PDF не доставляется из приложения Rails при прокси с помощью Nginx - PullRequest
0 голосов
/ 06 февраля 2012

Я надеюсь, что кто-нибудь сможет пролить свет на это. У нас есть приложение Rails 2, которое генерирует PDF с помощью библиотеки wicked_pdf. Мы запускаем приложение под Unicorn по прокси от nginx.

Проблема в том, что всякий раз, когда приложение пытается обработать PDF, оно просто блокирует время ожидания, и nginx сообщает о 404. Я проверил приложение через порт единорога, и оно работает нормально, поэтому между единорогом и nginx происходит нечто, вызывающее это. потерпеть неудачу.

Файлы журнала не сообщают ничего полезного. Журнал приложения просто сообщает все нормально, но не выводит строку Sending data. Журнал nginx сообщает *443 upstream prematurely closed connection while reading response header from upstream, client.

В журнале ошибок единорога сообщается, что время соединения истекло, а рабочий уничтожается, но создание PDF не занимает 30 секунд:

worker=2 PID:14099 timeout (31s > 30s), killing
reaped #<Process::Status: pid=14099,signaled(SIGKILL=9)> worker=2
worker=2 ready

Мне кажется, что мы что-то упустили в конфигурации nginx для сайта, но я не уверен, с чего начать.

Я включил конфигурацию nginx ниже:

server {
    listen *:80;
    server_name server_name.example.com;
    root /var/apps/application/current/public;
    try_files /system/maintenance.html $uri $uri/index.html @app;
    location @app {
        proxy_pass http://unix:/tmp/application.sock;
        proxy_set_header Host $http_host;
    }
    error_page 404 400 500 502 /error.html;
    location = /error.html {
        root /var/www;
    }
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Хорошо, после нескольких часов возни я наконец-то решил эту проблему.

Когда я установил тайм-ауты достаточно большими, PDF-файл в конце концов прошел, что указывало на то, что он где-то истекостальное.В конце концов оказалось, что я обращался к request.env ['HTTP_HOST'] в файле макета для PDF, чтобы создать абсолютный путь для изображения.Это приводило к тому, что wkhtmltopdf пытался подключиться к серверу с неправильным именем хоста, и это не удавалось.

Решением было заменить его на абсолютный путь к файловой системе.

0 голосов
/ 06 февраля 2012

Попробуйте установить это в своем файле среды:

ActionController::Streaming::X_SENDFILE_HEADER = 'X-Accel-Redirect' 

Примечание: это работает для Nginx, а не для Apache.

...