Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.189.226] |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток!
У меня поступило задание написать FastCGI-приложение на Lazarus и заставить его работать в связке с Nginx на Debian. Что сделал я... 1. Обновил FPC и Lazarus до последних версий через fpcupdeluxe. 2. Установил пакет fpweb в Lazarus и создал тестовое FastCGI-приложение (код ниже) program fcgitest; {$mode objfpc}{$H+} uses fpFCGI, unitmain; begin Application.Title:='FCGITest'; { Uncomment the port setting here if you want to run the FastCGI application stand-alone (e.g. for NGINX) } Application.Port:=9000; // For example Application.Initialize; Application.Run; end. unit unitmain; {$mode objfpc}{$H+} interface uses SysUtils, Classes, httpdefs, fpHTTP, fpWeb; type { TFPWebModuleMain } TFPWebModuleMain = class(TFPWebModule) procedure DataModuleRequest(Sender: TObject; ARequest: TRequest; AResponse: TResponse; var Handled: Boolean); private public end; var FPWebModuleMain: TFPWebModuleMain; implementation {$R *.lfm} { TFPWebModuleMain } procedure TFPWebModuleMain.DataModuleRequest(Sender: TObject; ARequest: TRequest; AResponse: TResponse; var Handled: Boolean); begin AResponse.ContentType := 'text/html;charset=utf-8'; AResponse.Contents.Add('Hello World!'); Handled:=true; end; initialization RegisterHTTPModule('TFPWebModule1', TFPWebModuleMain); end. Скомпилировалось все отлично. 3. Установил Nginx 1.18.0 штатно через apt-get. Написал конфиг для виртуального хоста (ниже) server { listen 80; server_name debiantest.local www.debiantest.local; access_log /var/log/nginx/debiantest.local.access.log main; root /var/www/debiantest.local; location / { #include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $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 $server_protocol; fastcgi_param REQUEST_SCHEME $scheme; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param REMOTE_USER $remote_user; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_pass localhost:9000; } } 4. Для запуска FCGI-приложения через SystemD написал unit (ниже). Не совсем уверен, что правильно, но запускается руками нормально и на порте 9000 висит. Это видно через Nettat. [Unit] Description=FCGITest After=network.target [Service] Type=simple User = www-data Group = www-data ExecStart=/opt/fcgitest/fcgitest Restart = always RemainAfterExit=yes TimeoutSec=25 [Install] WantedBy=multi-user.target 5. А проблема, собственно, заключается в исключении при обращении к локальному сайту... Из ошибки можно сделать вывод, что Nginx отработал, отдал запрос, а приложение по каким-то причинам этот запрос не может обработать и генерирует исключение. Полазил я по исходникам fcl-web и нашел, что оно может происходить в TWebHandler.HandleRequest(...) модуля custweb, если не ошибаюсь... Глубже не полез. Не совсем понятно что "не найдено"-то... Судя по всем мануалам, должен отработать дефолтовый web-модуль, а у него (видно из кода выше) только один обработчик на все запросы. Не подскажете, что я делаю не так? Вдогонку. Попробовал helloworld из fcl-webсобрать (но не через makefile, а так) - собралось, но при выполнении та же ошибка. Может что-нибудь не доустановил просто в систему или не все настроил. Кто сталкивался - подскажите. |
Сообщ.
#2
,
|
|
|
С fclweb и fastcgi не знаком совершенно, но порядок действий предложил бы такой
1. убрать Nginx для более простого дебага 1.1. выделить присылаемый запрос с помощью сниффера или логами 1.2. скармливать его своей программе с помощью ncat или подобного 2. посмотреть, что именно возвращает модуль (само содержимое) 3. поставить бряки и пройти по шагам там, где выдается ошибка |
Сообщ.
#3
,
|
|
|
Сообщ.
#4
,
|
|
|
Я в шоке (небольшом) Вот что бывает когда знаешь что искать... "Очень информативная" ошибка "Not found" привела к тому, что, несколько раз натыкавшись на решение проблемы с объяснением новых механизмов, проходил мимо. "У старого разведчика. что называется, глаз замыливается" (с) Шарапов (почти дословно). Все объяснено в туториале fpWeb Tutorial/ru (Маршрутизация)
|