На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> FCGIApp+Nginx+Lazarus+Debian , С проблемой в связке помогите разобраться
    Всем доброго времени суток!
    У меня поступило задание написать FastCGI-приложение на Lazarus и заставить его работать в связке с Nginx на Debian. Что сделал я...
    1. Обновил FPC и Lazarus до последних версий через fpcupdeluxe.
    2. Установил пакет fpweb в Lazarus и создал тестовое FastCGI-приложение (код ниже)
    ExpandedWrap disabled
      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. Написал конфиг для виртуального хоста (ниже)

    ExpandedWrap disabled
      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.
    ExpandedWrap disabled
      [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. А проблема, собственно, заключается в исключении при обращении к локальному сайту...
    user posted image
    Из ошибки можно сделать вывод, что Nginx отработал, отдал запрос, а приложение по каким-то причинам этот запрос не может обработать и генерирует исключение. Полазил я по исходникам fcl-web и нашел, что оно может происходить в TWebHandler.HandleRequest(...) модуля custweb, если не ошибаюсь... Глубже не полез. Не совсем понятно что "не найдено"-то... Судя по всем мануалам, должен отработать дефолтовый web-модуль, а у него (видно из кода выше) только один обработчик на все запросы. Не подскажете, что я делаю не так?

    Вдогонку. Попробовал helloworld из fcl-webсобрать (но не через makefile, а так) - собралось, но при выполнении та же ошибка. Может что-нибудь не доустановил просто в систему или не все настроил. Кто сталкивался - подскажите.
    Сообщение отредактировано: =SAPSAN= -
      С fclweb и fastcgi не знаком совершенно, но порядок действий предложил бы такой

      1. убрать Nginx для более простого дебага
      1.1. выделить присылаемый запрос с помощью сниффера или логами
      1.2. скармливать его своей программе с помощью ncat или подобного
      2. посмотреть, что именно возвращает модуль (само содержимое)
      3. поставить бряки и пройти по шагам там, где выдается ошибка
        Спасибо откликнувшимся. Уже хотел так и сделать. но наткнулся на это и это...
        ExpandedWrap disabled
          Application.Legacyrouting := True;

        перед строкой инициализации приложения решает проблему на данном этапе, но надо смотреть что там в этом маршрутиааторе такого накручено, что просто так ни один пример не работает...
          Я в шоке (небольшом) :) Вот что бывает когда знаешь что искать... "Очень информативная" ошибка "Not found" привела к тому, что, несколько раз натыкавшись на решение проблемы с объяснением новых механизмов, проходил мимо. "У старого разведчика. что называется, глаз замыливается" (с) Шарапов (почти дословно). Все объяснено в туториале fpWeb Tutorial/ru (Маршрутизация)
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0274 ]   [ 16 queries used ]   [ Generated: 27.04.24, 11:43 GMT ]