Sign in Join
Wiki copytemporary

fcl-web/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Что такое fpWeb
22
33fpWeb можно использовать для создания приложений веб-сервера. Приложение веб-сервера может быть одним из следующих
44
55- Приложение CGI
66- Приложение FastCGI
77- Модуль Apache
88- Автономный HTTP-сервер, использующий компоненты HTTP-сервера Free Pascal.
99- Автономный сервер HTTP с использованием GNU libmicrohttp
1010- Приложение Windows SysHTTP.
1111
1212Во всех случаях модель разработки одинакова: вы регистрируете обработчики для набора URL-адресов (называемых маршрутами), которые будет поддерживать ваше приложение.
1313
1414Затем вы встраиваете эти маршруты в одну из указанных выше сред: Это означает, что вы выбираете объект приложения, который будете использовать.
1515
1616В lazarus IDE у вас есть выбор приложений, когда вы запускаете новый проект. После запуска приложения можно изменить тип приложения, обычно это означает просто изменение имени модуля в разделе uses проекта.
1717
1818В одном двоичном файле можно поддерживать несколько сред, хотя это требует дополнительной работы.
1919
2020fpWeb также предлагает некоторую готовую поддержку для REST-сервера базы данных или для механизмов JSON RPC 2.0. Они построены поверх вышеупомянутой конструкции. Платформа Brook также построена на основе базовой архитектуры, описанной выше.
2121
2222Подробнее об этом можно прочитать в [[fpWeb Tutorial]]
2323
2424## Использование fpWeb вместе с Lazarus
2525
2626### Установка пакета weblaz fpWeb Lazarus
2727
2828Первым делом необходимо установить пакет, который находится по пути lazarus/components/fpweb/weblaz.lpk. Как обычно с пакетами времени разработки, вам придется пересобрать Lazarus.
2929
3030### Создание CGI-приложения
3131
3232После установки пакета weblaz можно создать очень простое веб-приложение CGI, отображающее HTML-страницу, перейдя в меню Lazarus «Файл - Новый ...». Из списка возможных приложений выберите «Приложение CGI», как показано на изображении ниже, которое создаст основной файл проекта CGI и веб-модуль fpweb.
3333
3434![](/wiki-images/e/ec/New_cgi.PNG)
3535
3636TFPWebModule позволяет вам управлять свойствами и событиями с помощью инспектора объектов.
3737
3838Чтобы добавить код для отображения страницы, необходимо добавить обработчик запроса. Для этого дважды щелкните свойство OnRequest в инспекторе объектов, как показано на изображении ниже:
3939
4040![](/wiki-images/3/3d/Webmodule.PNG)
4141
4242В обработчике событий нужно написать HTML-код, который будет отображаться браузером. Чтобы избежать смешивания Pascal и HTML, эту страницу можно загружать из каталога, в котором находится исполняемый файл CGI, с помощью `AResponse.Contents.LoadFromFile()`.
4343
4444Тип ответа должен быть установлен в `AResponse.ContentType`. Для HTML-страниц это должно иметь значение 'text/html;charset=utf-8'.
4545
4646Наконец, для параметра Handled должно быть установлено значение True, чтобы указать, что запрос был успешно обработан (и вернуть в браузер код состояния 200 OK). После добавления этого кода веб-модуль должен выглядеть так:
4747
4848``` pascal
4949unit mainpage;
5050
5151{$mode objfpc}{$H+}
5252
5353interface
5454
5555uses
5656 Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb;
5757
5858type
5959
6060 { TFPWebModule1 }
6161
6262 TFPWebModule1 = class(TFPWebModule)
6363 procedure DataModuleRequest(Sender: TObject; ARequest: TRequest;
6464 AResponse: TResponse; var Handled: Boolean);
6565 private
6666 { private declarations }
6767 public
6868 { public declarations }
6969 end;
7070
7171var
7272 FPWebModule1: TFPWebModule1;
7373
7474implementation
7575
7676{$R *.lfm}
7777
7878{ TFPWebModule1 }
7979
8080procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
8181 AResponse: TResponse; var Handled: Boolean);
8282begin
8383 AResponse.ContentType := 'text/html;charset=utf-8';
8484 AResponse.Contents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'mainpage.html');
8585 Handled := True;
8686end;
8787
8888begin
8989 RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
9090end.
9191```
9292
9393### Развертывание приложения CGI
9494
9595В этом разделе предполагается, что используется веб-сервер Apache. Конечно, можно использовать и другие веб-серверы, поддерживающие CGI (nginx, cherokee).
9696
9797Apache можно загрузить здесь: <http://httpd.apache.org/download.cgi> или установить с помощью диспетчера пакетов вашего дистрибутива.
9898
9999При установке Apache по умолчанию все файлы, расположенные в его каталоге cgi-bin, будут обрабатываться как программы CGI, поэтому пользователь не сможет получить доступ к размещенным там простым файлам HTML. Этот каталог можно задать в файле httpd.conf в следующем разделе:
100100
101101 #
102102 # ScriptAlias: определяет, какие каталоги содержат сценарии сервера.
103103 # ScriptAliases по сути то же, что и Aliases(псевдонимы), за исключением того, что
104104 # документы в целевом каталоге рассматриваются как приложения и
105105 # запускается сервером по запросу, а не как документы, отправленные на
106106 # клиент. К директивам ScriptAlias применяются те же правила для завершающего символа "/",
107107 # что и к Alias.
108108 #
109109 ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
110110
111111Если вы поместите исполняемый файл с именем «mywebpage.cgi» в этот каталог, тогда к странице можно будет получить доступ как <http://localhost/cgi-bin/mywebpage.cgi> (или удаленно с соответствующим IP-адресом или доменным именем).
112112
113113Fcl-web с Lazarus в Windows создает файлы .exe. Чтобы Apache обслуживал эти файлы, вам необходимо добавить это:
114114
115115 AddHandler cgi-script .exe
116116
117117И чтобы обслуживать ваши исполняемые файлы из другого каталога, вы добавляете это:
118118
119119``` xml
120120 ScriptAlias /bin/ "C:/lazarus_projects/test-fclweb/bin/"
121121 <Directory "C:/lazarus_projects/test-fclweb/bin/">
122122 AllowOverride None
123123 Options None
124124 Order allow,deny
125125 Allow from all
126126 </Directory>
127127```
128128
129129### Форматирование HTML и читаемых полей запроса
130130
131131В предыдущем примере была показана простая HTML-страница. Можно, например, пожелать
132132
133133- динамически изменять вывод HTML-страницы и
134134- при чтении переменных, которые браузер передал веб-странице в полях запроса (например, в действиях HTTP GET и HTTP POST).
135135
136136Простое решение для первой проблемы - просто использовать стандартную подпрограмму Паскаля Format с добавлением %s или %d в файл HTML в соответствующие места, которые получат настраиваемое значение.
137137
138138### Чтение данных GET
139139
140140Чтобы прочитать переменные GET, можно использовать `ARequest.QueryFields`, который является потомком TStrings. Каждая переменная будет находиться в отдельной строке в TStrings в формате имя_переменной = значение, аналогично тому, как они отображаются в адресе страницы браузера. Для поиска определенной переменной можно использовать `ARequest.QueryFields.Values​​[]`, передав имя переменной в скобках, чтобы получить обратно ее значение, вместо ручного анализа строки.
141141
142142Итоговый код:
143143
144144``` pascal
145145procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
146146 AResponse: TResponse; var Handled: Boolean);
147147var
148148 HexText, AsciiText: string;
149149begin
150150 HexText := ARequest.QueryFields.Values['hex'];
151151 AsciiText := HexToAnsii(HexText);
152152
153153 AResponse.ContentType := 'text/html;charset=utf-8';
154154 AResponse.Contents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'mainpage.html');
155155 AResponse.Contents.Text := Format(AResponse.Contents.Text,
156156 [HexText, AsciiText]);
157157 Handled := True;
158158end;
159159```
160160
161161### Чтение данных POST
162162
163163Данные, отправленные запросами POST, можно получить из `TRequest.Content`. Он будет без заголовков запроса - другими словами, он будет содержать тело запроса.
164164
165165К отправленным данным формы также можно получить доступ с помощью `TRequest.ContentFields`, который представляет собой содержимое, проанализированное как поля, разделенные знаком `&` и декодированные. Например, следующий набор значений формы:
166166
167-`login: dfg 345&&`\
168-`login_senha: ====`\
169-`email: dfg`
167+```text
168+login: dfg 345&&
169+login_senha: ====
170+email: dfg
171+```
170172
171173Будут преобразованы в 'APPLICATION/X-WWW-FORM-URLENCODED' следующим образом (см. [wikipedia POST (HTTP)](http://en.wikipedia.org/wiki/POST_%28HTTP%29)):
172174
173-`login=dfg+345%26%26&login_senha=%3D%3D%3D%3D&email=dfg`
175+```text
176+login=dfg+345%26%26&login_senha=%3D%3D%3D%3D&email=dfg
177+```
174178
175179И будет доступно в `TRequest.ContentFields` через индекс строки или через свойство Values, что удобнее:
176180
177-`TRequest.ContentFields[0]: login=dfg 345&&`\
178-`TRequest.ContentFields[1]: login_senha=====`\
179-`TRequest.ContentFields[2]: email=dfg`\
180-`TRequest.ContentFields.Values['email']: dfg`
181+```text
182+TRequest.ContentFields[0]: login=dfg 345&&
183+TRequest.ContentFields[1]: login_senha=====
184+TRequest.ContentFields[2]: email=dfg
185+TRequest.ContentFields.Values['email']: dfg
186+```
181187
182188Если используются другие типы mime, кроме 'MULTIPART/FORM-DATA' и 'APPLICATION/X-WWW-FORM-URLENCODED' (типы, поддерживаемые формами HTML):
183189
184190- контент доступен только в `TRequest.Content`, но не в `TRequest.ContentFields`
185191- использование этих mime-типов вызывает исключение для FPC 2.4.2 (исправлено в FPC 2.5+).
186192
187193Обратите внимание, что HTTP POST также может отправлять поля запроса (в URL-адресе), например <http://server/bla?question=how>, и к ним обращается `TRequest.QueryFields`, как описано в предыдущем разделе.
188194
189195``` pascal
190196procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
191197 AResponse: TResponse; var Handled: Boolean);
192198var
193199 lData: String;
194200begin
195201 lData := ARequest.Content;
196202```
197203
198204### Чтение двоичных данных POST
199205
200206Загруженные файлы сохраняются во временном расположении с временным именем файла, чтобы сохранить файл, вы должны переместить его в постоянное расположение.
201207
202208Для получения данных на сервере, который был размещен, например, как multipart/form-data используйте что-то вроде этого:
203209
204210``` pascal
205211procedure TMainWebModule.TFPWebActions2Request(Sender: TObject;
206212 ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
207213var
208214 i: Integer;
209215begin
210216 // Обработать все полученные файлы
211217 for i := 0 to ARequest.Files.Count - 1 do
212218 begin
213219 // Настоятельно рекомендуется делать что-то еще, кроме Writeln ;)
214220 writeln ('Полученное имя файла: '+ARequest.Files[i].LocalFileName);
215221 end;
216222
217223 Handled := true;
218224end;
219225```
220226
221227Клиент может отправлять данные, например, FileFormPost.
222228
223229## Специализированные модули
224230
225231Класс *TFPWebModule* (используемый ниже) - это простой пример WEb-модуля, который можно использовать для всех видов HTTP-запросов.
226232
227233Однако fpweb поставляется с некоторыми специализированными модулями, которые имеют дополнительную поддержку для специализированных задач:
228234
229235- Класс **TSimpleFileModule** в модуле *fpwebfile.pp* можно использовать для отправки файлов. Вы указываете ему каталог, и он делает все остальное.
230236- Класс **TFPHTMLModule** в модуле *fphtml.pp* можно использовать для создания HTML.
231237- Класс **TProxyWebModule** в модуле *fpwebproxy.pp* - это готовый прокси для пересылки.
232238- Класс **TFPWebProviderDataModule** в модуле *fpwebdata.pp* обслуживает данные в формате JSON, которые могут использоваться хранилищами ExtJS.
233239- Класс **TSQLDBRestModule** в модуле *sqldbrestmodule.pp* реализует полноценный сервер REST, поддерживаемый SQLDB. См. Дополнительную информацию в [[SQLDBRestBridge]].
234240- Класс **TJSONRPCModule** в модуле *webjsonrpc.pp* реализует службу JSON-RPC.
235241- Класс **TExtDirectModule** в модуле *fpextdirect.pp* реализует вариант Ext.Direct службы JSON-RPC.
236242
237243## Использование нескольких модулей
238244
239245Если в веб-приложении только один модуль, все запросы будут направлены в этот модуль.
240246
241247По мере роста вашего веб-приложения можно использовать несколько модулей. Новый модуль можно добавить, выбрав 'File - New', а затем один из 'Web module' или 'HTML Web Module'.
242248
243249FCL-web использует URL-адрес, чтобы определить, как следует обрабатывать HTTP-запрос. Поэтому он должен знать, какие веб-модули существуют в приложении. Для этого каждый модуль должен быть зарегистрирован.
244250
245251Каждый модуль регистрируется в fcl-web в разделе инициализации модуля, в котором он определен:
246252
247253``` pascal
248254RegisterHTTPModule('location', TMyModule);
249255```
250256
251257Затем модуль будет вызван, если используется URL-адрес формы
252258
253-`http://www.mysite.org/mycgi.cgi/location`
259+```text
260+http://www.mysite.org/mycgi.cgi/location
261+```
254262
255263или
256264
257-`http://www.mysite.org/mycgi.cgi?module=location`
265+```text
266+http://www.mysite.org/mycgi.cgi?module=location
267+```
258268
259269Если присутствует несколько модулей, имя модуля должно появиться в URL-адресе, в противном случае возникнет ошибка.
260270
261271Это поведение также можно принудительно настроить для приложений, которые имеют только один модуль, установив для свойства приложения AllowDefaultModule значение false:
262272
263273``` pascal
264274Application.AllowDefaultModule := False;
265275```
266276
267277В этом случае приложение fcl-web всегда будет требовать имя модуля в URL-адресе.
268278
269279Имя переменной запроса, определяющей имя модуля (по умолчанию это 'module'), можно задать в свойстве `Application.ModuleVariable`. Следующий код
270280
271281``` pascal
272282Application.ModuleVariable := 'm';
273283```
274284
275285гарантирует, что следующий URL-адрес будет направлен в TMyModule:
276286
277-`http://www.mysite.org/mycgi.cgi?m=location`
287+```text
288+http://www.mysite.org/mycgi.cgi?m=location
289+```
278290
279291Если всего этого недостаточно для определения модуля, которому следует передать запрос, можно использовать событие `Application.OnGetModule`. Это тип `TGetModuleEvent`:
280292
281293``` pascal
282294type
283295 TGetModuleEvent = Procedure (Sender : TObject; ARequest : TRequest;
284296 Var ModuleClass : TCustomHTTPModuleClass) of object;
285297```
286298
287299Создание обработчика событий для этого события позволяет точно контролировать модуль, созданный для обработки запроса: запрос (переданный в ARequest) может быть исследован, а для переменной 'ModuleClass' должен быть задан класс модуля, который должен обрабатывать Запрос.
288300
289301Если 'ModuleClass' при возврате равен 'Nil', в браузер будет отправлено сообщение об ошибке.
290302
291303## Использование Actions
292304
293305Модуль можно использовать для группировки определенных видов действий, которые логически связаны друг с другом. Представьте себе модуль TUserModule, который используется для управления пользователями на веб-страницах. С пользователем может быть связано несколько действий:
294306
295307- Создание
296308- Удаление
297309- Редактирование
298310- Отображение
299311
300312Эти разные действия могут обрабатываться одним и тем же модулем. Можно определить действие по URL-адресу вручную, например:
301313
302-`http://mysite/mycgi.cgi/user?action=delete&id=12`
314+```text
315+http://mysite/mycgi.cgi/user?action=delete&id=12
316+```
303317
304318Это можно автоматизировать.
305319
306320Для упрощения разделения различных действий в модуле есть свойство actions: это коллекция, в которой каждый элемент связан с различным ответом на запрос. Действия имеют различные свойства:
307321
308322Name
309323Название действия. URL-адрес будет проверен, чтобы определить название действия.
310324
311325Content
312326строка. Если задано, оно отправляется в браузер.
313327
314328Contents
315329список строк. Если задано, оно отправляется в браузер.
316330
317331ContentProducer
318332если задано, ContentProducer будет обрабатывать запрос.
319333
320334Default
321335если установлено значение «True», это действие является действием по умолчанию. Это означает, что если FCL-Web не может определить имя действия, будет выполнено это действие.
322336
323337Template
324338если установлено, этот шаблон будет обработан, а результаты отправлены в браузер.
325339
326340Также есть некоторые события:
327341
328342BeforeRequest
329343выполняется до обработки запроса. Может использоваться для установки 'Content' или других свойств.
330344
331345AfterRequest
332346выполняется после обработки запроса.
333347
334348OnRequest
335349обработчик событий для обработки запроса. Если задано, обработчик используется для обработки запроса.
336350
337351Опять же, как и в случае нескольких модулей, URL-адрес используется для определения того, какое действие выполнить. Используется часть сразу после части модуля (в данном примере "user"):
338352
339-`http://mysite/mycgi.cgi/user/delete&id=12`
353+```text
354+http://mysite/mycgi.cgi/user/delete&id=12
355+```
340356
341357выполнит действие под названием 'delete'.
342358
343359Свойство 'ActionVar' модуля можно использовать для установки имени используемой переменной запроса. Настройка
344360
345361``` pascal
346362UserModule.ActionVar := 'a';
347363```
348364
349365может использоваться для изменения указанного выше URL на
350366
351-`http://mysite/mycgi.cgi/user?a=delete&id=12`
367+```text
368+http://mysite/mycgi.cgi/user?a=delete&id=12
369+```
352370
353371Если в приложении только один модуль, URL-адрес можно сократить до
354372
355-`http://mysite/mycgi.cgi/delete&id=12`
373+```text
374+http://mysite/mycgi.cgi/delete&id=12
375+```
356376
357377## Использование HTML-шаблонов
358378
359379Информацию об использовании шаблонов, тегов шаблонов и параметров тегов шаблонов для создания страниц ответов см. в файле fptemplate.txt в каталоге FPC в /packages/fcl-base/texts/.
360380
361381Примеры проектов, демонстрирующих использование шаблонов, можно найти в каталоге FPC в /packages/fcl-web/examples/fptemplate/ (дополнительные сведения см. в README.txt). (В более ранних версиях эти примеры находились в каталоге Lazarus в /components/fpweb/demo/fptemplate/)
362382
363383## Советы и устранение неполадок
364384
365385### Отправка кодов результатов
366386
367387Чтобы отправить HTTP-ответ, отличный от 200 OK, используйте **AResponse.Code** и **AResponse.CodeText**, например
368388
369389``` pascal
370390AResponse.Code := 404;
371391AResponse.CodeText := 'Document not found';
372392```
373393
374394### Отправка двоичных данных
375395
376396Подход, который, кажется, работает для отправки, например, файл tiff с веб-сервера на клиент - адаптированный из \$(fpcdirectory)\packages\fcl-web\examples\jsonrpc\demo1\wmdemo.pp - что-то вроде:
377397
378398``` pascal
379399AResponse.ContentStream := TMemoryStream.Create;
380400
381401try
382402 AResponse.ContentStream.LoadFromFile('/tmp/sample.tiff');
383403 AResponse.ContentType := 'image/tiff'; //или любой другой тип MIME, который вы хотите отправить
384404 //что делать: есть пример fpweb, который получает тип mime из расширения файла ...
385405 AResponse.ContentLength:=AResponse.ContentStream.Size; //видимо не происходит автоматически?
386406 AResponse.SendContent;
387407finally
388408 AResponse.ContentStream.Free;
389409end;
390410
391411Handled := true;
392412```
393413
394414### Error: Could not determine HTTP module for request
395415
396416У вас может быть несколько модулей и несколько actions. Если вы укажете URL-адрес только с 1 элементом, например:
397417
398418```html4strict
399419http://localhost/cgi-bin/somemodule
400420```
401421
402422тогда fpweb предполагает, что вы указываете действие. Если у вас не установлен модуль по умолчанию, вы получите внутреннюю ошибку сервера 500 (не удалось определить модуль HTTP для запроса)
403423
404424Вы можете изменить это поведение, чтобы вместо этого fpweb отображал имя модуля, установив для свойства приложения `PreferModuleName` значение `true`.
405425
406426### Error: response code 500 Internal Server error when trying to handle DELETE method
407427
408428В FPC 2.6.2 и ниже fcl-web не принимает метод DELETE и выдает ошибку.
409429
410430### fpWeb/FCGI и Apache 2.4 (режим mod_proxy_fcgi)
411431
4124321, Enable following modules: setenvif_module, proxy_module and proxy_fcgi_module\
413433(on CentOS 7 modules are defined in file /etc/httpd/conf.modules.d/00-base.conf and /etc/httpd/conf.modules.d/00-proxy.conf). Если вы хотите развернуть приложение FCGI позади прокси-сервера Apache 2.4+, вам понадобится переменная PATH_INFO в заголовках, которые отправляются через сокет демону FCGI.
414434
4154351\. Включите следующие модули: setenvif_module, proxy_module и proxy_fcgi_module\
416436(в CentOS 7 модули определены в файлах /etc/httpd/conf.modules.d/00-base.conf и /etc/httpd/conf.modules.d/00-proxy.conf).
417437
418438 LoadModule setenvif_module modules/mod_setenvif.so
419439 LoadModule proxy_module modules/mod_proxy.so
420440 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
421441
4224422\. Конфигурация обратного прокси для fpWeb/FCGI, прослушивающего порт 9000.\
423443\$1 = module name\
424444\$2 = action name
425445
426446 SetEnvIf Request_URI . proxy-fcgi-pathinfo=full
427447 ProxyPassMatch "/fcgi/(.*)/(.*)" "fcgi://127.0.0.1:9000/$1/$2"
428448
429449### fpWeb/FCGI и nginx
430450
431451Для правильной маршрутизации fcl-web требует переменную PATH_INFO в заголовках, отправленных из nginx. Для этого вы должны разделить весь URL-адрес на имя приложения FastCGI и часть информации о пути с помощью оператора конфигурации *fastcgi_split_path_info*. Оператор принимает регулярное выражение и помещает второе совпадение в конфигурационную переменную *\$fastcgi_path_info*. Эту переменную можно передать вашему приложению с помощью оператора *fastcgi_param*.
432452
433453Следующий пример конфигурации включает в себя полноценный виртуальный хост для nginx, который передает все из *<http://myserver:8080/mycgiapp/>* во внешнее приложение FastCGI.
434454
435455 server {
436456
437457 listen 8080;
438458 listen [::]:8080;
439459
440460 server_name _;
441461
442462 root "/var/www";
443463
444464 location /mycgiap/ {
445465 # setting up PATH_INFO
446466 fastcgi_split_path_info ^(/mycgiapp/)(.*)$;
447467 fastcgi_param PATH_INFO $fastcgi_path_info;
448468
449469 # other parameters
450470 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
451471 fastcgi_param QUERY_STRING $query_string;
452472 fastcgi_param REQUEST_METHOD $request_method;
453473 fastcgi_param CONTENT_TYPE $content_type;
454474 fastcgi_param CONTENT_LENGTH $content_length;
455475 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
456476 fastcgi_param REQUEST_URI $request_uri;
457477 fastcgi_param DOCUMENT_URI $document_uri;
458478 fastcgi_param DOCUMENT_ROOT $document_root;
459479 fastcgi_param SERVER_PROTOCOL $server_protocol;
460480 fastcgi_param REQUEST_SCHEME $scheme;
461481 fastcgi_param HTTPS $https if_not_empty;
462482 fastcgi_param GATEWAY_INTERFACE CGI/1.1;
463483 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
464484 fastcgi_param REMOTE_ADDR $remote_addr;
465485 fastcgi_param REMOTE_PORT $remote_port;
466486 fastcgi_param SERVER_ADDR $server_addr;
467487 fastcgi_param SERVER_PORT $server_port;
468488 fastcgi_param SERVER_NAME $server_name;
469489
470490 # pass requests to your FastCGI application
471491 fastcgi_pass 127.0.0.1:9000;
472492 }
473493 }
474494
475495## Примечание
476496
477497- Модуль cgiapp устарел, по возможности используйте fpcgi.
478498
479499- Модули fastcgi, custfcgi и fpfcgi не поддерживаются в Darwin в настоящее время, потому что он использует другой механизм, чем опция MSG_NOSIGNAL для recv(), чтобы указать, что SIGPIPE не должен генерироваться в случае разрыва соединения. См. <http://lists.apple.com/archives/macnetworkprog/2002/Dec/msg00091.html>, чтобы узнать, как это исправить.
480500
481501- Если вы развертываете свое приложение CGI и получаете такие ошибки, как "Error: No action name and no default action", вы должны убедиться, что для URL-адреса назначено действие, или перехватить неподдерживаемые действия с действием, отмеченным по умолчанию. В обоих случаях следует использовать обработчик события `OnRequest` для действия, которое устанавливает `Handled:=true`.
482502
483503## См. также
484504
485505- [[fpWeb Tutorial]]
486506- [[fphttpclient]] - Часть fcl-web, которую можно использовать отдельно в клиентских приложениях
487507- *write me!* fphttpserver - Небольшой автономный веб-сервер Object Pascal. Может использоваться для обслуживания приложений fcl-web CGI.
488508- [[CGI Web Programming|CGI_Web_Programming#Debugging_CGI]] Информация об отладке приложений CGI
489509- [Часть учебника Leonardo Ramé](https://github.com/leonardorame/Ext4-MVC-Tutorial/wiki/Lazarus-Server), в котором показано, как писать приложение fcl-web CGI; включает пример создания содержимого JSON
490510
491511---
492512*From the Free Pascal wiki, page "fcl-web/ru", as it stood on 2021-01-07 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history