Maison  >  Article  >  développement back-end  >  Comment configurer rapidement et correctement un environnement php complet (nginx et php)

Comment configurer rapidement et correctement un environnement php complet (nginx et php)

慕斯
慕斯avant
2021-05-20 15:12:1210464parcourir

Comment configurer rapidement et correctement un environnement php complet (nginx et php)

Comment configurer rapidement et correctement un environnement php complet (nginx et php)

Tout d'abord, comprenons comment fonctionne nginx : https://blog. csdn.net/hguisu/article/details/8930668

1.nginx implémente le principe d'analyse dynamique PHP

nginx est un serveur http et inversement hautes performances serveur proxy. C'est-à-dire que nginx peut être utilisé comme serveur HTTP pour la publication et le traitement de sites Web, et il peut également être utilisé comme serveur proxy inverse pour l'équilibrage de charge. Mais il convient de noter que nginx lui-même n'analyse pas les fichiers PHP. Les demandes de pages PHP seront transmises par nginx à l'adresse IP et au port surveillés par le processus FastCGI, qui seront traitées par php-fpm (un gestionnaire de processus fastcgi tiers) en tant que serveur d'analyse dynamique, et enfin les résultats du traitement seront renvoyés à nginx . Autrement dit, nginx transmet les requêtes dynamiques au backend php-fpm via la fonction de proxy inverse, réalisant ainsi la prise en charge de l'analyse PHP. C'est le principe de base de l'implémentation de l'analyse dynamique PHP par Nginx.

Vous devez d’abord comprendre certains concepts. (nginx + php-fpm +fastcgi)

  • Nginx est un modèle 非阻塞IO & IO复用 qui peut gérer plusieurs clients dans un seul thread grâce à la fonction de type epoll fournie par le système d'exploitation fin de la demande. Le processus de Nginx est un thread, c'est-à-dire qu'il n'y a qu'un seul thread dans chaque processus, mais ce thread peut servir plusieurs clients.
  • PHP-FPM est un modèle monothread bloquant. pm.max_children spécifie le nombre maximum de processus pm.max_requests spécifie le nombre de requêtes que chaque processus gère avant de redémarrer (car PHP a parfois des fuites de mémoire, donc un redémarrage. est obligatoire). Chaque processus de PHP-FPM n'a également qu'un seul thread, mais un processus ne peut servir qu'un seul client à la fois.
  • fastCGI : Afin de résoudre le problème de communication entre les différents interpréteurs de langage (tels que les interpréteurs php, python) et le serveur web, le protocole cgi est apparu. Tant que vous écrivez un programme selon le protocole cgi, vous pouvez établir une communication entre l'interprète de langage et le serveur Web. Tel que le programme php-cgi. Mais chaque fois que le serveur Web reçoit une requête, il lancera un processus cgi, puis tuera le processus une fois la requête terminée. S'il y a 10 000 requêtes, le processus php-cgi doit être bifurqué et tué 10 000 fois. fastcgi est une version améliorée de cgi. Une fois que fast-cgi a traité une requête à chaque fois, il ne tuera pas le processus, mais le conservera afin qu'il puisse gérer plusieurs requêtes à la fois. Efficacité grandement améliorée.

Connaissances supplémentaires sur le proxy inverse et le proxy direct (en bref, les actes de proxy direct pour le client ; les actes de proxy inverse pour le serveur)

Le but du positif proxy :

(1) accéder aux ressources inaccessibles, telles que Google
(2) peut être utilisé comme cache, accélérer l'accès aux ressources
(3) Accès à l'autorisation d'accès client, Aller en ligne Pour l'authentification
(4), le proxy peut enregistrer les enregistrements d'accès aux utilisateurs, la gestion du comportement en ligne et masquer les informations de l'utilisateur de l'extérieur) lorsqu'elle est utilisée dans le déploiement distribué de clusters de serveur, les informations sur le serveur de cache vers le proxy inversé.
                (1) Pour assurer la sécurité de l'intranet, le proxy inverse est généralement utilisé comme adresse d'accès au réseau public, et le serveur Web est l'intranet

                      (2) Équilibrage de charge, via le serveur proxy inverse pour optimiser la charge du site Web



2. nginx implémente l'analyse dynamique php

1. configuration

(nginx.conf )Pour plus de détails sur la composition de nginx.conf et la syntaxe de configuration de base, veuillez vous référer à un autre article. Ici, nous donnerons une brève introduction à plusieurs. syntaxes utilisées pour analyser la configuration PHP :

try_files $uri $uri/ /index.php$is_args$args : (https://blog.51cto.com/13930997/2311716,,, un piège dans Nginx try_files ---

Le dernier des try_files L'emplacement (repli) est spécial, il émettra une "sous-requête" interne au lieu de rechercher directement le fichier dans le système de fichiers !!!
    )
  • Configuré pour l'emplacement nginx ~ .php$ Une question (https://segmentfault.com/q/1010000012298020)
  • réécriture (https://segmentfault.com/a/1190000002797606)
  • Annexe : syntaxe liée à la configuration de nginx (notez nginx Il contient également certaines variables globales disponibles, voir le lien pour plus de détails ; vous pouvez également consulter la documentation officielle de nginx http://www.nginx.org/ https:/ /www.cnblogs.com/knowledgesea/p/5175711.html )
  • 2. Exemple de configuration de l'analyse nginx de 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;
    }
}

Comme configuré ci-dessus, lorsqu'une requête http arrive, le processus est le suivant :

Prenons http://10.94.120.124:8000/A/B?c=1&d=4 comme exemple :

  • Après l'arrivée de la requête http, le serveur correspondant est mis en correspondance via le numéro de port surveillé dans le bloc global du serveur. Ensuite, faites correspondre le chemin de localisation.
  • correspond en premier à l'emplacement /. Dans cette règle de correspondance, utilisez try_files pour rechercher d'abord s'il existe un fichier $uri dans le répertoire racine (/home/leimengyao/api/app/htdocs). ; S'il n'y a pas de correspondance, vérifiez s'il y a un répertoire $uri/ dans le répertoire racine ; s'il n'y a pas de correspondance, faites correspondre le dernier élément /index.php?$args, c'est-à-dire émettre une "sous-requête interne" équivaut à nginx initiant une requête http à http://10.94.120.124:8000/index.php?c=1&d=4
  • Cette sous- La requête sera location ~ .php${ ... } catch, c'est-à-dire entrez le gestionnaire FastCGI (nginx doit être configuré via le module FastCGI pour transmettre les paramètres php pertinents à php-fpm pour le traitement. Les paramètres liés à Fastcgi_pass sont définis dans cet élément, et les ressources demandées par l'utilisateur sont envoyées à php-fpm pour traitement, cela implique la syntaxe de configuration pertinente du module nginx FastCGI qui sera présentée ci-dessous). L'URI et les paramètres spécifiques sont transmis aux programmes FastCGI et WordPress dans REQUEST_URI, afin qu'ils ne soient pas affectés par les modifications d'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. Configuration de Nginx PHP FastCGI

Vous devez d'abord comprendre certains fichiers. (nginx.conf + fastcgi_params + php-fpm.conf + php.ini)

  • fastcgi_params Le fichier est généralement enregistré dans /usr/local/ etc/ Sous nginx (Ubuntu peut être enregistré sous /etc/nginx), il définit les variables d'environnement de base pour le module FastCGI. Ces variables d'environnement fastcgi seront utilisées lors de la configuration des fastcgi_params de nginx. Le contenu est le suivant :

  • Nginx.conf Le module PHP FastCGI de permet à nginx de fonctionner avec FastCGI et contrôle quels paramètres seront transmis en toute sécurité. La signification des configurations de paramètres fastcgi courantes sera présentée en détail ci-dessous. L'exemple de configuration est le suivant :
    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 Utilisez php --ini pour afficher le chemin du fichier de configuration chargé par php(https://www. jianshu.com/p /a118f10d738c)

Vérifiez et trouvez que le répertoire du fichier de configuration se trouve dans le répertoire /etc, mais le chargement de php.ini n'en affiche aucun ; dans le répertoire /etc pour vérifier, il n'y a effectivement pas le fichier php.ini.

Copiez php.ini.default dans php.ini, exécutez à nouveau php --ini et vérifiez que le fichier php.ini a été chargé avec succès

php -m View listera les extensions installées de la ligne de commande PHP Cli.

Affichez la commande du répertoire d'installation de l'extension php : php-config | grep -i extension (http://www.blogdaren.com/post-2520.html )

Basculez vers ce répertoire pour afficher l'extension

Deuxièmement, découvrez certains fastcgi couramment utilisés configurations dans nginx.conf La signification de

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer