Webサーバーnginx + fastcgi-wrapper + matlab

今日私が考えたのはこれが初めてではありません。どのプログラミング言語がWebに適しているか、一見するとこれに適さないような狭い問題を解決することは理にかなっていますか? 普通ではないことを普通とは違うやり方で練習したかった。









何のために?



私の目標は、ラッパーを使用せずに完全にmatlab言語でWebアプリケーションを作成することでした。 なぜこれを始めたのですか? いくつかの理由があります。 それはただ面白いように思えました。 さらに、自分の仕事に携わっているWebプログラマーが、「PHPブレイン」と呼ばれるステレオタイプのソリューションに傾倒しているのを見ました。 これは決してphpプログラマーへの非難で述べられているわけではありません。単にそのような現象があり、私のメモは誰かの例になると思います。



どうやって?



この言語のインタープリターとして、Linuxに無料で簡単にアクセスできるため、GNU Octaveを選びました。 nginxをWebサーバーとして選択した理由は、それを頻繁に使用するためであり、非常に便利です。 CGIアプリケーションとしてmatlabで動作するスクリプトを取得する必要がありました。 Unixにはこのための簡単な機会があります-テキストファイルの先頭で、インタープリターのパスとパラメーターを指定できます。ファイルに実行可能性属性がある場合、このインタープリターを使用して起動および実行できます。 それ自体では、nginxは単純なCGIの実行方法を知らず、ここからのラッパーの例は役に立たなかった。 Webサーバーの作成者にそれほど近くない別のソースでは、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/



読む:





All Articles