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

고성능 NGINX 및 PHP-FPM 웹 서버 구성

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 및 PHP-FPM 웹 서버 구성

최신 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 및 PHP-FPM 웹 서버 구성

그런 다음 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 주소를 엽니다.

고성능 NGINX 및 PHP-FPM 웹 서버 구성

이 테스트 페이지가 표시되지 않으면 서버의 방화벽에서 허용된 서비스, 포트 및 영역의 설정을 확인하십시오.

별도의 도메인 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 편집 파일:

고성능 NGINX 및 PHP-FPM 웹 서버 구성

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

고성능 NGINX 및 PHP-FPM 웹 서버 구성

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를 초과하는 요청을 수락하지 않습니다.

고성능 NGINX 및 PHP-FPM 웹 서버 구성

프로젝트의 콘텐츠가 자주 변경되지 않는 경우 '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보다 훨씬 빠르게 요청을 처리하고 웹페이지를 반환한다는 것을 육안으로 확인할 수 있습니다.