>  기사  >  백엔드 개발  >  전체 PHP 환경(nginx 및 php)을 빠르고 정확하게 구성하는 방법

전체 PHP 환경(nginx 및 php)을 빠르고 정확하게 구성하는 방법

慕斯
慕斯앞으로
2021-05-20 15:12:1210464검색

완전한 PHP 환경(nginx 및 php)을 빠르고 정확하게 구성하는 방법

전체 PHP 환경(nginx 및 php)을 빠르고 정확하게 구성하는 방법

먼저 nginx 작동 방식을 이해해 보겠습니다. https://blog.csdn.net/hguisu/article/details/8930668

一.nginx는 PHP 동적 구문 분석 원리를 구현합니다.

nginx는 고성능 http 서버이자 역방향 프록시 서버입니다. 즉, nginx는 웹사이트 게시 및 처리를 위한 HTTP 서버로 사용될 수 있으며 로드 밸런싱을 위한 역방향 프록시 서버로도 사용될 수 있습니다. 하지만 참고하세요: nginx 자체는 PHP 파일을 구문 분석하지 않습니다. PHP 페이지에 대한 요청은 nginx에 의해 FastCGI 프로세스가 모니터링하는 IP 주소 및 포트로 전달되며, 이는 동적 구문 분석 서버인 php-fpm(타사 fastcgi 프로세스 관리자)에 의해 처리되고 마지막으로 처리됩니다. 결과는 nginx로 반환됩니다. 즉, nginx는 역방향 프록시 기능을 통해 동적 요청을 백엔드 php-fpm으로 전달함으로써 PHP 구문 분석 지원을 실현합니다. 이것이 PHP 동적 구문 분석을 구현하는 Nginx의 기본 원칙입니다.

먼저 몇 가지 개념을 이해해야 합니다. (nginx + php-fpm +fastcgi)

  • Nginx는 운영 체제에서 제공하는 epoll과 유사한 기능을 통해 비차단 IO 및 IO 다중화 모델입니다. 하나의 스레드에서. Nginx의 프로세스는 스레드입니다. 즉, 각 프로세스에는 하나의 스레드만 있지만 이 스레드는 여러 클라이언트에 서비스를 제공할 수 있습니다. 非阻塞IO & IO复用模型,通过操作系统提供的类似 epoll 的功能,可以在一个线程里处理多个客户端的请求。Nginx 的进程就是线程,即每个进程里只有一个线程,但这一个线程可以服务多个客户端。
  • PHP-FPM 是阻塞的单线程模型,pm.max_children 指定的是最大的进程数量,pm.max_requests
  • PHP-FPM은 차단 단일 스레드 모델입니다. pm.max_children은 최대 프로세스 수를 지정하고, pm.max_requests는 각 프로세스가 처리하는 요청 수를 지정합니다. (PHP에서는 가끔 메모리 누수가 발생하므로 다시 시작해야 합니다.) PHP-FPM의 각 프로세스에는 스레드가 하나만 있지만 하나의 프로세스는 동시에 하나의 클라이언트에만 서비스를 제공할 수 있습니다.
  • fastCGI: 서로 다른 언어 해석기(PHP, Python 해석기 등)와 웹 서버 간의 통신 문제를 해결하기 위해 CGI 프로토콜이 등장했습니다. CGI 프로토콜에 따라 프로그램을 작성하면 언어 해석기와 웹서버 간의 통신이 가능합니다. php-cgi 프로그램과 같은 것입니다. 그러나 웹서버가 요청을 받을 때마다 cgi 프로세스를 분기하고 요청이 완료된 후 프로세스를 종료합니다. 요청이 10,000개라면 php-cgi 프로세스를 10,000번 포크하고 종료해야 합니다. fastcgi는 cgi의 향상된 버전입니다. fast-cgi는 각 요청을 처리한 후 프로세스를 종료하지 않지만 프로세스가 한 번에 여러 요청을 처리할 수 있도록 프로세스를 유지합니다. 효율성이 크게 향상되었습니다.

보충: 역방향 프록시 및 순방향 프록시에 대한 지식(간략히 말하면 클라이언트에 대한 순방향 프록시 작동, 서버에 대한 역방향 프록시 작동)


정방향 프록시 사용:
              ( 1) 원래 액세스할 수 없었던 리소스에 액세스 , Google과 같은
                    (2) 리소스에 대한 액세스 속도를 높이기 위해 캐싱을 수행할 수 있습니다.         . 사용자 정보 숨기기)

역방향 프록시 사용: 역방향 프록시, 즉 "서버에 대한 프록시 역할을 합니다"는 주로 다음에서 사용됩니다. 서버 클러스터의 분산 배포는 서버 정보를 숨깁니다.

                    (1) 인트라넷의 보안을 보장하기 위해 일반적으로 역방향 프록시를 공용 네트워크 액세스 주소로 사용하고 웹 서버는 인트라넷입니다. 역방향 프록시 서버를 사용하여 로드를 최적화합니다. 웹사이트

