FCGIApp+Nginx+Lazarus+Debian
Всем доброго времени суток! У меня поступило задание написать FastCGI-приложение на Lazarus и заставить его работать в связке с Nginx на Debian. Что сделал я...
Обновил FPC и Lazarus до последних версий через fpcupdeluxe.
Установил пакет 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.
Скомпилировалось все отлично.
Установил 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; }
}
Для запуска 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
А проблема, собственно, заключается в исключении при обращении к локальному сайту...
Из ошибки можно сделать вывод, что Nginx отработал, отдал запрос, а приложение по каким-то причинам этот запрос не может обработать и генерирует исключение. Полазил я по исходникам fcl-web и нашел, что оно может происходить в TWebHandler.HandleRequest(...) модуля custweb, если не ошибаюсь... Глубже не полез. Не совсем понятно что "не найдено"-то... Судя по всем мануалам, должен отработать дефолтовый web-модуль, а у него (видно из кода выше) только один обработчик на все запросы. Не подскажете, то я делаю не так?
Вдогонку. Попробовал helloworld из fcl-webсобрать (но не через makefile, а так) - собралось, но при выполнении та же ошибка. Может что-нибудь не доустановил просто в систему или не все настроил. Кто сталкивался - подскажите.