📜 ⬆️ ⬇️

Webserver nginx + fastcgi-wrapper + matlab

Today I wondered not for the first time: what programming languages ​​are suitable for the web, and does it make sense to solve some narrow problem in a way that at first glance doesn’t fit? I wanted to practice doing something ordinary in an unusual way.



For what?


I set out to write a web application entirely in matlab without using any wrappers. Why did I start to do this? There are several reasons. I thought it was just funny. In addition, I watched how many web programmers are inclined in their work to some kind of stereotypical solutions that could be called "PHP brain". This is by no means a reproach to php programmers, there is just such a phenomenon and I think my note will be an example to someone.

How?


As the interpreter of this language, I chose GNU Octave because of its free and easy access on Linux. I chose nginx as a web server for the reason that I work a lot with it and it’s just very convenient for me. I needed to make the script work at the lab as a CGI application. For Unixes, there is a simple possibility for this - at the beginning of a text file, you can specify the path and parameters of the interpreter, and if the file has an executable attribute, it can be run and will be executed by this interpreter. Nginx by itself does not know how to perform simple CGI and the examples of wrappers from here have NOT helped me. In another source , not so close to the creators of the web server, it was suggested to use fcgiwrapper for nginx, which is even included in my debian distribution.

What happened?


Fragment of the final nginx configuration:
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; } 

Script code for 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 

')

What happened?


For example, here: http://m.leprodc.ru/

Read:

Source: https://habr.com/ru/post/138984/


All Articles