The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Написание своего Fast-CGI приложения, !*! denner, 12-Апр-09, 05:46  [смотреть все]
Передо мной встала задача - написать приложение для fastCGI(используется nginx). Здесь я сначала особых проблем не видел, ибо настраивается всё легко, сам принцип fCGI тоже понятен.
Для разработки я использую машину с WinXP SP2, NetBeans6.5.1, MinGM, MSYS. Всё кроссплатформенное пишется на ура.
Сразу найдя статью на хабре(http://habrahabr.ru/blogs/perl/52980/) и погуглив понял что мало кто пишет мануалы о написании fCGI-apps на с/с++.
Настроил nginx как было написано в статье добавив только строчки:

      location /app/ {
            fastcgi_pass   localhost:9000;
        }

Скачал готовый(было лень компилить) SDK как написано на http://pagc.wiki.sourceforge.net/Software_Requirements?f=print. Всё ок. Всё что нужно там есть (static, dyn либы и хёдеры).
Создал проект в NetBeans, копирнул первый попавшийся экземпл(echo.c) из http://fastcgi.com/dist/fcgi-2.4.0.tar.gz.

И тут самое страшное... Оно ведь не биндится на сокет как нужно для fastCGI, в сырце ничего подобного нет! Но скомпилилось и бросало в консоль инфу после чего благополучно закрывалось(без ошибок).
Почитав и погуглив я понял что можно спаунить процесс через тулзу Spawn-FCGI из комплекта Lighttp.

Скачал сборку для win32, копирнул в отдельную папку Spawn-FCGI.exe, cygwin1.dll, echo.exe, fcgi.dll.
Создал bat-файл такого содержания:

"Spawn-FCGI.exe -f ecto -a 127.0.0.1 -p 9000
pause"

Первый запуск... Ура! В консоль написалось что процесс заспаунился и выдало его pid! Затем выполнилось pause дав это прочитать.
На радостях зашёл на http://localhost/app/ и... ничего. Nginx не может подсоединиться к процессу. Ну и правильно. Процесса то с таким пидом нет, а значит и слушать 9000й порт некому. Подумал что мб вывалилось приложение, ну бывает, и запустил bat-файл ещё раз. Тут я увидел страшное:

spawn-fcgi.c.230: child exited with: 127

И более spawn-fcgi мне не выдавал что смог запустить процесс. Всё время пишет это. Я перепробовал большое кол-во сырцов, некоторые выдавали даже ошибку 0, но почти все 127.

Нагуглил топик https://www.opennet.ru/openforum/vsluhforumID9/7570.html. Вот! То что нужно! - подумал я. Но никакой информации кроме той что знаю я так получить и не смог.

Уже часов 6 пытаюсь разобраться. Надежда только на вас.

  • Написание своего Fast-CGI приложения, !*! denner, 06:50 , 12-Апр-09 (1)
    Поставил cygwin и скомпилил примеры с его помощью. И попробовал использовать скомпилинный им же cgi-fcgi.exe. На примере echo.exe пашет, а с спауном он лайти - нет. Буду теберь думать перейти с MinGW на cygwin...
  • Написание своего Fast-CGI приложения, !*! angra, 07:02 , 12-Апр-09 (2)
    >Нагуглил топик https://www.opennet.ru/openforum/vsluhforumID9/7570.html. Вот! То что нужно! - подумал я. Но никакой
    >информации кроме той что знаю я так получить и не смог.

    Ну из этого топика можно было вынести понятие, что fastcgi приложение может либо быть standalone, либо использовать внешний fastcgi сервер для spawn. Соответственно оно по разному пишется. А вы один и тот же код пытались запихнуть в оба варианта.
    Также в том топике была еще одна важная мысль - писать cgi/fastcgi на С это извращение.

    • Написание своего Fast-CGI приложения, !*! denner, 07:25 , 12-Апр-09 (3)
      >>Нагуглил топик https://www.opennet.ru/openforum/vsluhforumID9/7570.html. Вот! То что нужно! - подумал я. Но никакой
      >>информации кроме той что знаю я так получить и не смог.
      >
      >Ну из этого топика можно было вынести понятие, что fastcgi приложение может
      >либо быть standalone, либо использовать внешний fastcgi сервер для spawn. Соответственно
      >оно по разному пишется. А вы один и тот же код
      >пытались запихнуть в оба варианта.
      >Также в том топике была еще одна важная мысль - писать cgi/fastcgi
      >на С это извращение.

      Да, всё это я уже знал. Поэтому сразу и знал что нужно именно приложение для spawn. Не знаю от чего вы подумали что я пишу приложение на С, верно из-за того что я в качестве примера сначала скомпилил именно echo.c. Уверяю вас, пишу я на С++ и буду писать своё приложение именно на нём.
      Сейчас экспериментирую с cygwin и MinGW. Всёже скорость МинГВ и размеры конечных файлов говорят что лучше именно он. Но вот то что он странно линковал SDK... Но и сигвин юзать не хочется ибо старые репы(буст только 1.33), да и остальное.
      Сейчас попробую заставить МинГВ нормально скомпилить и слинковать SDK.

      А что вы предпочитаете? MinGW али Cygwin ? Если можно, аргументируйте.

      • Написание своего Fast-CGI приложения, !*! angra, 08:00 , 12-Апр-09 (4)
        >Уверяю вас, пишу я на С++

        Да какая разница С или С++ в этом вопросе, зачем вообще компилируемые языки для cgi, особенно для кроссплатформенного?


        >А что вы предпочитаете? MinGW али Cygwin ? Если можно, аргументируйте.

        Я предпочитаю linux :)
        Обе среды используют gcc, вопрос только каких версий и с какими флагами, плюс библиотеки обеспечивающие кроссплатформенность разные. Есть еще третий вариант - winelib. Важный момент: не стоит смешивать разные либы совместимости в одном проекте.

        Вы бы код приложения, которое пытаетесь запустить показали. Также вызывает сомнения -f ecto, неужто именно так называется программа и как винда реагирует на отсутствие .exe?

        Весьма вероятно, что вам поможет http://redmine.lighttpd.net/boards/2/topics/686

        • Написание своего Fast-CGI приложения, !*! denner, 08:47 , 12-Апр-09 (5)
          >[оверквотинг удален]
          >Обе среды используют gcc, вопрос только каких версий и с какими флагами,
          >плюс библиотеки обеспечивающие кроссплатформенность разные. Есть еще третий вариант - winelib.
          >Важный момент: не стоит смешивать разные либы совместимости в одном проекте.
          >
          >
          >Вы бы код приложения, которое пытаетесь запустить показали. Также вызывает сомнения -f
          >ecto, неужто именно так называется программа и как винда реагирует на
          >отсутствие .exe?
          >
          >Весьма вероятно, что вам поможет http://redmine.lighttpd.net/boards/2/topics/686

          На счёт языков:
          Да, хороший вопрос, но не хочется мне писать на питоне/руби/перле.

          А версии да, разные. В сигвине 3.4.4 а в мингв аж 4.3.3. Самое главное что я вроде нашёл проблему компиляции в мингв. Т.е. как минимум это проблема:

          checking for ANSI C header files... yes
          checking for sys/types.h... yes
          checking for sys/stat.h... no
          checking for stdlib.h... no
          checking for string.h... no
          checking for memory.h... no
          checking for strings.h... no
          checking for inttypes.h... no
          checking for stdint.h... no
          checking for unistd.h... no
          checking for gcc option to accept ANSI C... none needed
          checking for ssize_t... no
          checking for sun_len in sys/un.h... no
          checking for fpos_t in stdio.h... yes
          checking for sys/socket.h... no

          Однако в мингв всё есть. Пробовал флаги --includedir и --oldincludedir. Не помогло. Однако меня сразу удивило:

          checking for sys/types.h... yes
          checking for sys/stat.h... no

          Т.е. в папке sys есть types.h но нет stat.h. Но там всё есть. Я сразу решил посмотреть отчёт:

          configure:7756: checking for sys/types.h
          configure:7768: gcc -c -g -O2  conftest.c >&5
          configure:7771: $? = 0
          configure:7774: test -s conftest.o
          configure:7777: $? = 0
          configure:7787: result: yes
          configure:7756: checking for sys/stat.h
          configure:7768: gcc -c -g -O2  conftest.c >&5
          In file included from configure:7762:
          confdefs.h:9:25: warning: missing whitespace after the macro name
          configure:7764:5: error: token "" is not valid in preprocessor expressions
          configure:7771: $? = 1
          configure: failed program was:
          #line 7762 "configure"
          #include "confdefs.h"
          #include <stdio.h>
          #if HAVE_SYS_TYPES_H
          # include <sys/types.h>
          #endif
          #if HAVE_SYS_STAT_H
          # include <sys/stat.h>
          #endif
          #if STDC_HEADERS
          # include <stdlib.h>
          # include <stddef.h>
          #else
          # if HAVE_STDLIB_H
          #  include <stdlib.h>
          # endif
          #endif
          #if HAVE_STRING_H
          # if !STDC_HEADERS && HAVE_MEMORY_H
          #  include <memory.h>
          # endif
          # include <string.h>
          #endif
          #if HAVE_STRINGS_H
          # include <strings.h>
          #endif
          #if HAVE_INTTYPES_H
          # include <inttypes.h>
          #else
          # if HAVE_STDINT_H
          #  include <stdint.h>
          # endif
          #endif
          #if HAVE_UNISTD_H
          # include <unistd.h>
          #endif
          #include <sys/stat.h>
          configure:7787: result: no
          configure:7756: checking for stdlib.h
          configure:7768: gcc -c -g -O2  conftest.c >&5
          In file included from configure:7762:
          confdefs.h:9:25: warning: missing whitespace after the macro name
          configure:7764:5: error: token "" is not valid in preprocessor expressions
          configure:7771: $? = 1
          configure: failed program was:
          ...

          error: token "" is not valid in preprocessor expressions

          Что это за баг версии 4,3,3 или как? Это можно вылечить? Я даже не знаю что делать. Есть предположение что он просто не может использовать пробелы между # и include. Есть идеи как поправить?

          • Написание своего Fast-CGI приложения, !*! NaN, 05:51 , 13-Апр-09 (6)
            >>[оверквотинг удален]
            >Что это за баг версии 4,3,3 или как? Это можно вылечить? Я
            >даже не знаю что делать. Есть предположение что он просто не
            >может использовать пробелы между # и include. Есть идеи как поправить?

            Ну в принципе можешь и ещё пару месяцев поизвращаться и поставить что-то юниксовое только потом :)
            Как ты тут продемонстрировал ты серьёзно "плаваешь" даже в базовых вещах, а чтобы натянуть программу на "гетерогенщину" нужны более серьёзные знания по всем системам в неё входящим.
            Если уж совсем без форточки не можешь - ставь что нить из юниксов в виртуальную машину - и всё само пойдёт ...
            Кстати - что CGI что FCGI писать на низкоуровневых С и С++ м-мм ... нерационально :)

            • Как скомпилировать fastcgi под MinGW?, !*! denner, 20:01 , 13-Апр-09 (7)
              Базовых вещах? Извольте. Я предлагаю таковые объяснения только из-за безысходности. Я хорошо понимаю что "использовать пробелы между # и include" это более чем нормально.
              "баг версии 4,3,3 или как" - я имел ввиду баг версии в мингв, лишь предположил что возможно это баг.
              "Это можно вылечить?" - я предположил что есть фиксы или иной способ(использование иной версии минГВ).
              С FastCGI я знаком уже давно и не по наслышке, только вот своё fcgi приложение пришлось писать первый раз.
              То что сразу лог скрипта конфигурации не глянул - поторопился.
              Поверь, знаний то у меня хватает как в "базовых частях", так и в "более серьёзных знаниях по всем системам в неё входящим".
              Не знаю по чему ты можешь ещё судить.
              А вот поставить юниксовое - это да. Уже стоит арч и не ощущаю проблем с ним, но всёже достаточно часто приходится использовать MSVS для иных проектов, а запускать виртуальную машину для неё не очень хочется.
              Однако хочется использовать именно минГВ.

              Сузим запрос для "вас":

              "Как скомпилировать fastcgi под MinGW?"




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру