Fastcgi on nginx » History » Version 15
  Andy Z, 10/21/2013 07:23 PM 
  
| 1 | 13 | Peter Mortensen | h1. FastCGI on nginx  | 
|---|---|---|---|
| 2 | 1 | Pieter Libin | |
| 3 | {{toc}} | 
||
| 4 | |||
| 5 | |||
| 6 | h3. About nginx  | 
||
| 7 | |||
| 8 | 3 | Koen Deforche | On paper, nginx is an excellent choice for use as a reverse proxy (together with wthttpd), or for deploying Wt applications using FastCGI, especially if you are using server-initiated updates (server push).  | 
| 9 | 1 | Pieter Libin | |
| 10 | 13 | Peter Mortensen | The reason is that nginx, like wthttpd, is completely based on asynchronous I/O, and therefore scales easily to many open connections (unlike other web servers such as Apache, lighttpd, etc.). Server-initiated updates use an open connection for every web client.  | 
| 11 | 1 | Pieter Libin | |
| 12 | We have tested nginx succesfully for both its use as a reverse proxy or for FastCGI deployment of Wt applications. Its FastCGI implementation is a bit clumsy, but newer versions of nginx (>= 0.7.31) than the version currently available in ubuntu should improve on that.  | 
||
| 13 | |||
| 14 | |||
| 15 | 13 | Peter Mortensen | h3. Ubuntu configuration  | 
| 16 | 1 | Pieter Libin | |
| 17 | * Installing nginx and spawn-fcgi (which comes with lighttpd):  | 
||
| 18 | |||
| 19 | <pre>  | 
||
| 20 | $ sudo apt-get install nginx lighttpd  | 
||
| 21 | </pre>  | 
||
| 22 | |||
| 23 | * Start your application (linked against wtfcgi) using spawn-fcgi. Spawn-fcgi wraps the FastCGI application to listen to a socket or network connection.  | 
||
| 24 | |||
| 25 | <pre>  | 
||
| 26 | $ spawn-fcgi -n -f ../../build/examples/hello/hello.wt -a 0.0.0.0 -p 9091  | 
||
| 27 | </pre>  | 
||
| 28 | |||
| 29 | 13 | Peter Mortensen | * Edit your nginx configuration to redirect a particular URL to your application (replace all occurences of /hello.wt with the path for your application!):  | 
| 30 | 1 | Pieter Libin | |
| 31 | <pre>  | 
||
| 32 |         location /hello.wt { | 
||
| 33 | fastcgi_pass 127.0.0.1:9091;  | 
||
| 34 | |||
| 35 | fastcgi_param QUERY_STRING $query_string;  | 
||
| 36 | fastcgi_param REQUEST_METHOD $request_method;  | 
||
| 37 | fastcgi_param CONTENT_TYPE $content_type;  | 
||
| 38 | fastcgi_param CONTENT_LENGTH $content_length;  | 
||
| 39 | |||
| 40 |                 if ($document_uri ~ "^/hello.wt/(.*)") { | 
||
| 41 | set $apache_path_info /$1;  | 
||
| 42 | }  | 
||
| 43 | |||
| 44 | fastcgi_param SCRIPT_NAME /hello.wt;  | 
||
| 45 | fastcgi_param PATH_INFO $apache_path_info;  | 
||
| 46 | fastcgi_param REQUEST_URI $request_uri;  | 
||
| 47 | fastcgi_param DOCUMENT_URI $document_uri;  | 
||
| 48 | fastcgi_param DOCUMENT_ROOT $document_root;  | 
||
| 49 | fastcgi_param SERVER_PROTOCOL $server_protocol;  | 
||
| 50 | |||
| 51 | fastcgi_param GATEWAY_INTERFACE CGI/1.1;  | 
||
| 52 | fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;  | 
||
| 53 | |||
| 54 | fastcgi_param REMOTE_ADDR $remote_addr;  | 
||
| 55 | fastcgi_param REMOTE_PORT $remote_port;  | 
||
| 56 | fastcgi_param SERVER_ADDR $server_addr;  | 
||
| 57 | fastcgi_param SERVER_PORT $server_port;  | 
||
| 58 | fastcgi_param SERVER_NAME $server_name;  | 
||
| 59 | }  | 
||
| 60 | </pre>  | 
||
| 61 | |||
| 62 | 15 | Andy Z | * Alternatively to avoid 'if' in declaration just indicate the root of your application:  | 
| 63 | <pre>  | 
||
| 64 |         location ~ ^/hello.wt(?<path_info>/.*|$) { | 
||
| 65 | fastcgi_pass 127.0.0.1:9000;  | 
||
| 66 | fastcgi_param SCRIPT_NAME /hello.wt;  | 
||
| 67 | fastcgi_param PATH_INFO $path_info;  | 
||
| 68 | include fastcgi_params.conf;  | 
||
| 69 | }  | 
||
| 70 | </pre>  | 
||
| 71 | |||
| 72 | 3 | Koen Deforche | * Reload (or restart) your nginx server and you are ready to go:  | 
| 73 | 1 | Pieter Libin | |
| 74 | $ sudo /etc/init.d/nginx restart  |