Computer >> 컴퓨터 >  >> 체계 >> Linux

Linux 서버에서 트래픽이 많은 웹 사이트에 대해 Apache 및 PHP를 구성하는 방법

Linux 서버에서 트래픽이 많은 웹 사이트에 대해 Apache 및 PHP를 구성하는 방법

LAMP 스택(Linux, Apache, MySQL, PHP)을 설치하는 방법에 대한 거의 모든 자습서에서는 PHP 스크립트를 처리하기 위해 내장 Apache 모듈을 사용할 것을 권장합니다. 예를 들어 Ubuntu에서는 sudo apt install libapache2-mod-php와 같은 명령을 사용할 때 활성화합니다. 패키지를 설치합니다. 이것은 Apache가 mpm_prefork를 사용하도록 강제합니다. 방문자가 웹사이트에 액세스할 때마다 해당 연결을 처리하기 위해 새로운 프로세스가 시작됩니다. 트래픽이 적을 때 잘 작동합니다.

그러나 갑자기 트래픽이 폭주하면 큰 문제가 됩니다. 예를 들어 Reddit 게시물에 귀하의 웹사이트가 포함될 수 있으며 해당 게시물이 인기를 얻으면 단 몇 분 만에 수천 명의 방문자를 확보할 수 있습니다.

최상의 시나리오에서 Apache가 트래픽 버스트를 처리할 수 있다면 일부 불행한 방문자는 페이지가 로드될 때까지 30초에서 60초 정도 기다려야 할 수 있습니다. 이는 오늘날의 세계에서 터무니없는 일입니다. 최악의 시나리오에서는 서버가 심하게 지연되기 시작하고 일부 연결은 리소스 부족으로 인해 단순히 끊어집니다. 이 경우 방문자는 브라우저에 오류가 표시됩니다.

수백 또는 수천 명의 관심 있는 독자, 고객 또는 팬의 관심을 잃을 수 있기 때문에 어느 쪽이든 좋은 시나리오가 아닙니다.

불행히도 PHP는 어느 쪽이든 꽤 큰 리소스 돼지입니다. 그러나 mpm_event를 사용하면 Apache는 훨씬 더 효율적인 방식으로 갑작스러운 트래픽 버스트를 처리할 수 있습니다. 그러나 서버에 실제 또는 가상으로 최소 2GB의 RAM과 2개의 CPU 코어가 있는 것이 좋습니다. 초당 방문자 10명 이상과 같이 트래픽 급증이 예상되는 경우에는 더 많습니다. 가상 사설 서버를 사용하는 경우 상황과 SSD 스토리지에 가상 CPU 코어를 더 추가합니다. RAM은 보조입니다.

데비안 기반 배포판에서 Apache MPM 이벤트 및 PHP-FPM을 사용하는 방법

Debian, Ubuntu 또는 이 제품군의 다른 배포판에서는 "libapache2-mod-php" 패키지 설치를 피하면 됩니다. Apache를 설치할 때 기본적으로 MPM 이벤트를 사용합니다. 그러나 언급된 패키지를 설치하면 스크립트가 MPM 이벤트를 비활성화하고 MPM 프리포크를 활성화합니다. Apache PHP 모듈은 mpm_prefork에서만 (안전하게) 작동할 수 있습니다. 물론 "libapache2-mod-php"가 없으면 PHP 파일용 프로세서가 없습니다. 따라서 Apache에 포함된 PHP 모듈 대신 PHP-FPM을 사용합니다. 다음은 새 서버에 LAMP 스택을 설치하는 방법입니다. 웹 애플리케이션의 요구 사항에 따라 단계를 조정할 수 있습니다.

먼저 root로 로그인합니다. 그런 다음 Apache를 설치합니다.

apt update && apt install apache2

이 시점에서 Apache는 실제로 기본적으로 활성화된 MPM 이벤트와 함께 제공된다는 것을 알 수 있습니다.

apachectl -V

Linux 서버에서 트래픽이 많은 웹 사이트에 대해 Apache 및 PHP를 구성하는 방법

PHP-FPM을 설치합니다.

apt install php-fpm

Apache에서 PHP 프로세서를 활성화하는 방법에 대한 지침이 표시됩니다.

Linux 서버에서 트래픽이 많은 웹 사이트에 대해 Apache 및 PHP를 구성하는 방법

