Nginx, CGI · 4 min read · Jan 23, 2026

Обслуживание CGI-скриптов с Nginx на Fedora 18

Обслуживание CGI-скриптов с Nginx на Fedora 18

Версия 1.0
Автор: Фалко Тимме
Следите за мной в Twitter

Это руководство показывает, как вы можете обслуживать CGI-скрипты (скрипты Perl) с помощью nginx на Fedora 18. Хотя nginx сам по себе не обслуживает CGI, есть несколько способов обойти это. Я опишу два решения: первое - это проксирование запросов на CGI-скрипты к Thttpd, небольшому веб-серверу, который поддерживает CGI, в то время как второе решение использует обертку CGI для обслуживания CGI-скриптов.

Я не даю никаких гарантий, что это сработает для вас!

1 Предварительная заметка

Я использую сайт www.example.com с корнем документа /var/www/www.example.com/web/; конфигурация vhost находится в /etc/nginx/conf.d/www.example.com.vhost.

2 Использование Thttpd

В этой главе я собираюсь описать, как настроить nginx для проксирования запросов на CGI-скрипты (расширения .cgi или .pl) к Thttpd. Я настрою Thttpd для работы на порту 8000.

Сначала мы устанавливаем Thttpd. Существует пакет Thttpd для Fedora 18, но страница nginx ThttpdCGI говорит, что Thttpd должен быть запатчен - поэтому мы загружаем пакет src.rpm для Fedora 18, патчим его и создаем новый rpm-пакет из него.

Нам нужно установить инструменты, необходимые для сборки нового rpm-пакета:

yum groupinstall 'Development Tools'

Установите yum-utils (пакет содержит инструмент yumdownloader, который позволяет нам загружать src.rpm):

yum install yum-utils

Затем мы загружаем пакет Thttpd src.rpm для Fedora 18:

cd /usr/src  
yumdownloader --source thttpd
ls -l
[root@server1 src]# ls -l  
total 164  
drwxr-xr-x. 2 root root   4096 Feb  3  2012 debug  
drwxr-xr-x. 3 root root   4096 Jun  4 18:21 kernels  
-rw-r--r--  1 root root 155690 Mar 28 03:21 thttpd-2.25b-28.fc18.src.rpm  
[root@server1 src]#
rpm -ivh thttpd-2.25b-28.fc18.src.rpm

Вы можете игнорировать следующие предупреждения:

[root@server1 src]# rpm -ivh thttpd-2.25b-28.fc18.src.rpm  
   1:thttpd             warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
########################################### [100%]  
[root@server1 src]#

Теперь мы загружаем патч в каталог /root/rpmbuild/SOURCES/ и соответственно изменяем файл /root/rpmbuild/SPECS/thttpd.spec:

cd /root/rpmbuild/SOURCES/  
wget -O thttpd-2.25b-ipreal.patch http://www.danielclemente.com/amarok/ip_real.txt  
cd /root/rpmbuild/SPECS/  
vi thttpd.spec

Добавьте строки Patch3: thttpd-2.25b-ipreal.patch и %patch3 -p1 -b .ipreal:

| [...] Patch0: thttpd-2.25b-CVE-2005-3124.patch Patch1: thttpd-2.25b-fixes.patch Patch2: thttpd-2.25b-getline.patch Patch3: thttpd-2.25b-ipreal.patch [...] %prep %setup -q %patch0 -p1 -b .CVE-2005-3124 %patch1 -p1 -b .fixes %patch2 -p1 -b .getline %patch3 -p1 -b .ipreal [...] |

Теперь мы собираем наш rpm-пакет Thttpd следующим образом:

rpmbuild -ba thttpd.spec

Наш rpm-пакет Thttpd создается в /root/rpmbuild/RPMS/x86_64 (/root/rpmbuild/RPMS/i386, если вы находитесь на системе i386), поэтому мы переходим туда:

cd /root/rpmbuild/RPMS/x86_64  
ls -l
[root@server1 x86_64]# ls -l  
total 224  
-rw-r--r-- 1 root root  69881 Sep  3 23:17 thttpd-2.25b-28.fc18.x86_64.rpm  
-rw-r--r-- 1 root root 151685 Sep  3 23:17 thttpd-debuginfo-2.25b-28.fc18.x86_64.rpm  
[root@server1 x86_64]#

Установите пакет Thttpd следующим образом:

rpm -ivh thttpd-2.25b-28.fc18.x86_64.rpm

Затем мы создаем резервную копию оригинального файла /etc/thttpd.conf и создаем новый следующим образом:

mv /etc/thttpd.conf /etc/thttpd.conf_orig  
vi /etc/thttpd.conf

| # ОСТОРОЖНО: Пустые строки не допускаются! # Этот раздел переопределяет значения по умолчанию # Этот раздел _документирует_ значения по умолчанию # port=80 # nosymlink # по умолчанию = !chroot # novhost # nocgipat # nothrottles # host=0.0.0.0 # charset=iso-8859-1 host=127.0.0.1 port=8000 user=thttpd logfile=/var/log/thttpd.log pidfile=/var/run/thttpd.pid dir=/var/www cgipat=.cgi|.pl |

Это заставит Thttpd слушать на порту 8000 на 127.0.0.1; его корень документа - /var/www.

Создайте системные ссылки для запуска Thttpd…

systemctl enable thttpd.service

… и запустите его:

systemctl start thttpd.service

Далее создайте /etc/nginx/proxy.conf:

vi /etc/nginx/proxy.conf

| proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; |

Теперь откройте файл конфигурации вашего vhost…

vi /etc/nginx/conf.d/www.example.com.vhost

… и добавьте раздел location /cgi-bin {} в контейнер server {}:

| server { [...] location /cgi-bin { include proxy.conf; proxy_pass http://127.0.0.1:8000; } [...] } |

Перезагрузите nginx:

systemctl reload nginx.service

Поскольку корень документа Thttpd - /var/www, location /cgi-bin переводится в каталог /var/www/cgi-bin (это верно для всех ваших vhosts, что означает, что каждый vhost должен размещать свои CGI-скрипты в /var/www/cgi-bin; это недостаток для сред совместного хостинга; решение - использовать обертку CGI, как описано в главе 3, вместо Thttpd).

Создайте каталог…

mkdir /var/www/cgi-bin

… и затем поместите ваши CGI-скрипты в него и сделайте их исполняемыми. Для тестирования я создам небольшой скрипт Hello World на Perl (вместо hello_world.cgi вы также можете использовать расширение .pl -> hello_world.pl):

vi /var/www/cgi-bin/hello_world.cgi

| #!/usr/bin/perl -w # Скажите perl отправить html заголовок. # Так ваш браузер получает вывод # вместо (командной строки # на сервере.) print "Content-type: text/html\n\n"; # напечатайте ваши основные html теги. # и содержимое их. print "Hello World!! \n"; print "

Hello world

\n"; |

chmod 755 /var/www/cgi-bin/hello_world.cgi

Откройте браузер и протестируйте скрипт:

http://www.example.com/cgi-bin/hello_world.cgi

Если все пройдет хорошо, вы должны получить следующий вывод:

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.