OpenSUSE 12.2에서 mod_fcgid 및 PHP5로 Apache2를 설정하는 방법

OpenSUSE 12.2에서 mod_fcgid 및 PHP5로 Apache2를 설정하는 방법

2022-10-19 last update

8 minutes reading apache suse web server php
이 자습서에서는 OpenSUSE 12.2에서 mod_fcgid 및 PHP5를 사용하여 Apache2를 설치하는 방법을 설명합니다. mod_fcgid는 이전 mod_fastcgi와 호환되는 대안입니다. Apache 사용자 대신 소유자의 권한으로 PHP 스크립트를 실행할 수 있습니다.

1 서문


이 튜토리얼에서는 호스트 이름이 server1.example.com이고 IP 주소가 192.168.0.100인 OpenSUSE 12.2 서버를 사용하고 있습니다.
이 튜토리얼에서는 mod_fcgid의 사용법을 보여주기 위해 www.example1.com과 www.example2.com이라는 두 개의 Apache 가상 호스트를 만들 것입니다.

2 Apache2/mod_fcgi/PHP5 설치


다음과 같이 Apache2, mod_fcgid 및 PHP5를 설치할 수 있습니다.

zypper install apache2 apache2-mod_fcgid php5-fastcgi
Apache2가 이미 Apache 모듈로 PHP5와 함께 설치된 경우 지금 PHP5 모듈을 비활성화합니다.
a2dismod php5
다음으로 suexec 및 fcgid 모듈을 활성화합니다.
a2enmod suexec
a2enmod fcgid
그런 다음 Apache용 시스템 시작 링크를 만들고 시작합니다.
systemctl enable apache2.service
systemctl start apache2.service
다음으로/etc/php5/fastcgi/php.ini...를 엽니다.
vi /etc/php5/fastcgi/php.ini
... 그리고 cgi.fix_pathinfo = 1 행의 주석 처리를 제거합니다.


[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]

/etc/apache2/conf.d/mod_fcgid.conf를 엽니다...
vi /etc/apache2/conf.d/mod_fcgid.conf
... 그리고 PHP_Fix_Pathinfo_Enable 1 행을 추가합니다(이 행은 섹션에 들어가지 않아야 합니다. 그러면 다음 오류가 발생하기 때문입니다. PHP_Fix_Pathinfo_Enable can be 발생할 섹션):


[...]

PHP_Fix_Pathinfo_Enable 1
</IfModule>

그런 다음 Apache를 다시 시작합니다.
systemctl restart apache2.service

3 www.example1.com 및 www.example2.com용 가상 호스트 만들기


이제 www.example1.com(문서 루트/srv/www/web1/web 포함) 및 www.example2.com(문서 루트/srv/www/web2/web 포함)의 두 가상 호스트를 생성하겠습니다. www.example1.com은 사용자 및 그룹 web1이 소유하고 www.example2.com은 사용자 및 그룹 web2가 소유합니다.
먼저 사용자와 그룹을 만듭니다.
groupadd web1
groupadd web2
useradd -s /bin/false -d /srv/www/web1 -m -g web1 web1
useradd -s /bin/false -d /srv/www/web2 -m -g web2 web2
chmod 755 /srv/www/web1
chmod 755 /srv/www/web2
그런 다음 문서 루트를 만들고 사용자/그룹 web1 resp가 소유하도록 만듭니다. 웹2:
mkdir -p /srv/www/web1/web
chown web1:web1 /srv/www/web1/web
mkdir -p /srv/www/web2/web
chown web2:web2 /srv/www/web2/web
우리는 suExec을 사용하여 PHP를 실행할 것입니다. suExec의 문서 루트는 다음 명령과 같이/srv/www입니다.
/usr/sbin/suexec2 -V
server1:~ # /usr/sbin/suexec2 -V
 -D AP_DOC_ROOT="/srv/www"
 -D AP_GID_MIN=96
 -D AP_HTTPD_USER="wwwrun"
 -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=96
 -D AP_USERDIR_SUFFIX="public_html"
server1:~ #
따라서 PHP 바이너리(/usr/bin/php-cgi)는 suExec의 문서 루트 외부에 있기 때문에 직접 호출할 수 없습니다. suExec은 심볼릭 링크를 허용하지 않기 때문에 문제를 해결하는 유일한 방법은/srv/www의 하위 디렉토리에 각 웹 사이트에 대한 래퍼 스크립트를 만드는 것입니다. 래퍼 스크립트는 PHP 바이너리/usr/bin/php-cgi를 호출합니다. 래퍼 스크립트는 각 웹 사이트의 사용자 및 그룹이 소유해야 하므로 각 웹 사이트에 대해 하나의 래퍼 스크립트가 필요합니다./srv/www/php-fcgi-scripts의 하위 디렉토리에 래퍼 스크립트를 생성하겠습니다./srv/www/php-fcgi-scripts/web1 및/srv/www/php-fcgi-scripts/web2.
mkdir -p /srv/www/php-fcgi-scripts/web1
mkdir -p /srv/www/php-fcgi-scripts/web2
vi /srv/www/php-fcgi-scripts/web1/php-fcgi-starter


#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi

vi /srv/www/php-fcgi-scripts/web2/php-fcgi-starter


#!/bin/sh
PHPRC=/etc/php5/fastcgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi

PHPRC 라인에는 php.ini 파일이 있는 디렉토리가 포함됩니다(예:/etc/php5/fastcgi/는/etc/php5/fastcgi/php.ini로 변환됨). PHP_FCGI_MAX_REQUESTS는 fcgid 프로세스가 중지되고 새 프로세스가 시작되기 전의 최대 요청 수입니다. PHP_FCGI_CHILDREN은 시작될 PHP 자식의 수를 정의합니다.
php-fcgi-starter 스크립트는 실행 가능해야 하며 웹 사이트의 사용자 및 그룹이 스크립트(및 스크립트가 있는 디렉토리)를 소유해야 합니다.
chmod 755 /srv/www/php-fcgi-scripts/web1/php-fcgi-starter
chmod 755 /srv/www/php-fcgi-scripts/web2/php-fcgi-starter
chown -R web1:web1 /srv/www/php-fcgi-scripts/web1
chown -R web2:web2 /srv/www/php-fcgi-scripts/web2
이제 www.example1.com 및 www.example2.com에 대한 Apache 가상 호스트를 생성합니다.
vi /etc/apache2/vhosts.d/www.example1.com.conf


<VirtualHost *:80>
  ServerName www.example1.com
  ServerAlias example1.com
  ServerAdmin [email protected]
  DocumentRoot /srv/www/web1/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web1 web1
    <Directory /srv/www/web1/web/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /srv/www/php-fcgi-scripts/web1/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>

vi /etc/apache2/vhosts.d/www.example2.com.conf


<VirtualHost *:80>
  ServerName www.example2.com
  ServerAlias example2.com
  ServerAdmin [email protected]
  DocumentRoot /srv/www/web2/web/

  <IfModule mod_fcgid.c>
    SuexecUserGroup web2 web2
    <Directory /srv/www/web2/web/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php
      FCGIWrapper /srv/www/php-fcgi-scripts/web2/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>

올바른 경로(및 SuexecUserGroup 행의 올바른 사용자 및 그룹)를 입력했는지 확인하십시오.
/etc/apache2/httpd.conf를 열고 Include/etc/apache2/vhosts.d/*.conf 줄 앞에 NameVirtualHost * 줄을 추가합니다(그렇지 않으면 첫 번째 가상 호스트만 작동함).
vi /etc/apache2/httpd.conf


[...]
### Virtual server configuration ############################################
#
# VirtualHost: If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at
# <URL:http://httpd.apache.org/docs-2.2/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.
#
NameVirtualHost *:80

Include /etc/apache2/vhosts.d/*.conf
[...]

Apache를 다시 시작하기 전에 suExec 실행 파일의 권한을 변경합니다(그렇지 않으면 Apache를 다시 시작할 때 다음 경고가 표시됩니다. 경고: SuexecUserGroup 지시문에는 SUEXEC 래퍼가 필요합니다.):
chmod 4755 /usr/sbin/suexec2
나중에 Apache를 다시 시작하십시오.
systemctl restart apache2.service