Этот урок показывает, как можно использовать 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-utils (yum-утилиты) (пакет содержит yumdownloader инструмент, который позволяет скачать src.rpm ):
|
Далее мы скачать Thttpd src.rpm пакет для Fedora 15:
|
[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]#
|
Вы можете игнорировать следующие предупреждения:
[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 файла соответственно:
|
Добавить строку 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 пакеты следующим образом:
|
Наш Thttpd rpm пакет будет создан в /root/rpmbuild/RPMS/x86_64 ( /root/rpmbuild/RPMS/i386 если вы находитесь в i386 система), идем далее:
|
[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 пакет следующим образом:
|
Затем мы делаем резервную копию оригинала /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 ...
|
... и запустить его:
|
Затем создайте /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аш виртуальный хост файл конфигурации ...
|
... и добавьте location /cgi-bin {} раздел в server {} контейнер:
server { [...] location /cgi-bin { include proxy.conf; proxy_pass http://127.0.0.1:8000; } [...] }
Перезагрузить Nginx:
|
Поскольку корнем Thttpd является /var/www , location /cgi-bin переводится в каталог /var/www/cgi-bin (это верно для всех ваших виртуальных доменов, что означает, что каждый виртуальный хост должен распологать свои CGI-скрипты в /var/www/cgi-bin; это недостаток для виртуального хостинга; решением которого является использование CGI-оболочка).
Создайте каталог ...
|
... , а затем разместить CGI-скрипты в нем и сделайте их исполняемыми. Для тестирования я создам небольшой Hello World Perl скрипт (вместо hello_world.cgi вы также можете использовать расширение .pl -> hello_world.pl ):
|
#!/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";
|
Откройте в браузере и проверьте работу скрипта http://www.example.com/cgi-bin/hello_world.cgi, если все пойдет хорошо, вы должны получить страницу с набписью Hello World.
Использование Fcgiwrap
Fcgiwrap является CGI-оболочку, которая может быть использована для виртуального хостинга среды, поскольку она позволяет каждому виртуальный хост использовать свои собственные CGI-BIN директории.
Так как нет fcgiwrap пакет для Fedora, мы должны собрать его сами. Сначала установить некоторые предпосылки:
|
Теперь мы можем построить fcgiwrap следующим образом:
|
Это установит fcgiwrap к /usr/local/sbin/fcgiwrap.
|
Открытый /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 ...
|
... и запустим его следующим образом:
|
Теперь вы должны найти fcgiwrap сокет в /var/run/fcgiwrap.socket, принадлежащий пользователю и группе Nginx.
Теперь откройте ваш виртуальный хост файл конфигурации ...
|
... и добавьте 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:
|
Далее мы создаем наши cgi-bin директория - /var/www/www.example.com/cgi-bin, поскольку мы определили root /var/www/www.example.com; в location /cgi-bin {} контейнере:
|
Теперь мы размещаем наши CGI-скрипты в нем и сделайте их исполняемыми. Для тестирования я создам небольшой Hello World Perl скрипт (вместо hello_world.cgi вы также можете использовать расширение .pl -> hello_world.pl ):
|
#!/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";
|
Откройте в браузере и проверьте работу скрипта: http://www.example.com/cgi-bin/hello_world.cgi.