PHP-FPM(빠른 프로세스 관리자) PHP 스크립트를 실행하기 위한 FastCGI의 별도 구현입니다. NGINX 웹 서버(정적 처리)와 PHP-FPM의 조합을 사용하여 LAMP 스택(NGINX, Apache 및 mod_php 모듈)보다 웹사이트를 위한 더 빠르고 고성능의 웹 서버를 구축할 수 있습니다.
LEMP 일반적으로 웹 사이트를 호스팅하고 웹 응용 프로그램을 게시하기 위해 함께 설치되는 오픈 소스 소프트웨어 도구 세트입니다. 이 약어는 OS Linux 집합을 나타냅니다. , Nginx 웹 서버(더 인기 있는 LAMP 스택에서 Apache를 대체함), MySQL (마리아DB ) 데이터베이스 및 php 동적 데이터를 처리합니다.
이 기사에서는 Linux CentOS 7을 실행하는 서버에서 고부하 웹 프로젝트를 호스팅하기 위해 LEMP 스택(NGINX + PHP-FPM + MariaDB/MySQL)을 설치하고 최적화하는 방법을 살펴보겠습니다.
Nginx를 웹 서버로 설치 및 구성
새로 설치된 CentOS 서버를 설치에 사용하므로 인기있는 EPEL 저장소에 연결하여 서버의 모든 패키지를 업데이트하십시오.
# yum install epel-release -y
# yum update -y
최신 Nginx를 설치하려면 버전에서 다음 명령을 실행하여 개발자 저장소를 연결합니다.
# rpm -Uvh https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
또는 수동으로 저장소 구성 파일을 생성합니다(/etc/yum.repos.d/nginx.repo). . 파일에 다음 줄을 추가합니다.
[nginx] name=nginx repo baseurl=https://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
CentOS 8을 사용하는 경우 URL에서 버전을 변경하세요.
yum(또는 dnf) 패키지 관리자를 사용하여 Nginx 웹 서버 패키지 설치:
# yum install nginx -y
그런 다음 nginx를 실행합니다. systemctl을 사용하여 시작에 추가:
# systemctl start nginx
# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service
웹 서버가 실행 중인지 확인하려면 브라우저에서 서버 IP 주소를 엽니다.
이 테스트 페이지가 표시되지 않으면 서버의 방화벽에서 허용된 서비스, 포트 및 영역의 설정을 확인하십시오.
별도의 도메인 woshub-linux.com에 대한 구성 파일 만들기 . 사이트와 구성 파일에 대해 별도의 디렉터리를 만듭니다.
# mkdir -p /var/www/woshub-linux.com && mkdir -p /var/www/woshub-linux.com/log
구성 파일 열기:
# nano /etc/nginx/conf.d/woshub-linux.com.conf
그리고 다음 내용을 추가하십시오:
server { listen 80; server_name woshub-linux.com; root /var/www/woshub-linux.com; index index.php index.html index.htm; access_log /var/www/woshub-linux.com/log/access.log main; error_log /var/www/woshub-linux.com/log/error.log; location / { return 301 https://woshub-linux.com$request_uri; } location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { return 301 https://woshub-linux.com$request_uri; } location ~ \.php$ { return 301 https://woshub-linux.com$request_uri; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { rewrite ^ /robots.txt break; allow all; log_not_found off; access_log off; } location ~ /\.ht { deny all; } } server { listen 80; server_name www.woshub-linux.com; rewrite ^ https://woshub-linux.com$request_uri? permanent; } server { listen 443 ssl http2; server_name woshub-linux.com; root /var/www/woshub-linux.com; index index.php index.html index.htm; access_log /var/www/woshub-linux.com/log/ssl-access.log main; error_log /var/www/woshub-linux.com/log/ssl-error.log; keepalive_timeout 60; ssl_certificate /etc/letsencrypt/live/woshub-linux.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/woshub-linux.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; add_header Strict-Transport-Security 'max-age=604800'; location / { try_files $uri $uri/ /index.php?$args; } location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { access_log off; expires max; } location ~ \.php$ { try_files $uri =404; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param DOCUMENT_ROOT /var/www/woshub-linux.com; fastcgi_param SCRIPT_FILENAME /var/www/woshub-linux.com/$fastcgi_script_name; fastcgi_param PATH_TRANSLATED /var/www/woshub-linux.com/$fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param HTTPS on; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~ /\.ht { deny all; } } server { listen 443 ssl http2; server_name www.woshub-linux.com; rewrite ^ https://woshub-linux.com$request_uri? permanent; }
구성 파일에는 많은 인기 있는 CMS가 기본적으로 사용하기 때문에 보안 HTTP 프로토콜 액세스를 사용하여 사이트에 액세스하기 위한 설정이 포함되어 있습니다. 나중에 무료 Let's Encrypt 인증서를 설치하고 구성할 수 있습니다(Windows Server의 IIS에서 웹 사이트에 대한 Let's Encrypt 인증서를 설치한 것처럼).
PHP-FPM 설치
Nginx에는 PHP 처리기가 내장되어 있지 않으므로 php-fpm을 설치해야 합니다. 및 PHP 스크립트를 처리하는 일부 PHP 모듈.
Php-fpm 쉽고 빠른 PHP 프로세스 관리자입니다. Apache와 달리 HTTP 프로토콜을 사용하지 않으며 특별한 FastCGI 프로토콜과 함께 작동합니다. 가볍고 사용하기 쉬운 FPM은 PHP 요청을 더 빠르게 처리합니다. 동시에 아파치로 구성하는 경우에 비해 메모리를 덜 사용하게 됩니다.차례대로 Nginx는 더 효율적으로 static을 반환합니다. 우리 구성에서 nginx는 프록시 서버(캐싱 및 프론트엔드 서버)가 되고 php-fpm은 백엔드 역할을 합니다.
REMI 저장소를 사용하여 최신 PHP 버전 설치:
# rpm -ivh https://rpms.famillecollet.com/enterprise/remi-release-7.rpm
설치 후 /etc/yum.repos.d/remi-php74.repo 편집 파일:
php-fpm 실행 그리고 인기 있는 PHP 모듈 설치:
# yum install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip
php-fpm 시작 데몬 및 시작에 추가:
# systemctl start php-fpm
# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
서비스가 시작되었는지 확인하려면 다음 명령을 실행하십시오.
# lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME php-fpm 1551 root 7u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1552 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1553 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1554 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1555 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN) php-fpm 1556 apache 9u IPv4 2078435 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 실행 유닉스 소켓을 사용합니다. "listen = 127.0.0.1:9000
줄 삭제 "에서 /etc/php-fpm.d/www.conf 다음을 추가하십시오.
listen = /var/run/php-fpm/php-fpm.sock listen.mode = 0660 listen.owner = nginx listen.group = nginx
Apache가 아닌 사용자로 php-fpm을 시작하려면(기본적으로) 구성 파일에서 다음 매개변수를 지정하십시오.
user = nginx group = nginx
php-fpm 구성 파일을 변경한 후 서비스를 다시 시작하십시오.
# systemctl restart php-fpm
웹 서버에 MySQL/MariaDB 설치
"Linux에서 MariaDB 설치 및 최적화" 전체 가이드가 이전에 게시되었으므로 이 단계를 건너뛰겠습니다. 이것을 활용하십시오.
고부하를 위한 Nginx + PHP-FPM 구성
웹 서버가 많은 수의 클라이언트 요청(트래픽이 높은 웹사이트)을 처리할 수 있도록 nginx를 적절하게 구성하는 것이 중요합니다. 및 php-fpm .
Nginx 구성
/etc/nginx/nginx.conf를 엽니다. 파일을 만들고 Nginx 구성을 다음과 같이 변경합니다.
worker_processes 2;
— 작업자 프로세스의 수를 서버의 코어 수와 동일하게 설정합니다.worker_connections 1024;
— 하나의 작업 프로세스에 대한 연결 수를 설정합니다(값을 1024에서 4096으로 설정).use epoll;
— Linux에서 최적의 연결 방법입니다.multi_accept on;
— nginx는 최대 연결 수를 허용합니다.
http 차단:
tcp_nodelay on;
— 헤더와 파일의 시작을 하나의 패키지로 보냅니다.tcp_nopush on;
많은 정적 파일을 포함하는 웹 프로젝트에 대해 gzip 압축 활성화:
gzip on;
모든 googlespeed 검사를 통과하기 위해 다른 파일 유형 추가:gzip_types application/atom+xml application/javascript text/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json font/ttf application/x-font-ttf application/vnd.ms-fontobject application/font-woff application/font-woff2 application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vnd.wap.wml text/vtt text/x-component text/x-cross-domain-policy;
시간 초과 설정 변경:
keepalive_timeout 30;
— 웹 서버는 연결 유지 연결을 닫기 전에 30초 동안 대기합니다.keepalive_requests 100;
한 클라이언트의 최대 keepalive 요청 수입니다.reset_timedout_connection on;
— 응답을 중지한 클라이언트의 연결을 재설정하지 않으려면 이 매개변수를 활성화합니다.client_body_timeout 10;
— 웹 서버는 연결이 재설정될 때까지 10초 동안 클라이언트가 요청을 확인하기를 기다립니다.send_timeout 2;
— 클라이언트가 웹 서버 응답 읽기를 중지하면 nginx가 연결을 재설정합니다.
웹사이트가 대용량 파일 업로드용으로 설계되지 않은 경우 nginx를 사용하여 제한을 설정하십시오.
client_max_body_size 2m;
— 서버는 2MB를 초과하는 요청을 수락하지 않습니다.
프로젝트의 콘텐츠가 자주 변경되지 않는 경우 'expires max; ' 캐싱하거나 필요한 파일 유형에 대해 호스트의 구성 파일에 해당 옵션을 추가합니다. 예:
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ { expires 7d; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
지정된 파일 형식의 캐시는 7일 동안 저장됩니다.
변경한 후에는 nginx를 다시 시작하는 것을 잊지 마십시오.
# systemctl restart nginx
Php-fpm 구성
php-fpm을 설치할 때 즉시 유닉스 소켓으로 전환했습니다. 성능을 크게 향상시킵니다. 추정에 따르면 생산성은 2~3배 증가합니다. 다른 php-fpm 매개변수는 각 프로젝트에 대해 개별적으로 설정해야 합니다. 1,024MB RAM이 있는 단일 코어(vCPU) 서버의 구성 예를 살펴보겠습니다.
php-fpm에 약 512MB를 할당하고 나머지는 데이터베이스와 nginx에 할당할 수 있습니다.
구성 파일 /etc/php-fpm/www.conf에 다음을 추가합니다. :
pm.max_children = 18
최대 자식 프로세스 수입니다.pm.start_servers = 6
시작 시 생성된 하위 프로세스의 수입니다.pm.min_spare_servers = 4
비활성 서버 프로세스의 최소 수입니다.pm.max_spare_servers = 16
비활성 서버 프로세스의 최대 수입니다.pm.max_requests = 400
프로세스가 다시 시작된 후의 하위 프로세스 요청 수입니다.
이 웹 사이트에 해당 기사가 있으므로 MariaDB 설정을 최적화하는 방법을 설명하지 않았습니다. 기사를 기반으로 내 프로젝트에 대한 my.cnf 매개변수를 설정했으며 데이터베이스는 우수한 성능 결과를 보여주었습니다.
웹사이트를 실행한 후 nginx + php-fpm이 apache2 + mod_php보다 훨씬 빠르게 요청을 처리하고 웹페이지를 반환한다는 것을 육안으로 확인할 수 있습니다.