>백엔드 개발 >PHP 튜토리얼 >Nginx 서버에 연결하고 Nginx log_php 팁을 구문 분석하는 PHP 방법

Nginx 서버에 연결하고 Nginx log_php 팁을 구문 분석하는 PHP 방법

WBOY
WBOY원래의
2016-05-16 20:08:291659검색

PHP와 nginx의 통합

PHP-FPM은 타사 FastCGI 프로세스 관리자이기도 합니다. 이는 PHP용 패치로 개발되었습니다. 또한 설치 중에 PHP 소스 코드와 함께 컴파일해야 합니다. PHP 커널이므로 처리 성능 측면에서 더 우수하며 동시에 높은 동시성을 처리하는 데 있어서 Nginx PHP/PHP-FPM 조합을 사용하는 것이 좋습니다.
FastCGI의 가장 큰 장점은 HTTP 서버에서 동적 언어를 분리하는 것입니다. 따라서 Nginx와 PHP/PHP-FPM은 종종 서로 다른 서버에 배포되어 프런트 엔드 Nginx 서버에 대한 압력을 공유하므로 Nginx가 독점적으로 처리할 수 있습니다. 정적 요청 및 동적 요청 전달, PHP/PHP-FPM 서버는 PHP 동적 요청만 구문 분석합니다.

#fastcgi
FastCGI는 HTTP 서버와 동적 스크립팅 언어 간의 통신을 위한 확장 가능한 고속 인터페이스입니다. 가장 널리 사용되는 HTTP 서버는 Apache, Nginx 및 lighttpd를 포함한 FastCGI를 지원하는 동시에 PHP를 포함한 많은 스크립팅 언어에서도 지원됩니다.
FastCGI는 CGI에서 개발 및 개선되었습니다. 전통적인 CGI 인터페이스 방법의 가장 큰 단점은 성능이 좋지 않다는 것입니다. 왜냐하면 HTTP 서버가 동적 프로그램을 만날 때마다 구문 분석을 수행하기 위해 스크립트 파서를 다시 시작해야 하고 결과가 HTTP 서버로 반환되기 때문입니다. 높은 동시 액세스를 처리할 때는 거의 사용할 수 없습니다. 또한 기존의 CGI 인터페이스 방식은 보안성이 취약하여 현재는 거의 사용되지 않습니다.
FastCGI 인터페이스는 HTTP 서버와 스크립트 구문 분석 서버를 분리하고 스크립트 구문 분석 서버에서 하나 이상의 스크립트 구문 분석 데몬을 시작할 수 있는 C/S 구조를 채택합니다. HTTP 서버가 동적 프로그램을 만날 때마다 실행을 위해 FastCGI 프로세스로 직접 전달된 다음 결과가 브라우저로 반환됩니다. 이 방법을 사용하면 HTTP 서버가 정적 요청을 독점적으로 처리하거나 동적 스크립트 서버의 결과를 클라이언트에 반환할 수 있으므로 전체 응용 프로그램 시스템의 성능이 크게 향상됩니다.
Nginx FastCGI 작동 원리
Nginx는 외부 프로그램의 직접 호출이나 구문 분석을 지원하지 않습니다. 모든 외부 프로그램(PHP 포함)은 FastCGI 인터페이스를 통해 호출해야 합니다. FastCGI 인터페이스는 Linux의 소켓입니다(이 소켓은 파일 소켓 또는 IP 소켓일 수 있습니다). CGI 프로그램을 호출하려면 FastCGI 래퍼도 필요합니다(래퍼는 다른 프로그램을 시작하는 데 사용되는 프로그램으로 이해될 수 있음). 이 래퍼는 포트나 파일 소켓과 같은 고정 소켓에 바인딩됩니다. Nginx가 FastCGI 인터페이스를 통해 이 소켓에 CGI 요청을 보내면 래퍼는 요청을 받은 다음 새 스레드를 생성하여 스크립트를 처리하고 반환 데이터를 읽습니다. 반환된 데이터는 FastCGI 인터페이스를 통해 고정 소켓을 따라 Nginx로 전달됩니다. 마지막으로 Nginx는 반환된 데이터를 클라이언트로 보냅니다. 이것이 Nginx FastCGI의 전체 작업 프로세스입니다.

PHP와 nginx 통합
php.ini: PHP의 기본 구성 파일

[root@server79 php-5.4.12]# cp php.ini-production /usr/local/lnmp/php/etc/php.ini

PHP 시작 스크립트 복사

[root@server79 fpm]# pwd
/root/php-5.4.12/sapi/fpm
[root@server79 fpm]# cp init.d.php-fpm /etc/init.d/php-fpm

시작 스크립트에 실행 권한 추가

[root@server79 fpm]# chmod +x /etc/init.d/php-fpm
[root@server79 ~]# vim /usr/local/lnmp/php/etc/php.ini
cgi.fix_pathinfo=0
date.timezone = /Asia/Shanghai
[root@server79 ~]# cp /usr/local/lnmp/php/etc/php-fpm.conf.default /usr/local/lnmp/php/etc/php-fpm.conf
[root@server79 etc]# vim php-fpm.conf

댓글 열기 pid = run/php-fpm.pid

php-fpm.conf 파일 매개변수 분석
PHP의 전역 구성 파일은 php.ini입니다. 위 단계에서 이 파일은 /usr/local/lnmp/php/etc/php.ini에 복사되었습니다. php.ini는 각 애플리케이션의 필요에 따라 적절하게 구성될 수 있습니다.
다음은 PHP-FPM 엔진의 구성 파일에 중점을 둡니다.
위에서 지정한 설치 경로에 따르면 PHP-FPM의 기본 구성 파일은 /usr/local/lnmp/php/etc/php-fpm.conf입니다.
php-fpm.conf는 XML 형식의 일반 텍스트 파일이며 해당 내용은 이해하기 쉽습니다. 여기서는 몇 가지 중요한 구성 태그에 중점을 둡니다.
Listen_address 레이블은 fastcgi 프로세스가 수신하는 IP 주소와 포트를 구성합니다. 기본값은 127.0.0.1:9000입니다.

listen = 127.0.0.1:9000

사용자 및 그룹 태그는 FastCGI 프로세스를 실행하는 사용자 및 사용자 그룹을 설정하는 데 사용됩니다. 여기에 지정된 사용자 및 사용자 그룹은 Nginx 구성 파일에 지정된 사용자 및 사용자 그룹과 일치해야 합니다.

user = nginx
group = nginx

max_children 태그는 FastCGI 프로세스 수를 설정하는 데 사용됩니다. 공식 권장 사항에 따르면, 2GB 미만의 메모리를 가진 서버는 64개의 프로세스만 열 수 있고, 4GB 이상의 메모리를 가진 서버는 200개의 프로세스만 열 수 있습니다.

<value name="max_children">5</value>

request_terminate_timeout 태그는 FastCGI가 스크립트를 실행하는 시간을 설정하는 데 사용됩니다. 기본값은 0s이며, 이는 무한정 실행된다는 의미입니다. 상황에 따라 수정될 수 있습니다.

<value name="request_terminate_timeout">0s</value>

rlimit_files 태그는 열린 파일 설명자에 대한 PHP-FPM의 제한을 설정하는 데 사용됩니다. 기본값은 1024입니다. 이 레이블의 값은 Linux 커널의 열린 파일 수와 연결되어야 합니다. 예를 들어 이 값을 65535로 설정하려면 Linux 명령줄에서 'ulimit -HSn 65536'을 실행해야 합니다.

<value name="rlimit_files">1024</value>

max_requests 태그는 각 하위 항목이 종료되기 전에 처리할 수 있는 최대 요청 수를 지정합니다. 기본 설정은 500입니다.

pm.max_requests = 500

标签allowed_clients用于设置允许访问FastCGI进程解析器的IP地址。如果不在这里指定IP地址,Nginx转发过来的PHP解析请求将无法被接受。

<value name="allowed_clients">127.0.0.1</value>

5.管理FastCGI进程
在配置完php-fpm后,就可以启动FastCGI进程了。启动fastcgi进程有两种方式:

/usr/local/php/bin/php-cgi --fpm 

或者
/usr/local/php/sbin/php-fpm start 

建议采用第二种方式启动FastCGI进程。
/usr/local/php/sbin/php-fpm还有其他参数,具体为start|stop|quit|restart|reload|logrotate。
每个启动参数的含义如下:

  • q start,启动PHP的FastCGI进程。
  • q stop,强制终止PHP的FastCGI进程。
  • q quit,平滑终止PHP的FastCGI进程。
  • q restart,重启PHP的FastCGI进程。
  • q reload,重新加载PHP的php.ini。
  • q logrotate,重新启用log文件。
  • reload是个很重要的参数,它可以在PHP的FastCGI进程不中断的情况下重新加载改动过的php.ini,因此通过php-fpm可以平滑变更FastCGI模式下的PHP设置。
[root@server79 etc]# /etc/init.d/php-fpm start

配置nginx的主配置文件,打开与php的接口

[root@server79 conf]# pwd
/usr/local/lnmp/nginx/conf
[root@server79 conf]# vim nginx.conf
user nginx;
#
location ~ \.php$ {
root html; 
fastcgi_pass 127.0.0.1:9000; //本地9000端口
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
[root@server79 conf]# nginx -t^C
[root@server79 conf]# nginx -s reload^C
[root@server79 html]# pwd
/usr/local/lnmp/nginx/html
[root@server79 html]# cat index.php
<&#63;php
phpinfo()&#63;>

测试:浏览器中输入192.168.0.179/index.php,出现php页面


PHP解析Nginx日志
nginx日志格式

access_log日志格式

 log_format main '$server_name$remote_addr$remote_user[$time_local]"$request"' 
      '$status$body_bytes_sent"$http_referer"' 
      '"$http_user_agent""$http_x_forwarded_for"'; 


日志参数

    server_name          : 虚拟主机的主机名称 
    remote_addr          : 远程客户端的ip地址 
    remote_user          : 远程客户端用户名称 
    time_local           : 访问的时间与时区 
    status           : 记录请求返回的http状态码 
    body_bytes_sent      : 发送给客户端的文件主体内容的大小 
    http_referer             : 从哪个页面链接访问过来  
    http_user_agent      : 客户端浏览器信息 
    http_x_forwarded_for     : 客户端的真实ip 


日志分割符
使用特殊的不可打印字符^A(ctrl+v,ctrl+a)作为日志分割符


根据关键字过滤文件内容

需求
根据http的请求里是否有“weibo”这个关键字提取文件的内容

php代码

 /** 
  * Description:按行读取文件内容进行过滤匹配 
  * 
  * @return array 
  */ 
 function readFileContent ($filename) 
 { 
  $weibo_content = array(); 
  $fh = @fopen($filename, 'r'); 
   
  if ($fh) { 
   while (! feof($fh)) { 
    $row = fgets($fh, 4096); 
    $row_arr = explode("", $row); 
    if (isset($row_arr[3]) && preg_match('/weibo/', $row_arr[3])) { 
     $weibo_content[] = $row_arr; 
    } 
   } 
  } 
  fclose($fh); 
   
  return $weibo_content; 
 } 

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.