FastCGI 프로토콜을 활성화합니다.

a2enmod proxy_fcgi

Apache용 PHP-FPM 기본 구성을 활성화합니다.

a2enconf php7.0-fpm

참고 :Debian/Ubuntu의 향후 버전에서 이 명령은 다른 것으로 변경될 수 있습니다. a2enconf php7.6-fpm , PHP-FPM이 다른 버전이기 때문입니다.

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

systemctl restart apache2

PHP 애플리케이션에 대한 나머지 요구 사항을 설치합니다. 다음은 예입니다:

apt install mariadb-server php-mysql

이렇게 하면 PHP 애플리케이션이 데이터베이스에 연결할 수 있도록 데이터베이스 서버와 PHP MySQL 모듈이 설치됩니다.

RedHat 기반 배포에서 Apache MPM 이벤트 및 PHP-FPM을 사용하는 방법

다른 인기 있는 서버 배포 선택은 RedHat 또는 CentOS입니다. 위와 같은 방법으로 MPM 이벤트를 활성화하고 PHP-FPM을 사용하여 Apache 클린 설치 예시를 제공합니다.

루트로 로그인하여 Apache를 설치합니다.

yum install httpd

Debian 기반 배포판과 달리 여기에서는 Apache가 기본적으로 MPM prefork를 사용하는 것을 볼 수 있습니다. 적어도 작성 당시 사용 가능한 최신 CentOS 7에서는.

apachectl -V

Linux 서버에서 트래픽이 많은 웹 사이트에 대해 Apache 및 PHP를 구성하는 방법

MPM 이벤트를 활성화하려면 설정 파일을 수정해야 합니다.

sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf

그러면 #가 추가됩니다. LoadModule mpm_prefork_module modules/mod_mpm_prefork.so 줄에 주석 달기(비활성화) 서명 .

Linux 서버에서 트래픽이 많은 웹 사이트에 대해 Apache 및 PHP를 구성하는 방법

이제 #LoadModule mpm_event_module modules/mod_mpm_event.so 행의 주석 처리를 제거(활성화)하십시오. 앞의 #를 제거하여 다음 명령으로 서명하십시오.

sed -i '/mpm_event\.so$/s/^#//' /etc/httpd/conf.modules.d/00-mpm.conf

Apache를 시작하고 부팅 시 자동 시작되도록 활성화합니다.

systemctl start httpd.service
systemctl enable httpd.service

Apache가 이제 MPM 이벤트를 사용하는지 확인하십시오.

apachectl -V

Linux 서버에서 트래픽이 많은 웹 사이트에 대해 Apache 및 PHP를 구성하는 방법

PHP-FPM 및 FastCGI 모듈을 설치합니다.

yum install php-fpm mod_fcgid

"/etc/httpd/conf.d/php.conf"를 생성하여 Apache에 PHP 파일 처리 방법을 지시합니다. 아래의 모든 내용을 복사하여 터미널에 한 번에 붙여넣고 Enter 키를 누릅니다.

cat <<PASTE > /etc/httpd/conf.d/php.conf
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
 
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
<FilesMatch ".+\.phps$">
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
PASTE

이 훌륭한 구성에 대한 크레딧은 Debian에 있습니다. 다른 출처는 다음과 같은 간단한 구성 파일을 권장합니다.

<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

그러나 이것은 일부 공격에 취약하며 특정 서비스가 실패할 경우 PHP 파일을 대중에게 노출할 수 있으며, 그 결과 저장된 비밀번호, 코드 및 민감한 데이터가 잠재적으로 노출될 수 있습니다.

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

systemctl restart httpd.service

PHP-FPM을 시작하고 부팅 시 자동 시작을 활성화합니다.

systemctl start php-fpm.service
systemctl enable php-fpm.service

결론

이제 트래픽에 따라 훨씬 더 잘 확장되는 Apache 서버가 있습니다. 그러나 대부분의 사람들에게 "최상"인 기본 설정을 사용하고 있음을 기억하십시오. HTTP 서버를 최대한 활용하려면 조정할 수 있는 다양한 변수에 대해 읽어야 합니다. 이에 대한 올바른 값은 서버의 리소스, 예상 트래픽 및 PHP 애플리케이션에 따라 크게 달라집니다.