Вебсервер nginx + fastcgi-wrapper + matlab

    Сегодня я не в первый раз задался вопросами: какие языки программирования пригодны для веба, и имеет ли смысл решать какую-то узкую задачу способом, который на первый взгляд для этого не подходит? Мне захотелось попрактиковаться, сделав что-нибудь обычное необычным способом.



    Для чего?


    Я задался целью написать вебприложение целиком на языке матлаба без использования каких-либо обёрток. Зачем я стал это делать? Здесь есть несколько причин. Мне показалось это просто забавным. Помимо этого я наблюдал, как многие вебпрограммисты склоняются в своей работе к каким-то стереотипным решениям, что можно было бы назвать «PHP головного мозга». Это сказано ни в коем случае не в укор php-программистам, просто такое явление есть и я думаю, что моя заметка будет кому-то примером.

    Как?


    В качестве интерпретатора этого языка я выбрал GNU Octave по причине его бесплатности и лёгкодоступности на линуксе. В качестве вебсервера я выбрал nginx по той причине, что много работаю с ним и мне он просто очень удобен. Мне нужно было заставить работать скрипт на матлабе как CGI-приложение. В юниксах есть для этого простая возможность — вначале текстового файла можно указать путь и параметры интерпретатора и если у файла стоит атрибут выполнимости, он может быть запущен и будет выполнен посредством этого интерпретатора. Сам по себе nginx не умеет выполнять простые CGI и примеры врапперов отсюда мне НЕ помогли. В другом источнике, не столь приближённом к создателям вебсервера, было предложено использовать для nginx fcgiwrapper, который даже входит в состав моего дистрибутива debian.

    Что получилось?


    Фрагмент итоговой конфигурации nginx:
    	  location ~ \.m$ {
        	gzip off; #gzip makes scripts feel slower since they have to complete before getting gzipped
        	fastcgi_pass  unix:/var/run/fcgiwrap.socket;
        fastcgi_index index.m;
        fastcgi_param SCRIPT_FILENAME /var/www/m.leprodc$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 GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param SERVER_SOFTWARE    nginx;
        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 REMOTE_ADDR        $remote_addr;
        fastcgi_param REMOTE_PORT        $remote_port;
        fastcgi_param SERVER_ADDR        $server_addr;
        fastcgi_param SERVER_PORT        $server_port;
        fastcgi_param SERVER_NAME        $server_name;
      }
    

    Код скрипта plot1.m:
    #!/usr/bin/octave -q
    domain="m.leprodc.ru";
    ARG=sscanf(getenv("QUERY_STRING"),"a=%g&b=%g&c=%g");
    if (length(ARG)==3)
    a=ARG(1);
    b=ARG(2);
    c=ARG(3);
    handle=figure;
    X=-10:0.1:10;
    Y=a.*X.^2+b.*X+c;
    printf("Content-type: text/plain\n\n");
    plot(X,Y);
    print(handle, sprintf('/tmp/plot-%s:%s.png',getenv("REMOTE_ADDR"),getenv("REMOTE_PORT")),'-dpng');
    printf("Full image: http://%s/plot-%s:%s.png\n\n",domain,getenv("REMOTE_ADDR"),getenv("REMOTE_PORT"));
    else
    printf("Location: http://%s/\n\n",domain);
    endif
    


    Что получилось?


    Например, вот: http://m.leprodc.ru/

    Почитать:

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 27

      +6
      >>>а давайте писать на не предназначенных для веба языках?
      а давай, я тут список накидал: перл, пистон, руби, жава. кто возьмется?
        0
        , javascript
      • UFO just landed and posted this here
          +10
          На любом языке с выводом данных в стандартный поток, можно писать веб-приложения как бы
            –1
            Материал полезен, но вот мотивация ужасная.
            Помимо этого, я наблюдал как многие вебпрограммисты склоняются в своей работе к каким-то стереотипным решениям, что можно было бы назвать «PHP головного мозга».

            Это могли бы назвать таким образом только идиоты. (Да и вообще эта фраза в целом чаще всего произносится только ими.)

            Инструмент выбирается под всю задачу (начиная от того кто будет разрабатывать, и включая то на чём это будет работать) и если РНР подходит, то срать хотелось бы на то что кому-то это не нравится.

            Если задача решается в 3 строчки на РНР, или на 100500-строк какого нибудь Брейнфака и ещё требует настройки сервера и при этом не даёт никаких преимуществ недостижимых но требуемых, то (в энтерпрайз) она должна решаться на РНР. И чем стереотипнее решение, тем лучше.

            Для иллюстрации в учебнике да, хоть Брейнфак юзайте.
              0
              вот оно как!
              • UFO just landed and posted this here
              • UFO just landed and posted this here
                • UFO just landed and posted this here
                  +1
                  Автор статьи прав. Мы, PHP-оиды, живем с шорами на глазах. Как именно оно там работает и что происходит — хз.
                  Создаем виртуальный хост, index.php — в корень. И поехали.

                  А тут предложена реализация, годная и для production в том числе.

                  PHP не предназначен для построения графиков функций. MathCad (octava) — предназначен. Почему бы не использовать инструменты по назначению? Потому что программеры не поймут? Так они такими темпами никогда и ничего не поймут и ничему не научатся. Брось PHP-оида в проект на рельсах — и посмотри что получится. Утонет — увольняй. Выплывет — поднимай зарплату и грузи дальше. И будет у тебя под руками не тупой PHP-шник, а нормальный многогранный WEB-программер.
                    +2
                    лол, а с каких пор знание какого-то медленного говноязыка/фреймворка стало признаком качественного программера? Будь я пхпхпхпшником, если бы меня попытались «бросить в рельсы» я покрутил бы пальцем у виска и послал бы нахер и этого человека и эту компанию.
                      0
                      Я не знаю что такое «качественный» программер. Признаками нужного мне программера являются желание и умение учиться новому и понимание как именно работает то, что он написал. Плюс умение обоснованно использовать соответствующие инструменты, в том числе какие-то медленные говноязыки/фреймворки для разных задач.
                        +2
                        нет никаких вразуметельных обоснований, чтобы пользоваться рельсами. Это фреймворк для того, чтобы хипстеры могли выпендриваться. Больше от него ничего ждать не стоит.
                        Максимум — быстро запустить прототип проекта, но и то, что на пистоне, что на пхп это можно сделать с примерно той же скоростью
                        0
                        медленный руби врывается в пост:
                        image
                        • UFO just landed and posted this here
                            0
                            мы уже тесты посмотрели — там переменные по ссылкам передаются и используется ранний 5.2, так что о скорости говорить не стоит
                      • UFO just landed and posted this here
                      –13
                      У вас матлаб лицензионный?
                        –2
                        написано же ШВА-БОД-КА!
                          +8
                          да, GNU GPL. А что, хотите мне Октаву продать?
                          0
                          >Я задался целью написать вебприложение целиком на языке матлаба без использования каких либо обёрток.
                          >fcgiwrapper
                          Цель не выполнена )
                            +1
                            выполнена, я написал CGI-приложение и запускаю его внутри сервера FastCGI
                              0
                              Я скорее к словам придираюсь: «без обёрток» и «fcgi-обёртка».
                                +1
                                понятно. ну в любом случае в итоге сервер nginx запускает не обёртку, которая вызывает матлаб, а сам матлаб (octave в моём случае), а враппер стартует единожды и организует очередь на сокете, поэтому он не прослойка а скорее менеджер
                            +3
                            Вполне true решение подключить матлаб когда необходимо сделать моделирование какого-нибудь сложного процесса в web.
                              +2
                              Отличная статья!
                              Ушел писать сайт на bash.
                                +3
                                А у меня был такой опыт… Попросили сайтик на 3 странички… Отказываться было не красиво, менять то что уже было написано тоже. Разметка в SQL запросах, и обработка строк через sed…
                                Страшное дело… Но сделал и все работало, были только проблемы с кодировкой, так как она зависила от настоек окружения.

                              Only users with full accounts can post comments. Log in, please.