• serbinСтремящайся

  • Изменено

Ранее мы рассматривали что такое CGI? Теперь рассмотрим настройки выполнения CGI на примере.
Я буду работать на CentOS Linux, поэтому примеру будут соответствовать этой системе.

Для Debian систем пути к apache будут отличаться + вы сможете воспользоваться командой для активации модуля mod_cgi. В остальном настройка должна совпадать.

Настройка CGI в Apache:

  1. Добавим конфигурацию CGI к конфигу сайта. У меня на ВМ используется default конфигурация в файле /etc/httpd/bx/conf/default.conf. Вы должны использовать конфиг вашего сайта (или добавить в общий cat /etc/httpd/conf/httpd.conf):

            <Directory /home/serbin/www/project_cgi_dir>
                Options +ExecCGI
                AddHandler cgi-script .cgi .py .pl
                AllowOverride None
                Order allow,deny
                allow from all
            </Directory>
    
            ScriptAlias /cgi-bin/ /home/serbin/cgi-bin/
            <Directory /home/serbin/cgi-bin>
                 Options +ExecCGI
                 AddHandler cgi-script .cgi
                 AllowOverride None
                 Order allow,deny
                 Allow from all
            </Directory>

    Первый блок отвечает за директорию CGI скриптов проекта - папка project_cgi_dir в корне сайта
    Второй блок отвечает за общие CGI скрипты. У меня они лежат в директории пользователя /home/serbin/cgi-bin/, часто для них используют /usr/lib/cgi-bin/ директорию.

  2. Активируем модуль CGI для Apache.
    Для начала найдем подключение модуля командой grep

    [root@localhost www]# grep -n "LoadModule" /etc/httpd/conf/httpd.conf
    ...
    68:#LoadModule mem_cache_module modules/mod_mem_cache.so
    69:#LoadModule cgi_module modules/mod_cgi.so

    Видим, что в файле /etc/httpd/conf/httpd.conf на 69 строке закоментировано подключение модуля mod_cgi.so. Раскоментируйте подключение используя любимый редактор и перазагрузите сервис apache:
    sudo systemctl restart httpd

  3. Создадим директории для cgi скриптов:

    mkdir /home/serbin/www/project_cgi_dir && mkdir /home/serbin/cgi-bin
  4. Создадим скрипт на языке Python и дадим ему права на выполнение

    cd /home/serbin/www/project_cgi_dir
    vim python.cgi

    Со следующим содержимым

    [bitrix@localhost project_cgi_dir]$ cat python.cgi
    #!/usr/bin/env python
    
    print "Content-type: text/html\n\n"
    print "<html>\n<body>"
    print "<div style=\"width: 100%; font-size: 40px; font-weight: bold; text-align: center;\">"
    print "Hello from Python Script"
    print "</div>\n</body>\n</html>"

    дадим скрипту права на выполнение

    sudo chmod 775 /home/bitrix/www/project_cgi_dir/python.cgi

    Протестируем в браузере:

  5. Создадим скрипт на языке PERL

    cd /home/serbin/www/project_cgi_dir
    vim perl.cgi
    #!/usr/bin/perl
    print "Content-type: text/html\n\n"; 
    print "<h1>Hello from PERL programming language</h1>";
    sudo chmod 775 /home/bitrix/www/project_cgi_dir/perl.cgi

  6. Давайте напишем библиотеку, хоть и очень простую, на языке С для расширения умений и кругозора. То что мы делали до этого было на интерпретируемых языках, но мы знаем что многие библиотеки ради быстродействия пишутся на компилируемых языках - в частности на С и С++.
    На этот раз поработаем в нашей общей папке cgi скриптов

    cd /home/serbin/cgi-bin/
    vim c-hello.c

    Вставим в файл следующий код

    #include <stdio.h>
    int main(void) {
      printf("Content-type: text/html\n");
      // Пустой заголовок
      printf("\n");
      printf("<h2>Hello from C language</h2>");
      return 0;
    }

    Скомпилируем скрипт

    gcc c-hello.c -o 'c-hello.cgi'

    Если на вашей машине отсутствует компилятор gcc установите используя пакетный менеджер.
    Дадим права файлу на выполнение

    sudo chmod 775 /home/serbin/cgi-bin/c-hello.cgi

    И наконец проверим в браузере

Готово теперь наш веб-сервер обрабатывает запросы при помощи скриптов написанных на разных языках программирования!

А как передать данные в CGI скрипт мы рассмотрели в статье Создаем CGI на C с параметрами.

serbin добавил(а) CGI тег .