---
title: "Introduction to FastCGI"
subtitle: "Group 10"
author: "Andrew Fuller"
---
### In the beginning
One app, one web server
apache.c:
```
if (page == "/loginform.html") {
sendfile("templates/loginform.html");
} else if (page == "/profile.html") {
printf("Status: 200 OK\r\n");
printf("Content-type: text/html\r\n");
printf("\r\n");
printf("<h1>Hello %s</h1>", user);
```
### CGI
Generate responses with an external process
Web server does:
```
$ export REQUEST_URI="/loginform.asp"
$ ./mycgi.exe
Status: 200 OK
Content-Type: text/html
<h1>Please login</h1>
<form action="/dologin">
..
```
### CGI
Requests are passed through envp and stdin
```
int main(int argc, char **argv, char **envp){
int len = atoi(getenv("CONTENT_LENGTH"));
char *req = malloc(len);
read(STDIN_FILENO, len, req);
{'u','s','e','r','=','m','i','k','e','6','9','&'
'p','a','s','s','=','t','h','r','i','l','l','7'}
```
### CGI
HTTP GET query string
```
char *query = getenv("QUERY_STR");
```
Which page was requested?
```
char *uri = getenv("REQUEST_URI");
```
HTTP POST vars? File uploads?
```
fread(buf, count, 1, stdin);
```
### CGI
Decouples web server from web app
No more embedded:
- mod_php
- mod_python
- mod_ruby
- mod_rack / phusion
### CGI
Spawn a new process for each request?
```
$ export REQUEST_URI="/loginform.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/login.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/profile.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/deleteprofile.asp"
$ ./mycgi.exe
$ export REQUEST_URI="/redirect.asp"
$ ./mycgi.exe
```
### FastCGI
Advantages:
- Fast
### FastCGI
Fast:
```
$ ./myfcgi.exe
Listening on 127.0.0.1:1337
```
### FastCGI
For each request, web server:
- Connects to fastcgi app
- Sends the request variables
- Reads the reply, forwards it to client
### FastCGI
```
127.0.0.1:1337
```
or
```
/tmp/myapp.sock
```
or
```
192.168.1.{90,91,92}:1337
```
### Terminal App
[Terminal](
http://cmpt470.csil.sfu.ca:9010/terminal.html)
### Problems with FastCGI
![](photos/jerrychenme.png)
### Alternatives to FastCGI
SCGI - Simple Common Gateway Interface
WSGI - Web Server Gateway Interface
PSGI - Perl Server Gateway Interface
ISAPI - Internet Server Application Programming Interface
### SCGI
Simple
### SCGI
Simple protocol
New (2006)
Not widely used
### WSGI
Web Server Gateway Interface
Made for Python
They don't care about everyone else
### PSGI
Perl Server Gateway Interface
Made for Perl
They don't care about everyone else
### ISAPI
Internet Server API
Made by Microsoft
They don't care about everyone else
Uses DLLs and OS services, much tighter coupling
### FastCGI Support
Every major webserver can forward requests over FastCGI
Every major language can respond to FastCGI requests
### Q&A
Any questions?