CGI скрипты с Nginx в Fedora 15

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

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

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

Предварительные замечания

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

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

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

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

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

  • yum groupinstall 'Development Tools'

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

  • yum install yum-utils

Далее мы скачать Thttpd src.rpm пакет для Fedora 15:

  • cd /usr/src
  • yumdownloader --source thttpd
  • ls -l
[root@server1 src]# ls -l
total 160
drwxr-xr-x. 2 root root   4096 May 18 13:33 debug
drwxr-xr-x. 3 root root   4096 May 25 16:00 kernels
-rw-r--r--  1 root root 155581 Feb 12  2011 thttpd-2.25b-24.fc15.src.rpm
[root@server1 src]#
  • rpm -ivh thttpd-2.25b-24.fc15.src.rpm

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

[root@server1 src]# rpm -ivh thttpd-2.25b-24.fc15.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
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
[...]
% Приготовительный
Установка%-д
% Patch0-p1-б. CVE-2005-3124
% Patch1-p1-б. Исправлений
% Patch2-p1-б. GetLine
% Patch3-p1-б. Ipreal
[...]

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

  • rpmbuild -ba thttpd.spec

Наш Thttpd rpm пакет будет создан в /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 196
-rw-r--r-- 1 root root  68909 Oct  5 17:16 thttpd-2.25b-24.fc15.x86_64.rpm
-rw-r--r-- 1 root root 129701 Oct  5 17:16 thttpd-debuginfo-2.25b-24.fc15.x86_64.rpm
[root@server1 x86_64]#

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

  • rpm -ivh thttpd-2.25b-24.fc15.x86_64.rpm

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

  • mv /etc/thttpd.conf /etc/thttpd.conf_orig
  • nano /etc/thttpd.conf
# BEWARE : No empty lines are allowed!
# This section overrides defaults
# This section _documents_ defaults in effect
# port=80
# nosymlink         # default = !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 ...

  • chkconfig --levels 235 thttpd on

... и запустить его:

  • /etc/init.d/thttpd start

Затем создайте /etc/nginx/proxy.conf :

  • nano /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;

Теперь откройте Dаш виртуальный хост файл конфигурации ...

  • nano /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:

  • /etc/init.d/nginx reload

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

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

  • mkdir /var/www/cgi-bin

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

  • nano /var/www/cgi-bin/hello_world.cgi
#!/usr/bin/perl -w
   # Tell perl to send a html header.
   # So your browser gets the output
   # rather then <stdout>(command line
   # on the server.)
   print "Content-type: text/html\n\n";
   # print your basic html tags.
   # and the content of them.
   print "<html><head><title>Hello World!! </title></head>\n";
   print "<body><h1>Hello world</h1></body></html>\n";
  • chmod 755 /var/www/cgi-bin/hello_world.cgi

Откройте в браузере и проверьте работу скрипта http://www.example.com/cgi-bin/hello_world.cgi, если все пойдет хорошо, вы должны получить страницу с набписью Hello World.


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

Fcgiwrap является CGI-оболочку, которая может быть использована для виртуального хостинга среды, поскольку она позволяет каждому виртуальный хост использовать свои собственные CGI-BIN директории.

Так как нет fcgiwrap пакет для Fedora, мы должны собрать его сами. Сначала установить некоторые предпосылки:

  • yum groupinstall 'Development Tools'
  • yum install fcgi-devel

Теперь мы можем построить fcgiwrap следующим образом:

  • cd /usr/local/src/
  • git clone git://github.com/gnosek/fcgiwrap.git
  • cd fcgiwrap
  • autoreconf -i
  • ./configure
  • make
  • make install

Это установит fcgiwrap к /usr/local/sbin/fcgiwrap.

  • yum install spawn-fcgi

Открытый /etc/sysconfig/spawn-fcgi ...

  • nano /etc/sysconfig/spawn-fcgi

... и изменить файл следующим образом:

# You must set some working options before the "spawn-fcgi" service will work.
# If SOCKET points to a file, then this file is cleaned up by the init script.
#
# See spawn-fcgi(1) for all possible options.
#
# Example :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"

FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

Создать автозапуск для икры-FCGI ...

  • chkconfig --levels 235 spawn-fcgi on

... и запустим его следующим образом:

  • /etc/init.d/spawn-fcgi start

Теперь вы должны найти fcgiwrap сокет в /var/run/fcgiwrap.socket, принадлежащий пользователю и группе Nginx.

Теперь откройте ваш виртуальный хост файл конфигурации ...

  • nano /etc/nginx/conf.d/www.example.com.vhost

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

server {
[...]
   location /cgi-bin/ {
     # Disable gzip (it makes scripts feel slower since they have to complete
     # before getting gzipped)
     gzip off;

     # Set the root to /usr/lib (inside this location this means that we are
     # giving access to the files under /usr/lib/cgi-bin)
     root  /var/www/www.example.com;

     # Fastcgi socket
     fastcgi_pass  unix:/var/run/fcgiwrap.socket;

     # Fastcgi parameters, include the standard ones
     include /etc/nginx/fastcgi_params;

     # Adjust non standard parameters (SCRIPT_FILENAME)
     fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   }
[...]
}

Перезагрузить Nginx:

  • /etc/init.d/nginx reload

Далее мы создаем наши cgi-bin директория - /var/www/www.example.com/cgi-bin, поскольку мы определили root /var/www/www.example.com; в location /cgi-bin {} контейнере:

  • mkdir /var/www/www.example.com/cgi-bin

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

  • nano /var/www/www.example.com/cgi-bin/hello_world.cgi
#!/usr/bin/perl -w
   # Tell perl to send a html header.
   # So your browser gets the output
   # rather then <stdout>(command line
   # on the server.)
   print "Content-type: text/html\n\n";
   # print your basic html tags.
   # and the content of them.
   print "<html><head><title>Hello World!! </title></head>\n";
   print "<body><h1>Hello world</h1></body></html>\n";
  • chmod 755 /var/www/www.example.com/cgi-bin/hello_world.cgi

Откройте в браузере и проверьте работу скрипта: http://www.example.com/cgi-bin/hello_world.cgi.