# Common Gateway Interface

## CGI 환경 변수

- CONTENT_TYPE

- CONTENT_LENGTH

- DOCUMENT_ROOT

- HTTP_ACCEPT

- HTTP_COOKIE

- HTTP_REFERER

- HTTP_USER_AGENT

- PATH_INFO

- QUERY_STRING

- REMOTE_ADDR

- REMOTE_HOST

- REQUEST_METHOD

- SCRIPT_FILENAME

- SCRIPT_NAME

- SERVER_NAME

- SERVER_PORT

- SERVER_SOFTWARE


```perl
my $buffer;
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
   $buffer = $ENV{'QUERY_STRING'};

} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

}

print "$ENV{SERVER_PROTOCOL} 200 OK\r\n";
print "Content-type:text/plain\r\n";
print "\r\n";
print "Hello\n";
```

## CGI

```bash
sudo cpanm CGI
```

```perl
#!/usr/bin/perl
use warnings;
use strict;

use CGI;

my $query = CGI->new;

$bday = $query->param("birthday"); 
print $query->header(); 
print $query->p("Your birthday is $bday.");
```

- keywords

- http

- param

- append

- import_names

- delete

- delete_all

- save

- url

- header

- redirect

- cookie

- dump


```perl
use CGI qw/ :cgi -utf8 /;

$CGI::DISABLE_UPLOADS = 1; 
$CGI::POST_MAX = 102_400; # 100 KB 

print $cgi->header('text/html','204 No response');

my @keywords = $query->keywords;
my @names = $query->param;
my $value = $query->param('name');

print $query->redirect('https://example.com');
print $query->redirect(
    -uri => 'https://example.com',
    -status => '301 Moved Permanently'
);
```

POST로 전송된 데이터를 직접 처리해야 하는 경우에는 다음과 같이 데이터를 가져올 수 있습니다.

```perl
my $data = $query->param('POSTDATA');
my $data = $query->param('PUTDATA');
```

업로드된 파일은 다음과 같이 처리합니다.

```perl
my $file_handle = $query->upload('uploaded_file');
```

## NGINX와 함께 CGI 사용하기

[FCGI Wrap | NGINX](https://www.nginx.com/resources/wiki/start/topics/examples/fcgiwrap/)

```bash
sudo apt install fcgiwrap spawn-fcgi
cp /usr/share/doc/fcgiwrap/examples/nginx.conf /etc/nginx/fcgiwrap.conf
```

설정 파일에서 필요한 부분은 수정합니다.

```nginx
server {   
    listen 80;
    index index.html;
    root /var/www;
    ignore_invalid_headers on;
    include /etc/nginx/fcgiwrap.conf;
    location /cgi-bin {
        gzip off;
        fastcgi_param SERVER_NAME $http_host;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/fcgiwrap.socket;        
    } 
}
```