2.nginx PHP 동적 파싱 구현. nginx 구성 방법

1. nginx 구성 관련 상식을 이해합니다

(nginx.conf)nginx.conf 구성 및 기본 구성 구문은 다음과 같습니다. 여기서 분석할 다른 기사에 설명되어 있습니다. PHP 구성에 사용되는 여러 구문에 대한 간략한 소개:

try_files $uri $uri/ /index.php$is_args$args : (https://blog.51cto.com/ 13930997/2311716,,, Nginx try_files 함정 ---
    try_files 마지막 위치(대체)는 특별합니다. 파일 시스템에서 파일을 직접 찾는 대신 내부 "하위 요청"을 발행합니다!!!
  • ) nginx 위치 ~ .php$ 구성에 대한 질문 (https://segmentfault.com/q/1010000012298020)
  • rewrite (https://segmentfault.com/a/1190000002797606)
  • 부록: nginx 구성 관련 구문 (nginx에는 사용 가능한 일부 전역 변수도 포함되어 있습니다. 자세한 내용은 링크를 참조하세요. 또한 nginx 공식 문서 http://www.nginx.org/ https://www.cnblogs.com/knowledgesea/p/를 볼 수도 있습니다. 5175711.html)
2. nginx 파싱 php

구성 예

server {
    listen       8000 backlog=4096;
    server_name  www.baidu.com localhost;
    access_log logs/access.log main;
    root   /home/leimengyao/api/app/htdocs;

    location / {
        index  index.php index.html index.htm;
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass unix:/home/leimengyao/php7/var/run/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /home/leimengyao/api/app/htdocs$fastcgi_script_name;
        include        fastcgi_params;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ /\.ht {
        deny  all;
    }
}

如上配置,当一个http请求到来时,被处理的过程如下:

以http://10.94.120.124:8000/A/B?c=1&d=4为例:

  • http请求到来后,通过server全局块里监听的端口号,匹配到相应server。然后接下来进行location路径的匹配。
  • 首先匹配到location / ,在这个匹配规则中,通过try_files 先在root目录(/home/leimengyao/api/app/htdocs)下查找是否有$uri文件;没有匹配到,然后再查找root目录下是否有$uri/目录;同样没有匹配到,则匹配最后一项/index.php?$args,即发出一个"内部子请求",也就相当于nginx发起了一个http请求到http://10.94.120.124:8000/index.php?c=1&d=4
  • 这个子请求会被location ~ \.php${ ... }catch住,也就是进入 FastCGI 的处理程序(nginx需要通过FastCGI模块配置,将相关php参数传递给php-fpm处理。在该项中设置了fastcgi_pass相关参数,将用户请求的资源发给php-fpm进行解析,这里涉及到nginx FastCGI模块的相关配置语法下文会介绍)。而具体的 URI 及参数是在 REQUEST_URI 中传递给 FastCGI 和 WordPress 程序的,因此不受 URI 变化的影响!!!!。
    public static function detectPath() {
        if (!empty($_SERVER['SCRIPT_URL'])) {
            $path = $_SERVER['SCRIPT_URL'];
        } else {
            //as: www.baidu.com/A/B?saadf=esdf
            if (isset($_SERVER['REQUEST_URI'])) {
              //$_SERVER['REQUEST_URI']="/m/test?saadf=esdf";
                $request_uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
                if (false !== $request_uri) {
                    $path = $request_uri;
                  //echo $path; /A/B
                  //exit;
            } elseif ($_SERVER['REQUEST_URI'] && strpos($_SERVER['REQUEST_URI'], '?') !== false) {
                $path = strstr($_SERVER['REQUEST_URI'], '?', true);
            }
            } else {
                $path = $_SERVER['PHP_SELF'];
            }
        }
        return $path;
    }

3. Nginx配置.之PHP FastCGI

首先需要了解一些文件。(nginx.conf + fastcgi_params + php-fpm.conf + php.ini)

  • fastcgi_params 文件一般保存在/usr/local/etc/nginx下(Ubuntu可保存于/etc/nginx下),它为FastCGI模块定义了基本的环境变量。这些fastcgi环境变量,我们在配置nginx的fastcgi_params时会用到。内容见下:

  • Nginx.conf 的PHP FastCGI模块允许nginx同FastCGI协同工作,并且控制哪些参数将被安全传递。常见的fastcgi参数配置含义下文会具体介绍。配置范例如下:
    location / {
      fastcgi_pass   localhost:9000;
      fastcgi_index  index.php;
     
      fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;
      fastcgi_param  QUERY_STRING     $query_string;
      fastcgi_param  REQUEST_METHOD   $request_method;
      fastcgi_param  CONTENT_TYPE     $content_type;
      fastcgi_param  CONTENT_LENGTH   $content_length;
    }

 

(https://www.jianshu.com/p/9bae5c49a163)

  • php-fpm.conf
  • php.ini   使用php --ini查看php加载的配置文件路径(https://www.jianshu.com/p/a118f10d738c)

       查看发现配置文件目录在/etc目录,但是加载php.ini显示为none;切换到/etc下目录查看,确实没有php.ini文件。

复制php.ini.default为php.ini,再次执行php --ini  查看发现加载php.ini文件成功

php -m 查看会列出命令行 PHP Cli 已经安装的扩展。

查看php拓展安装目录命令:   php-config | grep -i extension (http://www.blogdaren.com/post-2520.html)

切换到该目录下查看拓展

其次了解一些nginx.conf中常用fastcgi配置的含义

  • fastcgi_pass:该参数设置的是nginx与php-fpm的通信方式,nginx和php-fpm的通信方式有两种,一种是socket形式,一种是tcp形式。配置两种方式都可以,但是必须保证nginx配置的监听方式,和php-fpm.conf配置的监听方式保持一致性!(https://segmentfault.com/q/1010000004854045、https://www.jianshu.com/p/eab11cd1bb28)

其中TCP是IP加端口,可以跨服务器.而UNIX Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景.用哪种取决于你的PHP-FPM配置:
方式1:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
方式2:
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-

<br/>

fpm.sock;
其中php-fpm.sock是一个文件,由php-fpm生成,类型是srw-rw----.

 

UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的.这种通信方式是发生在系统内核里而不会在网络里传播.UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致TIME_WAIT连接过多的问题.对于进程间通讯的两个程序,UNIX Domain Socket的流程不会走到TCP那层,直接以文件形式,以stream socket通讯.如果是TCP Socket,则需要走到IP层,对于非同一台服务器上,TCP Socket走的就更多了.

UNIX Domain Socket:
Nginx 96b4fef55684b9312718d5de63fb7121 socket 96b4fef55684b9312718d5de63fb7121 PHP-FPM
TCP Socket(本地回环):
Nginx 96b4fef55684b9312718d5de63fb7121 socket 96b4fef55684b9312718d5de63fb7121 TCP/IP 96b4fef55684b9312718d5de63fb7121 socket 96b4fef55684b9312718d5de63fb7121 PHP-FPM
TCP Socket(Nginx和PHP-FPM位于不同服务器):
Nginx 96b4fef55684b9312718d5de63fb7121 socket 96b4fef55684b9312718d5de63fb7121 TCP/IP 96b4fef55684b9312718d5de63fb7121 物理层 96b4fef55684b9312718d5de63fb7121 路由器 96b4fef55684b9312718d5de63fb7121 物理层 96b4fef55684b9312718d5de63fb7121 TCP/IP 96b4fef55684b9312718d5de63fb7121 socket 96b4fef55684b9312718d5de63fb7121 PHP-FPM

  • fastcgi_index:
  • fastcgi_param:

 

以上配置文件全部修改完成以后,需要进行重启nginx和php-fpm,修改的内容才能生效:

  • 修改配置(nginx.conf,php-fpm.conf,php.ini)需要进行的操作(修改配置的时候通过 find / -name php-fpm.conf命令来查找),另外重启php-fpm(mac重启php-fpm)和nginx (nginx -s reload     https://www.jianshu.com/p/2726ca520f4a 、  https://www.jianshu.com/p/9bae5c49a163)

三.nginx实现php动态解析.之配置过程中常见错误

  1. php-fpm需要进行一些配置修改(超时时长:request_slowlog_timeout等   php-fpm 的request_terminate_timeout设置不当导致的502错误)
  2. Nginx-配置误区 (fastcgi_param SCRIPT_FILENAME)
  3. Nginx + Php-fpm 一个神奇的502错误
  4. nginx+php-fpm打开index.php显示空白
  5. php国际化插件安装、debug插件安装(extension  php.ini)
  6. php缓存信息关闭(https://www.cnblogs.com/JohnABC/p/3529786.html   !!开启缓存会引起许多问题,视情况而定
  7. ?php执行流程https://www.jianshu.com/p/042c56e08939

四.Mac下配置神器PhpStrom开发环境

https://blog.csdn.net/tfy_2425482491/article/details/79377672

点击debug报如下错误:安装debug扩展

五.php依赖管理工具-composer

 

六.其他

    redis(https://www.jianshu.com/p/018bbf5ff42a)

    php    call_user_func_array(https://www.jianshu.com/p/1c0f30d8722d)

推荐学习:《PHP视频教程 

위 내용은 전체 PHP 환경(nginx 및 php)을 빠르고 정확하게 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제