ホームページ > バックエンド開発 > PHPチュートリアル > 完全な PHP 環境 (nginx と PHP) を迅速かつ正確に構成する方法

完全な PHP 環境 (nginx と PHP) を迅速かつ正確に構成する方法

慕斯
リリース: 2023-04-10 06:16:01
転載
10597 人が閲覧しました

完全な php 環境 (nginx と php) を迅速かつ正確に構成する方法

完全な PHP 環境 (nginx と PHP) を迅速かつ正確に構成する方法

まず、nginx がどのように機能するかを理解しましょう: https://blog. csdn.net/hguisu/article/details/8930668

1.nginx は PHP 動的解析原理を実装します

nginx は、高性能の http サーバーであり、その逆の機能を備えています。プロキシサーバー。つまり、nginx は、Web サイトの公開と処理のための HTTP サーバーとして使用でき、負荷分散のためのリバース プロキシ サーバーとしても使用できます。 ただし、nginx 自体は php ファイルを解析しないことに注意してください。 PHP ページに対するリクエストは、nginx によって FastCGI プロセスによって監視されている IP アドレスとポートに渡され、動的解析サーバーとして php-fpm (サードパーティの fastCGI プロセス マネージャー) によって処理され、最後に処理結果は nginx に返されます。つまり、nginx はリバースプロキシ機能を介して動的リクエストをバックエンドの php-fpm に転送することで PHP 解析のサポートを実現する、これが Nginx が PHP 動的解析を実装する基本原理です。

まず、いくつかの概念を理解する必要があります。 (nginx php-fpm fastcgi)

  • Nginx は、ノンブロッキング IO および IO 多重化モデルです。システムでは、複数のクライアント要求を 1 つのスレッドで処理できます。 Nginx のプロセスはスレッドです。つまり、各プロセスには 1 つのスレッドしかありませんが、このスレッドは複数のクライアントにサービスを提供できます。
  • PHP-FPM はブロッキング シングル スレッド モデルです。pm.max_children はプロセスの最大数を指定します。pm.max_requests は各プロセスが処理するプロセスの数を指定します。リクエスト後 (PHP ではメモリ リークが発生する場合があるため、再起動する必要があります)。 PHP-FPM の各プロセスにもスレッドは 1 つだけありますが、1 つのプロセスが同時にサービスを提供できるのは 1 つのクライアントのみです。
  • fastCGI: 異なる言語のインタープリター (php、python インタープリターなど) と Web サーバー間の通信の問題を解決するために、CGI プロトコルが登場しました。 CGI プロトコルに従ってプログラムを作成する限り、言語インタプリタと Webwerver 間の通信を実現できます。 php-cgiプログラムなど。ただし、Web サーバーはリクエストを受信するたびに CGI プロセスをフォークし、リクエストの完了後にプロセスを強制終了します。リクエストが 10,000 件ある場合、php-cgi プロセスを 10,000 回フォークして強制終了する必要があります。 fastcgi は cgi の改良版です。 fast-cgi は毎回リクエストを処理した後、プロセスを強制終了せずにプロセスを保持し、プロセスが一度に複数のリクエストを処理できるようにします。効率が大幅に向上しました。

補足: リバース プロキシとフォワード プロキシに関する関連知識 (つまり、フォワード プロキシはクライアントに対して機能し、リバース プロキシはサーバーに対して機能します)

目的肯定的なエージェントの:
(1) Google など、アクセスできなかったリソースにアクセスします。
(2) キャッシュを実行し、アクセス リソースを高速化できます。
(3) クライアントのアクセス許可にアクセスします。認証のためにオンラインにする
(4) プロキシはユーザーのアクセス記録、オンライン行動管理、ユーザー情報を外部から隠すことができます)

リバースプロキシの使用: リバースプロキシ、「プロキシとして機能します」 「サーバー用」、主にサーバー クラスターの分散展開で使用される場合、リバース プロキシはサーバー情報を隠します。
(1) 内部ネットワークのセキュリティを確保するため、通常、パブリック ネットワークのアドレスとしてリバース プロキシが使用され、Web サーバーが内部ネットワークになります
(2) 負荷分散

2.nginx は PHP 動的解析を実装します。nginx の設定方法

#1. nginx 設定に関する常識を理解する (nginx.conf )

nginx.conf の構成と基本的な構成構文は別の記事で説明されていますが、ここでは、PHP 構成の解析に使用されるいくつかの構文を簡単に紹介します。 $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 リクエストが到着すると、サーバー グローバル ブロックでリッスンされたポート番号を通じて、対応するサーバーが照合されます。次に、場所のパスの一致に進みます。
  • 最初に一致する場所 /. この一致ルールでは、まず、try_files を通じてルート ディレクトリ (/home/leimengyao/api/app/htdocs) で $uri ファイルを検索します。一致しない場合は、ルート ディレクトリに $uri/ ディレクトリがあるかどうかを確認します。一致するものがない場合は、最後の項目 /index.php?$args と一致します。つまり、「内部サブリクエスト」の発行は、nginx が http://10.94.120.124:8000/index.php?c=1&d=4
  • への http リクエストを開始するのと同じです。このサブリクエストは次のようになります。 location ~ \.php${ ... }catch、つまり、FastCGI 処理プログラムを入力します (nginx は FastCGI モジュールを通じて設定し、処理のために関連する php パラメーターを php-fpm に渡す必要があります)。 Fastcgi_pass はこの項目に設定されます。関連するパラメーターは、ユーザーが要求したリソースを解析のために php-fpm に送信します。これには、nginx FastCGI モジュール の関連する設定構文が含まれます。これについては、以下で紹介します)。特定の URI とパラメーターは、R​​EQUEST_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 をロードしても何も表示されません。 /etc の下のディレクトリに切り替えて確認すると、確かに php.ini ファイルが存在しません。

#php.ini.default を php.ini にコピーし、php --ini を再度実行して、php.ini ファイルが正常に読み込まれていることを確認します

#php -m View は、コマンド ライン PHP Cli によってインストールされた拡張機能をリストします。

php 拡張機能のインストール ディレクトリを表示するコマンド:

php-config | grep -i extension (http://www.blogdaren.com/post-2520.html) )

このディレクトリに切り替えて拡張機能を表示します

次に、いくつかの一般的な

fastcgi 構成について学習します。 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配置:<br/> 方式1:<br/> php-fpm.conf: listen = 127.0.0.1:9000<br/> nginx.conf: fastcgi_pass 127.0.0.1:9000;<br/> 方式2:<br/> php-fpm.conf: listen = /tmp/php-fpm.sock<br/> 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 <=> socket <=> PHP-FPM
TCP Socket(本地回环):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(Nginx和PHP-FPM位于不同服务器):
Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート