Блог экспериментатора инженера-разработчика: Infanty.
Я пишу how-to статьи на редкие темы или статьи обзоры - для себя и тех кто со мной работает.
Блог существует при поддержке: "Оккупационных сил Марса".

На одном из серверов, где в качестве веб-сервера установлен: nginx, понадобилось запустить FastCGI. Можно было бы установить fcgiwrap или spawn-fcgi. Но было решено кэшировать запросы на nginx, при необходимости проксировать их на Apache, а уже он "из коробки" умеет работать с FastCGI. Таким образом Apache выступает в качестве сервера приложений, а не просто веб-сервера. К тому же в последних версиях веб-сервера Apache - проведена серьёзная работа по оптимизации его работы.

В Apache 2.4 реализована поддержка асинхронных операций чтения и записи, что позволяет ему при выключении директивы AllowOverride в некоторых тестах работать быстрее чем nginx (при настройке связки Apache с mod_php). А модуль Event MPM (основан на коде модуля Worker), реализующий гибридную модель обработки соединений для Apache 2.4 (сочетающую многопоточность с пулом ожидающих соединения процессов) - помогает оптимально распараллеливать запросы.

Кроме того в Apache всегда можно ограничить: размер памяти, CPU и одновременное количество запущенных пользовательских скриптов. Например: ограничим размер памяти 64 Мб на один скрипт, процессорное время 45 сек, а одновременное количество запущенных пользовательских скриптов количеством не более 60, для этого добавим в нужный VirtualHost следующие строки:

RLimitMEM   64000000 64000000
RLimitCPU   10       45
RLimitNPROC 60       60 

Перед настройкой запуска CGI и FastCGI - устаним и настроим nginx и Apache: на основе статьи из данного блога.

После чего настроим mod_cgi в Apache для запуска CGI, набрав в консоли:

sudo a2enmod cgi 
sudo service apache2 restart 

Осталось разместить файлы CGI в директории /var/www/cgi/ и настроить VirtualHost для доступа к ним по URL: http://www.example.com/cgi-bin/test.cgi.

 <VirtualHost *> 
  ServerName www.example.com
  ServerAlias *.example.com example.com

  DocumentRoot /var/www/example.com/

  ErrorLog /var/log/apache2/example.com_errors.log
  CustomLog /var/log/apache2/example.com_custom.log combined
  
  # Предоставляем доступ к папке с серверными скриптами, 
  # находящейся вне корневого каталога сервера.
  ScriptAlias /cgi-bin/ /var/www/cgi/
  
  <Directory "/var/www/cgi">
    # Блокируем использование файла .htaccess в данной папке.
    AllowOverride None
	
	# Разрешаем выполнение сценариев CGI.
	# Запрещаем MultiViews (так как мы хотим получать 404, если файла нет).
	# Разрешаем следовать по символическим ссылкам только если владелец 
	# файла или директории, на которую указывает эта ссылка совпадает с 
	# владельцем указанной директории.
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
	
	# Порядок проверки доступов к директории (разрешения / запреты на доступ).
    Order allow,deny
	# Доступ разрешён всем.
    Allow from all
  </Directory>
</VirtualHost> 

После этого, устанавливаем mod_fastcgi в Apache для работы с FastCGI, набрав в консоли:

sudo apt-get install libapache2-mod-fastcgi
sudo a2enmod fastcgi  

Важно помнить:

  • Необходимо указывать идентичный порт как в самом приложении FCGI, так и в настройках Apache.
  • Если FCGI создано как внешнее приложение (external FCGI), то его необходимо запускать перед обращением к нему используя Apache.
  • В данном случае использован mod_fastcgi, так как он поддерживает внешние FCGI (external FCGI) в отличие от mod_fcgid. Что является лучшим решением при разработке и отладке.
  • Приложение FCGI как CGI должно иметь разрешение на исполнение, а не только на доступ.

Осталось разместить файлы FCGI с именем test.fcgi в директории /var/www/fcgi и настроить VirtualHost для доступа к нему по URL: http://www.example.com/test-fcgi (только не забудте перед этим запустить FCGI приложение).

 <VirtualHost *> 
  ServerName www.example.com
  ServerAlias *.example.com example.com
 
  DocumentRoot /var/www/example.com/
 
  ErrorLog /var/log/apache2/example.com_errors.log
  CustomLog /var/log/apache2/example.com_custom.log combined
   
  <IfModule mod_fastcgi.c> 
    # Предоставляем доступ к FCGI находящемся вне корневого каталога сервера.
	# Так как алиас указан для конкретного файла, то директива: Options +ExecCGI - не нужна. 
    ScriptAlias /test-fcgi /var/www/fcgi/test.fcgi
	
	# Настройки обращения к внешнему FCGI.
	# Запускается отдельно, порт в настроках и приложении должен совпадать.
	FastCgiExternalServer "/var/www/fcgi/test.fcgi" -host 127.0.0.1:2015 -idle-timeout 30 -flush
   
    <Directory "/var/www/fcgi">
      # Блокируем использование файла .htaccess в данной папке.
      AllowOverride None
     
      # Порядок проверки доступов к директории (разрешения / запреты на доступ).
      Order allow,deny
      # Доступ разрешён всем.
      Allow from all
    </Directory>
  </IfModule>
</VirtualHost> 

Внешние приложение FCGI (external FCGI) можно запустить и используя только nginx (без Apache). Пример VirtualHost для nginx:

 server {
  listen   80;
  server_name example.com;
  
  access_log /var/log/nginx/example.com.log;
  
  location / {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on;
    fastcgi_pass 127.0.0.1:2015;
  }
  
  location ~* ^.+\.(jpg|jpeg|png|ico|css|js)$ {
    root /var/www/example.com;
  }
}