기타 참고사항

기타 참고사항

저는 Apache를 사용하여 일부 PHP 기반 웹 응용 프로그램을 제공하는 Gentoo Linux 웹 서버를 가지고 있습니다. 대부분의 애플리케이션은 최신 버전의 PHP(예: 7.2)에서 실행되지만, 한 애플리케이션은 매우 오래된 버전의 PHP(예: 5.6)에서 실행해야 합니다.동일한 웹 서버에서 여러 버전의 PHP를 동시에 실행하는 방법은 무엇입니까?

  • 젠투(프로필 17).
  • 웹 서버는 Apache 2.4입니다.
  • 실행하려면 PHP 7.2 및 PHP 5.6이 필요합니다.
  • Apache는 현재 mod_php를 통해 PHP 7.2를 제공하도록 구성되어 있지만 PHP 5.6도 설치되어 있습니다.
  • Gentoo는 eselectApache/mod_php에서 사용하는 PHP 버전을 변경하도록 구성되어 있습니다.

답변1

이 답변은 프로필 17을 사용하는 Gentoo에만 적용됩니다. 일부 긍정적 버전과 부정적 버전에서 작동할 수 있습니다. 나는 사용했다Red Hat PHP 구성 팁영감을 주는 페이지. 다른 Linux 배포판에도 동일한 아이디어가 적용되어야 합니다(물론 정확한 명령은 다를 수 있습니다).

해결책은 PHP-FPM(FastCGI 프로세스 관리자)을 사용하는 것입니다. 각 PHP 버전에는 소켓을 수신하는 자체 PHP-FPM 서비스가 있습니다. Apache는 필요한 PHP 버전에 따라 특정 PHP-FPM 서비스에 PHP 실행 요청을 전달합니다.

한 버전의 PHP에는 mod_php를 사용하고 다른 버전에는 PHP-FPM을 사용할 수 있지만 저는 mod_php를 모두 포기하기로 결정했습니다. 먼저, mod_php를 비활성화하면 메모리 오버헤드를 줄일 수 있다는 글을 어디선가 읽었습니다. 둘째, 솔루션이 좀 더 깔끔해 보이고 모든 PHP 버전이 동일한 방식으로 처리됩니다. 셋째, 보안 관점에서 볼 때 항상 최소한의 소프트웨어만/필요한 소프트웨어만 설치하는 것이 좋습니다.

  1. USE태그를 변경하여 dev-lang/php추가 fpm및 제거하세요 apache2.

    현재 젠투 관례는 비슷한 파일을 만들고 /etc/portage/package.use/php여기에 플래그를 지정하는 것입니다 USE. 파일에 정확한 버전을 지정하는 경우 USE사용하려는 모든 PHP 버전에 대해 이러한 플래그가 선택되어 있는지 확인하세요.

  2. 사용할 PHP 버전을 설치/재설치하세요.

# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
  1. APACHE2_MODULES빌드 proxyproxy_fcgiApache 모듈 에 대한 변수를 변경합니다 .

    APACHE2_MODULES변수를 추가/업데이트하여 Apache 모듈이 사용하는 것을 지정할 수 있습니다 /etc/portage/make.conf. 플래그 와 마찬가지로 USE젠투는 이미 구성 파일에 대한 일부 기본값을 설정합니다. flags 와 달리 , 변수를 앞에 추가하여 기본값으로 시작하도록 Gentoo에 명시적으로 지시 USE해야 하는 것 같습니다 :$APACHE2_MODULES

APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
  1. 아파치를 다시 설치하십시오.
# emerge -av apache
  1. PHP-FPM을 설치합니다.
# emerge -av php-fpm
  1. Apache와 함께 사용하는 각 PHP 버전에 대한 PHP-FPM 시작 스크립트를 만듭니다.

    PHP-FPM을 설치하면 스크립트의 파일 이름 접미사(예: 등)를 사용하거나 변경하여 /etc/init.d/php-fpm실행할 PHP 버전을 선택할 수 있는 시작 스크립트( )가 생성됩니다. 한 번에 하나의 PHP 버전만 사용하려는 경우 또는 두 개 이하의 버전(하나는 mod_php이고 두 번째는 PHP-FPM)만 사용하려는 경우에만 사용하고 싶기 때문에, 접미사 방법을 사용합니다. 우리는 스크립트를 복사하는 것이 아니라 심볼릭 링크를 사용하고 싶습니다(유효한 접미사는 예를 들어 디렉토리 이름 등입니다).eselectphp-fpm-php5.6php-fpm-php7.2eselectls -ld /usr/lib64/php*php5.6php7.2

# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
  1. 서비스가 각 PHP 버전마다 다른 포트에서 실행되도록 PHP-FPM 구성을 변경합니다.

    정확한 파일 이름은 버전마다 다르지만 다음 일반 위치에서 각 PHP 버전의 구성 파일을 편집하여 각 지시어가 다른 포트를 갖도록 /etc/php/fpm-php*/*.conf합니다 .listen

  2. PHP-FPM 서비스가 시작되도록 구성합니다.

# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
  1. 프록시 모듈을 활성화하려면 Apache 시작 구성을 편집하십시오.

    /etc/conf.d/apache2를 추가 -D PROXY하고 -D PHP삭제 하려면 편집하세요 APACHE2_OPTS.

  2. 특정 디렉토리 위치를 PHP-FPM의 특정 인스턴스에 바인딩하려면 Apache 구성을 편집하십시오.

    특정 Apache 구성에 따라 이를 처리하는 방법은 여러 가지가 있습니다. <Directory>다음을 추가하여 기본 PHP 핸들러가 버전 7.2가 되도록 내 웹 루트와 연관된 항목을 편집하기로 결정했습니다 .

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
</FilesMatch>

PHP 5.6은 예외적인 경우에만 사용되므로 <Directory>이전 버전의 PHP를 사용해야 하는 모든 애플리케이션에 지시문을 추가했습니다.

<Directory /var/www/oldapp>
    <FilesMatch \.php$>
        Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
    </FilesMatch>
</Directory>
  1. index.php유효한 디렉터리 인덱스 파일로 추가되었습니다 .

    젠투에는 평소와 같은 방식으로 디렉토리 색인 파일을 /etc/apache2/modules.d/70_mod_php.conf추가 하는 지시문이 포함되어 있습니다 . 9단계에서 mod_php를 비활성화했으므로 이 설정은 더 이상 필요하지 않습니다. 이 문제를 해결하려면 Apache 구성에 추가하세요. 그렇지 않고 해당 경로에 액세스하면 403 오류가 발생합니다.index.phpindex.html70_mod_php.confDirectoryIndex index.php/oldapp/

  2. 아파치를 다시 시작하십시오.

# /etc/init.d/apache restart

기타 참고사항

  • 파일에서 특정 구성 설정 php.ini(예: 최대 POST 값, 시간대 등) 을 설정하는 경우 /etc/php/fpm-php*/php.ini모든 파일(각 버전에 대해)에서 이러한 설정을 설정해야 합니다.
  • PHP-FPM은 기본적으로 user=nobody/로 실행됩니다 group=nobody. /etc/php/fpm-php*/php-fpm.conf실행 중인 웹 서버와 일치하도록 에서 이를 변경해야 할 수도 있습니다 .
  • 여러 가상 호스트를 처리하려면 각 가상 호스트에 대해 10단계와 11단계를 수행합니다.

관련 정보