Apache httpd
Technology integration
Integrace s dalšími technologiemi

Lukáš Bařinka

© 2021

REV 2.10

TOC

Obsah

  1. Per-user web directories
  2. Lab: UserDir
  3. Integration methods
  4. Identity change
  5. Lab: suEXEC
  6. PHP
  7. Lab: PHP
  8. FastCGI
  1. Uživatelské adresáře
  2. Lab: UserDir
  3. Možnosti integrace
  4. Změna identity procesu
  5. Lab: suEXEC
  6. PHP
  7. Lab: PHP
  8. FastCGI

Per-user web directories

Uživatelské adresáře

mod_userdir module

Modul mod_userdir

  • Exports user directories to web as (URL): http://server/~username
  • UserDir directive Default: UserDir public_html
  • Context: server, vrtualhost
  • Values: name | abs._pathname | URL | enabled | disabled
  • Exportuje na web dané adresáře uživatelů serveru pod URL: http://server/~username
  • Direktiva UserDir Default: UserDir public_html
  • Kontext: server, virtualhost
  • Možnosti: název | abs._cesta | URL | enabled | disabled

Setting values

Možnosti nastavení

  • name Directory name to export
  • abs._pathname Absolute pathname to directory containing user directories
    (so it does not need to be part of user's home directory)
  • URL Address (web space) to access users data → redirect
  • enabled [user_list] List of enabled users (all for empty list)
  • disabled [user_list] List of disabled users (all for empty list)
  • název Název adresáře, který se má exportovat
  • abs._cesta Absolutní cesta k adresáři, ve kterém jsou exportované uživatelské adresáře (aby nemusely být součástí domovského adresáře)
  • URL Adresa, pod kterou budou adresáře dostupné → redirect
  • enabled [seznam_uživatelů] seznam uživatelů, pro které bude fungovat (všichni)
  • disabled [seznam_uživatelů] seznam uživatelů, pro které nebude fungovat (všichni)

Configuration and usage examples

Příklady konfigurace a použití

Request to http://www.mycorp.net/~alice/

Požadavek na http://www.mycorp.net/~alice/


									UserDir www
									<Directory /home/*/www>
									  Require all granted
									</Directory>
								

⇨ ~alice/www/


									UserDir /var/www/users
									<Directory /var/www/users>
									  Require all granted
									</Directory>
								

⇨ /var/www/users/alice/


									UserDir http://www.mycorp.net/users
								

⇨ http://www.mycorp.net/users/alice/


									UserDir disabled root sysadm
								

Enables user directories for all users except root and sysadm


									UserDir disabled
									UserDir enabled alice bob
								

Disables user directories for all users but enables them for users alice and bob

LAB: Userdir

UserDir

The goal is to publish user directories. There are basically two ways how to achieve that. The first one is to place public directories into users directories. The second one is to place public directories as subdirectories into common directory outside users home directories. The access to users home directories for web server is needed in the first case.

Cílem je nakonfigurovat publikování uživatelských adresářů. V zásadě jsou 2 možnosti. Buď má každý uživatel ve svém domovském adresáři adresář s daty pro web, nebo existuje jeden společný adresář, ve kterém má každý uživatel svůj podadresář. V prvním případě je potřeba, aby webový server mohl přistupovat do adresáře každého uživatele.

  • Create users public directories for web
  • Export users public directories to web
  • Move users public directories into common directory
  • Vytvořit uživatele v systému a jejich adresáře pro web
  • Vyexportovat uživatelské adresáře
  • Přesunout uživatelské adresáře do společného adresáře
  1. Create www subdirectories inside users home directories, so they can use for its public content
  2. Export those directories to web (for all users)
  3. Allow users directories only for user alice
  4. Create users public directories inside /var/www/users and create links called www for users in their home directories
  1. V domovských adresářích uživatelů vytvořte podadresáře www, kam budou mít možnost ukládat své webové prezentace
  2. Vyexportujte tyto adresáře všech uživatelů na web
  3. Povolte export uživatelských adresářů pouze pro uživatele alice
  4. Vytvořte prostor pro uživatele v adresáři /var/www/users a tento prostor uživatelům zpřístupněte jako podadresář www v jejich domovských adresářích

Integration methods

Možnosti integrace

How to integrate other technologies

Možnosti integrace s dalšími technologiemi

  • Special module + Performance Complexity issues to write module Same identity of processing workers
  • Standard interface communication – CGI + Standard → easy to use + Security – processing workers can have different identity Performance
  • Specializovaný modul + Rychlost Nutnost napsat takový modul Identita procesu obsluhujícího požadavek
  • Komunikace přes std. rozhraní – CGI + Standard → jednoduché použití + Zabezpečení – změna identity obslužného procesu Rychlost

CGI processing

Zpracování CGI

CGI processing scheme

suEXEC

suEXEC motivation

Motivace pro suEXEC

  • Task: To delegate web application configuration to system users (e.g. customers), and separate each application/instances
  • Problem: Common processing worker identity E.g. different application needs to upload files, permission settings on filesystem, quotas, …
  • Solution: Identity change for working process
  • SuExec mod_suexec [apache 2.2+] wrapper (setUID!)
  • Úkol: Delegovat správu webových aplikací na uživatele systému (např. zákazníka), resp. vzájemně oddělit jednotlivé aplikace/instance
  • Problém: Identita obslužného procesu Např. upload souborů pro různé aplikace, nastavení oprávnění na filesystému, dodržování kvót atd.
  • Řešení: Změna identity procesu obsluhujícího požadavek
  • SuExec mod_suexec [apache 2.2+] wrapper (setUID!)

suEXEC Processing

Princip suEXEC

Suexec execution scheme
  1. Request for resource (CGI/SSI program) Using mod_cgi or mod_cgid
  2. Wrapper execution
    • Security checks
    • Identity change
  3. CGI/SSI execution with proper identity
  1. Požadavek na zdroj, kterým je CGI/SSI program Pomocí mod_cgi nebo mod_cgid
  2. Spuštění wrapperu
    • Kontrola zabezpečení
    • Změna identity
  3. Vykonání CGI/SSI programu s požadovanou identitou

suEXEC installation

Instalace suEXEC

The most of parameters is hard-coded from compilation: ./configure

Většina parametrů se určuje při kompilaci: ./configure

  • --enable-suexec enables suEXEC compilation and installation
  • --with-suexec-bin=PATH path to wrapper
  • --with-suexec-caller=UID server identity
  • --with-suexec-userdir=DIR UserDir
  • --with-suexec-docroot=DIR DocumentRoot
  • --with-suexec-uidmin=UID
  • --with-suexec-gidmin=GID
  • --with-suexec-logfile=FILE log file pathname
  • --with-suexec-safepath=PATH safe content for PATH variable
  • --enable-suexec povolí kompilaci a instalaci suEXEC
  • --with-suexec-bin=PATH cesta k wrapperu
  • --with-suexec-caller=UID identita webserveru
  • --with-suexec-userdir=DIR UserDir
  • --with-suexec-docroot=DIR DocumentRoot
  • --with-suexec-uidmin=UID
  • --with-suexec-gidmin=GID
  • --with-suexec-logfile=FILE cesta k log souboru
  • --with-suexec-safepath=PATH bezpečná PATH

suEXEC wrapper

  • SetUID program → security risk Security checks needed
  • Permissions:
    • Ownser: root
    • Group: webserver → apache
    • Pemissions: 4710
    
    									ls -la suexec
    									-rws--x--- 1 root apache ... suexec
    								
  • SetUID program → potenciální riziko Kontrola zabezpečení
  • Oprávnění:
    • Vlastník: root
    • Skupina: webserver → apache
    • Práva: 4710
    
    									ls -la suexec
    									-rws--x--- 1 root apache ... suexec
    								

							# Debian installation
							apt install apache2-suexec-pristine
						

							# instalace v Debianu
							apt install apache2-suexec-pristine
						

suEXEC usage

Způsob použití

  • Virtualhost / main server SuexecUserGroup directive
    • Sets user and group names Identity for processes running CGI programs
    • Context: server, virtualhost
    
    									SuexecUserGroup User Group
    								
  • User directories No need to any additional configuration
  • suEXEC presence/enabled check – error_log
    
    									[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)
    								
  • Virtuální hostitel / hlavní server Direktiva SuexecUserGroup
    • Nastavuje uživatele a skupinu Identitu, pod kterou poběží CGI programy
    • Kontext: server, virtualhost
    
    									SuexecUserGroup User Group
    								
  • Uživatelské adresáře Není potřeba žádná další konfigurace
  • Kontrola podpory suEXEC v serveru – error_log
    
    									[notice] suEXEC mechanism enabled (wrapper: /path/to/suexec)
    								

Security checks

Kontrola zabezpečení

http://httpd.apache.org/docs/current/suexec.html

  • The proper number of arguments
  • UID allowed to run the wrapper
  • The target user NOT superuser
  • Target UID/GID in range + others
  • Permissions of directory and CGI/SSI program
    • Owned by target user
    • NOT writable by anyone else
  • Vyhovující počet argumentů
  • UID uživatele spouštějící wrapper
  • Cílový uživatel nesmí být superuživatel
  • Kontrola cílového UID/GID + další podmínky
  • Práva na adresář a CGI/SSI program
    • Vlastněn cílovým uživatelem
    • Zapisovatelný pouze cílovým uživatelem

suEXEC configuration for user directories

suEXEC konfigurace pro uživatelské adresáře

  • For server users No configuration needed (beyond suEXEC compilation) Pro uživatele serveru V podstatě žádná konfigurace není potřeba
    (mimo kompilaci suEXEC)

    ⇨ http://localhost/~alice/cgi-bin/whoami.sh

    
    									<IfModule userdir_module>
    									  …
    									  <IfModule suexec_module>
    
    									    <Directory /home/*/public_html/cgi-bin>
    									      Options ExecCGI
    									      SetHandler cgi-script
    									    </Directory>
    
    									  </IfModule>
    									  …
    									</IfModule>
    								

suEXEC Configuration for virtualhosts

suEXEC konfigurace pro virtualhosty

  • For virtualhosts User and group identity setup

    ⇨ http://www.mycorp.net/cgi-bin/whoami.cgi

    
    									<VirtualHost 10.0.234.1:*>
    									    ServerName www.mycorp.net
    									    …
    									    # suEXEC + CGI
    									    <IfModule suexec_module>
    
    									        # suEXEC identity
    									        SuexecUserGroup mycorp users
    
    									        <Directory /var/www/vhosts/mycorp/cgi-bin>
    									            Options +ExecCGI
    									            AddHandler cgi-script .cgi
    									        </Directory>
    
    									    </IfModule>
    									    …
    									</VirtualHost>
    								

LAB: suEXEC

suEXEC

The goal is to configure CGI as usual, but with different identity for different users. One way how to do that is to use user directories configuration. Another way is to configure different identities for different virtualhosts.

Cílem je nakonfigurovat spouštění CGI skriptů pod různými uživateli. Jedním ze způsobů je využit skripty uvnitř uživatelských adresářů. Druhou možností je konfigurace jednotlivých virtuálních hostitelů.

  • Create users in the system and its public directories
  • Create script printing out process identity
  • Use suEXEC for user directories
  • Configure suEXEC for virtualhosts
  • Vytvořit uživatele v systémů a jejich uživatelské adresáře
  • Vytvořit skript, který zobrazí identitu, pod kterou běží
  • Použít suEXEC pro uživatelské adresáře
  • Nakonfigurovat suEXEC pro virtualhosty

Tips

Tipy

  • The id command displays process identity (user/group) Příkaz id zobrazí identitu procesu (uživatele/skupinu)
    
    									#!/bin/bash
    									echo "Content-Type: text/plain"
    									echo
    									/usr/bin/id
    								
  • The suexec program is in /usr/lib/apache2/suexec-pristine in Debian V Debianu je suexec uložen v /usr/lib/apache2/suexec-pristine
  • List of compilation parameters Seznam parametrů z kompilace
    
    									/usr/lib/apache2/suexec-pristine -V
    								
  1. Create a script that prints out user identity of executed process, according to user directory owner
  2. Create system users named mycorp, othercorp1, othercorp2, othercorp3, and nocorp
  3. Configure suEXEC to use corresponding identity in various virtualhosts
  1. Napište skript, který ověří, že se vykonává s identitou uživatele systému podle toho, do jehož adresáře se uloží
  2. Vytvořte uživatele mycorp, othercorp1, othercorp2, othercorp3, nocorp
  3. Zajistěte, aby se skripty ve virtuálních hostitelích spouštely s identitou příslušného uživatele

PHP

PHP Hypertext Preprocessor

  • Scripting language + related technologies
    • Server-side scripting
    • Command line
    • GUI
  • Webserver Integration → SAPI Server Application Programming Interface
    • APACHE2
    • CGI (fastCGI)
    • CLI
  • Skriptovací jazyk + související technologie
    • Server-side skriptování
    • Příkazová řádka
    • GUI
  • Integrace s webserverem → SAPI rozhraní Server Application Programming Interface
    • APACHE2
    • CGI (fastCGI)
    • CLI

PHP module installation

Instalace modulu pro PHP

  • php-fpm (Fast Process Manager)
  • libapache2-mod-php*

							apt install php-fpm
							apt install libapache2-mod-php
							Module mpm_event disabled.
							Enabling module mpm_prefork.
							apache2_switch_mpm Switch to prefork
							apache2_invoke: Enable module php7.3
						

							a2enmod proxy_fcgi setenvif
							a2enconf php7.3-fpm
						

							a2enmod php7.3
						

PHP SAPI Apache2

Server Application Programming Interface

  • For non-thread-safe PHP → MPM prefork
  • For thread-safe PHP → MPM worker/event
  • Když PHP není thread-safe → MPM prefork
  • Když PHP je thread-safe → MPM worker/event

							php -i | grep Thread
							Thread Safety => disabled
						

							# Load the module first
							<IfModule !mod_php7.c>
							  LoadModule php7_module modules/libphp7.so
							</IfModule>

							# Set it to handle the files
							<IfModule mod_mime.c>
							  AddHandler application/x-httpd-php .php .php5
							  AddHandler application/x-httpd-php-source .phps
							</IfModule>

							DirectoryIndex index.php index.html
						

PHP SAPI CGI

Common Gateway Interface

  • PHP is standard CGI script with standard CGI features
    • Executable file
    • It is script → interpreter pathname at first line
    
    									#!/path/to/php-cgi
    									<?php
    									  …
    									?>
    								
  • Recommended approach (CERT), but every PHP application needs to change in that case
  • PHP má všechny vlastnosti CGI skriptu
    • Spustitelný soubor
    • Je to skript → na první řádce je interpret
    
    									#!/cesta/k/php-cgi
    									<?php
    									  …
    									?>
    								
  • Doporučený způsob (CERT), ale znamenal by nutnost upravovat existující aplikace

Problems related to CGI

Řešení a problémy použití CGI

  • Place PHP interpret into webspace — security risk
    • QUERY_STRING information is a command line argument 1st parameter is pathname to be processed by default, e.g.: www.mycorp.net/cgi-bin/php-cgi?/etc/passwd
    • Using PATH_INFO information, the server can send document from webspace which is forbidden for client, e.g.: www.mycorp.net/cgi-bin/php-cgi/private/secret.html
  • The PHP-CGI interpret solves both of those problems
    • It does not process arguments from command line
    • The PHP can be compilet with --force-cgi-redirect → use of mod_actions
    • The interpret requires set REDIRECT_STATUS environment variable It will fail when used directly → Internal Server Error
  • Umístit interpret do webspace - potenciálně nebezpečné
    • Informace z QUERY_STRING se předává jako parametry příkazové řádky 1. parametr je typicky cesta k souboru, který se má vykonat, např.: www.mycorp.net/cgi-bin/php-cgi?/etc/passwd
    • Přes PATH_INFO lze interpret přinutit odeslat dokument z webspace, na který nemá klient právo, např.: www.mycorp.net/cgi-bin/php-cgi/private/secret.html
  • PHP-CGI interpret řeší oba problémy
    • Nezpracovává argumenty příkazové řádky
    • Lze PHP zkompilovat s --force-cgi-redirect → použití mod_actions
    • Interpret pak vyžaduje nastavenou proměnnou prostředí REDIRECT_STATUS, Při přímém volání → Internal Server Error

PHP CGI workflow

Schéma činnosti PHP CGI

PHP-CGI workflow scheme

PHP-CGI configuration

Konfigurace PHP-CGI


							<?php phpinfo(); ?>
						

							<IfModule mod_mime.c>
							  AddType application/x-httpd-php .php …
							</IfModule>

							<IfModule actions_module>
							  <IfModule alias_module>

							    <IfModule cgi_module>
							      Action application/x-httpd-php /php/php-cgi
							      ScriptAlias /php/ /var/www/php/

							      <Directory /var/www/php>
							        Require all granted
							      </Directory>
							      DirectoryIndex index.php index.html

							    </IfModule>

							  </IfModule>
							</IfModule>

						

PHP + suEXEC workflow

PHP+suEXEC workflow scheme

PHP-CGI + suEXEC configuration

Konfigurace PHP-CGI + suEXEC


							<VirtualHost …:*>
							    DocumentRoot /path/to/DocumentRoot
							    ServerName www.mycorp.net
							    …

							    # suEXEC + CGI setup
							    <IfModule suexec_module>
							        SuexecUserGroup user group

							        <Directory /cesta/k/DocumentRoot/cgi-bin>
							            Options +ExecCGI
							            AddHandler cgi-script .cgi
							        </Directory>

							        # Sets REDIRECT_STATUS - required for security check
							        Action application/x-httpd-php /cgi-bin/php.cgi
							        DirectoryIndex index.php index.html

							    </IfModule>
							</VirtualHost>
						

							<VirtualHost …:*>
							    DocumentRoot /cesta/k/DocumentRoot
							    ServerName www.mycorp.net
							    …

							    # nastaveni suEXEC + CGI
							    <IfModule suexec_module>
							        SuexecUserGroup user group

							        <Directory /cesta/k/DocumentRoot/cgi-bin>
							            Options +ExecCGI
							            AddHandler cgi-script .cgi
							        </Directory>

							        # zajisti redirect - nutne pro kontrolu prav
							        Action application/x-httpd-php /cgi-bin/php.cgi
							        DirectoryIndex index.php index.html

							    </IfModule>
							</VirtualHost>
						

PHP wrapper

  • wrapper=/var/www/vhosts/mycorp/cgi-bin/php.cgi
    
    									#!/bin/bash
    									exec /usr/bin/php-cgi "$@"
    								
  • Ownership and permissions Vlastnictví a práva
    
    									chmod 755 $wrapper
    									chown user:group $wrapper
    								

LAB: PHP-CGI

PHP-CGI

The goal is to configure PHP interpret using PHP-CGI. So the .php program does not need to be standard CGI script.

Cílem je nakonfigurovat interpretaci PHP skriptů pomocí rozhraní PHP-CGI. Tedy aby nemusel být .php skript volán jako CGI skript.

  • Create simple PHP script
  • Configure an interpretation of PHP scripts using PHP-CGI
  • Vytvořit jednoduchý skript v PHP
  • Nakonfigurovat interpretaci skriptu pomocí PHP-CGI
  1. Create simple script named info.php to print out current PHP settings using phpinfo(); function
  2. Configure webserver to interpret files with .php extension
  3. Test PHP configuration by info.php request
  1. Napište skript info.php, který vypíše aktuální nastavení PHP pomocí funkce phpinfo();
  2. Nakonfiguruje server pro interpretaci souborů s příponou .php
  3. Otestujte funkčnost interpretace PHP kódu

FastCGI

Motivation

Motivace

CGI
+ simple
+ language independent
+ architecture independent
+ process isolation
+ standard
- performance

CGI
+ jednoduchost
+ nezávislost na jazyku
+ nezávislost na architektuře
+ izolace procesů
+ standard
- výkon

Module
+ performance
- complex
- hard to scale
- no process isolation
- language dependent
- tied up to server

Modul
+ výkon
- komplexní
- špatně škálovatelné
- bez izolace procesů
- svázanost s jazykem
- svázanost se serverem

FastCGI

  • Process persistence → high performance
  • Process isolation
  • Distributed
  • Simple, easy migration
  • Perzistence procesů → vyšší výkon
  • Izolace procesů
  • Distribuovaný výpočet
  • Jednoduchost, snadná migrace

CGI request processing (recapitulation)

CGI obsluha požadavků (rekapitulace)

  • Each request ⇒ New process
    • Initialization
    • Environment variables setup
    • Client request data (POST) → standard input
    • CGI program output → standard output and standard error output
  • Request processing end
    ⇒ CGI program termination
  • Každý požadavek ⇒ Nový proces
    • Inicializace
    • Nastavení proměnných prostředí
    • Vstup od klienta (POST) → standardní vstup
    • Výstup CGI programu → standardní výstup a standardní chybový výstup
  • Ukončením obsluhy požadavku
    ⇒ Ukončení CGI programu

FastCGI request processing

FastCGI obsluha požadavků

  • Webserver (FPM) creates processes FastCGI Process Manager
    • During server start Static application
    • During request arrival Dynamic application
  • FastCGI application makes initialization and waits for server requests Connection — from webserver
  • Request → Connection with FastCGI process
  • FastCGI process sends response using connection Standard output and standard error output
  • Close of webserverem — FastCGI connection
    → Response is complete FastCGI process does NOT terminate (persistent), it waits for other requests
  • Webserver (FPM) vytvoří procesy FastCGI Process Manager
    • Při startu serveru Statické aplikace
    • Při příchodu požadavku Dynamické aplikace
  • FastCGI aplikace provede inicializaci a čeká na požadavky Spojení — od webserveru
  • Požadavek → Spojení s FastCGI procesem
  • FastCGI proces přes stejné spojení odešle odpověď Standardní výstup a standardní chybový výstup
  • Uzavřením spojení mezi webserverem a FastCGI
    → Obsluha kompletní FastCGI proces ale nekončí, čeká na další požadavky

Application development

Vývoj aplikací

  • Libraries to cover communication protocol Redefine I/O
  • FastCGI Developer's Kit

							// FastCGI Developer's Kit
							#include <fcgi_stdio.h>
							 
							void main(void)
							{
							    // loop to accept connectioin
							    while(FCGI_Accept() >= 0) {
							        printf("Content-type: text/html\r\n");
							        printf("\r\n");
							        printf("Hello world!<br>\r\n");
							    }
							    // process termination
							    exit(0);
							}
						

							// FastCGI Developer's Kit
							#include <fcgi_stdio.h>
							 
							void main(void)
							{
							    // prijimaci smycka
							    while(FCGI_Accept() >= 0) {
							        printf("Content-type: text/html\r\n");
							        printf("\r\n");
							        printf("Hello world!<br>\r\n");
							    }
							    // ukonceni
							    exit(0);
							}
						

Features

Vlastnosti

  • Process persistence
    • Low transaction costs
    • Problems with resources de-allocation
  • Full-duplex connection instead of environment variables
    • Unix sockets (local applications)
    • TCP connection (distributed applications)
  • Single-threaded and multi-threaded application support
  • Perzistence procesů
    • Snížení režie
    • Problémy s dealokací zdrojů
  • Full-duplex spojení místo proměnných prostředí
    • Unixové sockety (lokální aplikace)
    • TCP spojení (vzdálené aplikace)
  • Podpora jedno- i více-vláknového výpočtu

Protocol

Protokol

  • Servers to data transfer between webserver and FastCGI program
  • Single packet format, many packet types
    FCGI_PARAMSenvironment variables
    FCGI_STDINstandard input
    FCGI_STDOUTstandard output
    FCGI_STDERRstandard error output
    FCGI_END_REQUESTrequest process termination
  • Slouží pro přenos dat mezi webserverem a FastCGI aplikací
  • Jeden formát paketu, různé typy
    FCGI_PARAMSproměnné prostředí
    FCGI_STDINstandardní vstup
    FCGI_STDOUTstandardní výstup
    FCGI_STDERRstandardní chybový výstup
    FCGI_END_REQUESTkonec obsluhy požadavku

Application roles

Role aplikací

  • Responder
    • Responds to requests (same mode as standard CGI)
  • Filter
    • Process data before sending response to client
    • Does not bypass webserver access control
  • Authorizer
    • Provides authorization before request processing
    • HTTP status code has to be 200 OK, or authorization failed
  • Responder
    • Odpovídá na požadavky (stejný režim jako klasické CGI)
  • Filter
    • Zpracovává požadovaný soubor předtím, než je odeslán klientovi
    • Neobchází se kontrola oprávnění webserverem
  • Authorizer
    • Provádí autorizace před provedením požadavku
    • Návratový kód HTTP musí být 200 OK, jinak autorizace neproběhla s kladným výsledkem

Configuration

Konfigurace

FastCGI implementations


							LoadModule fcgid_module modules/mod_fcgid.so

							<IfModule fcgid_module>
							  Alias /fcgi /var/www/main/fcgi
							  <Directory /var/www/main/fcgi>
							    Options +ExecCGI
							    AddHandler fcgid-script .fcgi
							    AddHandler cgi-script .cgi
							    Require all granted
							  </Directory>
							</IfModule>
						

Wrapper

  • Server configuration Konfigurace serveru
    
    									# FcgidMaxRequestsPerProcess should be <= PHP_FCGI_MAX_REQUESTS
    									# The example PHP wrapper script overrides the default PHP setting.
    									FcgidMaxRequestsPerProcess 10000
    
    									Alias /phpapp/ /usr/local/phpapp/
    									<Location /phpapp/>
    									  AddHandler fcgid-script .php
    									  Options +ExecCGI
    									  FcgidWrapper /usr/local/bin/php-wrapper .php
    									  Require all granted
    									</Location>
    								
  • Wrapper - /usr/local/bin/php-wrapper
    
    									#!/bin/sh
    									# Set desired PHP_FCGI_* environment variables.
    									# Example:
    									# PHP FastCGI processes exit after 500 requests by default.
    									PHP_FCGI_MAX_REQUESTS=10000
    									export PHP_FCGI_MAX_REQUESTS
    									# Replace with the path to your FastCGI-enabled PHP executable
    									exec /usr/local/bin/php-cgi