Heim  >  Artikel  >  Backend-Entwicklung  >  So konfigurieren Sie schnell und korrekt eine vollständige PHP-Umgebung (Nginx und PHP)

So konfigurieren Sie schnell und korrekt eine vollständige PHP-Umgebung (Nginx und PHP)

慕斯
慕斯nach vorne
2021-05-20 15:12:1210464Durchsuche

So konfigurieren Sie schnell und korrekt eine vollständige PHP-Umgebung (Nginx und PHP)

So konfigurieren Sie schnell und korrekt eine vollständige PHP-Umgebung (Nginx und PHP)

Lassen Sie uns zunächst verstehen, wie Nginx funktioniert: https://blog.csdn.net/hguisu/article/details/8930668

一.nginx implementiert das dynamische PHP-Parsing-Prinzip

nginx ist ein leistungsstarker http-Server und Reverse-Proxy-Server. Das heißt, Nginx kann als HTTP-Server für die Veröffentlichung und Verarbeitung von Websites und auch als Reverse-Proxy-Server für den Lastausgleich verwendet werden. Aber bitte beachten Sie: Nginx selbst analysiert keine PHP-Dateien. Anfragen für PHP-Seiten werden von nginx an die vom FastCGI-Prozess überwachte IP-Adresse und den Port übergeben, die von php-fpm (einem Fastcgi-Prozessmanager eines Drittanbieters) als dynamischer Parsing-Server verarbeitet und schließlich verarbeitet werden Die Ergebnisse werden an Nginx zurückgegeben. Das heißt, Nginx leitet dynamische Anforderungen über die Reverse-Proxy-Funktion an das Backend php-fpm weiter und realisiert so die Unterstützung für PHP-Analyse. Dies ist das Grundprinzip der dynamischen PHP-Analyse durch Nginx.

Zuerst müssen Sie einige Konzepte verstehen. (nginx + php-fpm +fastcgi)

  • Nginx ist ein nicht blockierendes IO- und IO-Multiplexing-Modell. Durch die vom Betriebssystem bereitgestellte Epoll-ähnliche Funktion können mehrere IOs verarbeitet werden in einem Thread. Der Prozess von Nginx ist ein Thread, das heißt, es gibt in jedem Prozess nur einen Thread, dieser Thread kann jedoch mehrere Clients bedienen. 非阻塞IO & IO复用模型,通过操作系统提供的类似 epoll 的功能,可以在一个线程里处理多个客户端的请求。Nginx 的进程就是线程,即每个进程里只有一个线程,但这一个线程可以服务多个客户端。
  • PHP-FPM 是阻塞的单线程模型,pm.max_children 指定的是最大的进程数量,pm.max_requests
  • PHP-FPM ist ein blockierendes Single-Thread-Modell. pm.max_children gibt die maximale Anzahl von Prozessen an (da PHP gelegentlich Speicherlecks aufweist und daher neu gestartet werden muss). Jeder Prozess von PHP-FPM hat auch nur einen Thread, aber ein Prozess kann nur einen Client gleichzeitig bedienen.
  • fastCGI: Um das Kommunikationsproblem zwischen verschiedenen Sprachinterpretern (z. B. PHP-, Python-Interpretern) und dem Webserver zu lösen, wurde das CGI-Protokoll eingeführt. Solange Sie ein Programm gemäß dem CGI-Protokoll schreiben, können Sie eine Kommunikation zwischen dem Sprachinterpreter und dem Webwerver erreichen. Wie zum Beispiel ein PHP-CGI-Programm. Aber jedes Mal, wenn der Webserver eine Anfrage erhält, gibt er einen CGI-Prozess ab und bricht den Prozess ab, nachdem die Anfrage abgeschlossen ist. Bei 10.000 Anfragen muss der PHP-CGI-Prozess 10.000 Mal geforkt und beendet werden. fastcgi ist eine verbesserte Version von CGI. Nachdem jede Anforderung von fast-cgi verarbeitet wurde, wird der Prozess nicht beendet, sondern beibehalten, sodass der Prozess mehrere Anforderungen gleichzeitig verarbeiten kann. Deutlich verbesserte Effizienz.

Ergänzung: Kenntnisse über Reverse-Proxy und Forward-Proxy (kurz: Forward-Proxy-Vorgänge für den Client; Reverse-Proxy-Vorgänge für den Server)


Verwendung von Forward-Proxy:
              ( 1) Zugriff auf Ressourcen, auf die ursprünglich nicht zugegriffen werden konnte , wie Google
                      (2) Caching kann durchgeführt werden, um den Zugriff auf Ressourcen zu beschleunigen
                                                . Benutzerinformationen ausblenden)

Verwendung von Reverse-Proxy: Reverse-Proxy, „er fungiert als Proxy für den Server“, wird hauptsächlich in verwendet Die verteilte Bereitstellung von Serverclustern verbirgt Serverinformationen.网 (1) Um die Sicherheit des internen Netzwerks zu gewährleisten, wird normalerweise der Reverse-Proxy als Adresse des öffentlichen Netzwerks verwendet. Der Webserver ist das interne Netzwerk.
(2) Die Auslastung der Website wird optimiert Reverse-Proxy-Server. Wie man Nginx konfiguriert

1 , das hier analysiert wird. Eine kurze Einführung in verschiedene Syntaxen, die in der PHP-Konfiguration verwendet werden:

try_files $uri $uri/ /index.php$is_args$args : (https://blog.51cto.com/13930997/2311716, ,, Nginx try_files Es gibt eine Falle in ---

try_files Der letzte Speicherort (Fallback) ist etwas Besonderes, er wird eine interne „Unteranforderung“ ausgeben, anstatt direkt im Dateisystem nach der Datei zu suchen!!!) Nginx-Speicherort ~ Eine Frage zur .php$-Konfiguration (https://segmentfault.com/q/1010000012298020)

rewrite (https://segmentfault.com/a/1190000002797606)

Anhang: Nginx-Konfigurationsbezogene Syntax ( Beachten Sie, dass Nginx auch einige verfügbare globale Variablen enthält. Weitere Informationen finden Sie unter dem Link. Sie können sich auch die offizielle Nginx-Dokumentation ansehen: http://www.nginx.org/ https://www.cnblogs.com/knowledgesea/p/5175711 .html)
  • 2. Konfigurationsbeispiel für Nginx-Parsing 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;
        }
    }

    Wie oben konfiguriert, läuft beim Eintreffen einer http-Anfrage der Prozess wie folgt ab:

    Nehmen Sie http://10.94.120.124:8000/A/B?c=1&d=4 als Beispiel:

    • Nach dem http Die Anforderung kommt an und entspricht dem entsprechenden Server über die Überwachungsportnummer im globalen Serverblock. Fahren Sie dann mit der Zuordnung des Standortpfads fort.
    • Erster Übereinstimmungsort /. Suchen Sie in dieser Übereinstimmungsregel zunächst im Stammverzeichnis (/home/leimengyao/api/app/htdocs) nach einer $uri-Datei. dann nach root suchen Gibt es ein $uri/-Verzeichnis im Verzeichnis? Wenn es keine Übereinstimmung gibt, stimmt das letzte Element mit /index.php?$args überein, d. Dies entspricht dem Initiieren einer HTTP-Anfrage durch Nginx. Gehen Sie zu http://10.94.120.124:8000/index.php?c=1&d=4
    • Diese Unteranfrage wird von location ~ .php${ ... }catch abgefangen, das heißt, sie wird eingegeben Der FastCGI-Handler (nginx muss über das FastCGI-Modul und die relevanten PHP-Parameter konfiguriert werden. Übergeben Sie ihn zur Verarbeitung an PHP-FPM. In diesem Element werden Fastcgi_pass-bezogene Parameter festgelegt und die vom Benutzer angeforderten Ressourcen werden an PHP-FPM gesendet Die relevante Konfigurationssyntax des nginx FastCGI-Moduls wird im Folgenden vorgestellt. Der spezifische URI und die Parameter werden in REQUEST_URI an FastCGI- und WordPress-Programme übergeben, sodass sie von URI-Änderungen nicht betroffen sind! ! ! ! .
      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-Konfiguration

    Zuerst müssen Sie einige Dateien verstehen.

    (nginx.conf + fastcgi_params + php-fpm.conf + php.ini)

    • fastcgi_params Die Datei wird im Allgemeinen unter /usr/local/etc/nginx gespeichert (Ubuntu kann unter /etc/nginx gespeichert werden) , Es definiert grundlegende Umgebungsvariablen für das FastCGI-Modul. Diese fastcgi-Umgebungsvariablen werden bei der Konfiguration der fastcgi_params von nginx verwendet. Der Inhalt ist wie folgt:

    • Nginx.conf Das PHP-FastCGI-Modul ermöglicht Nginx die Zusammenarbeit mit FastCGI und steuert, welche Parameter sicher übergeben werden. Die Bedeutung gängiger Fastcgi-Parameterkonfigurationen wird im Folgenden ausführlich vorgestellt. Das Konfigurationsbeispiel lautet wie folgt:
      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 Verwenden Sie php --ini So zeigen Sie den Pfad der Konfigurationsdatei beim Laden von PHP an (https://www.jianshu.com/p/a118f10d738c)

    Überprüfen Sie, ob sich das Konfigurationsdateiverzeichnis im Verzeichnis /etc befindet, aber PHP wird geladen. ini zeigt keine; wechseln Sie zu /etc. Überprüfen Sie das Verzeichnis und es gibt tatsächlich keine php.ini-Datei.

    Kopieren Sie php.ini.default nach php.ini, führen Sie php --ini erneut aus und überprüfen Sie, ob die php.ini-Datei erfolgreich geladen wurde.

    php -m Überprüfen Sie, ob die Befehlszeilen-PHP-Cli-Erweiterungen installiert sind wird aufgelistet.

    Zeigen Sie den Befehl zum Installationsverzeichnis der PHP-Erweiterung:

    php-config | die Erweiterung

    Zweitens verstehen Sie die Bedeutung einiger häufig verwendeter

    Fastcgi-Konfigurationen in nginx.conf

    • 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视频教程 

Das obige ist der detaillierte Inhalt vonSo konfigurieren Sie schnell und korrekt eine vollständige PHP-Umgebung (Nginx und PHP). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen