如何快速正確配置完整的php環境(nginx和php)

慕斯
發布: 2023-04-10 06:16:01
轉載
10564 人瀏覽過

如何快速正確配置完整的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的解析支持,這就是Nginx實現PHP動態解析的基本原理。

首先需要了解一些概念。 (nginx php-fpm fastcgi)

  • Nginx 是非阻塞IO & IO複用模型,透過作業系統提供的類似epoll 的功能,可以在一個線程裡處理多個客戶端的請求。 Nginx 的進程就是線程,也就是每個行程只有一個線程,但這一個執行緒可以服務多個客戶端。
  • PHP-FPM 是阻塞的單執行緒模型,pm.max_children 指定的是最大的行程數量,pm.max_requests 指定的是每個行程處理多少個請求後重啟(因為PHP 偶爾會有記憶體洩漏,所以需要重啟)。 PHP-FPM 的每個行程也只有一個線程,但是一個行程同時只能服務一個客戶端。
  • fastCGI :為了解決不同的語言解釋器(如php、python解釋器)與webserver的通信,於是出現了cgi協定。只要你依照cgi協定去寫程序,就能實作語言解釋器與webwerver的通訊。如php-cgi程序。但是webserver每收到一個請求,都會去fork一個cgi程序,請求結束再kill掉這個程序。這樣有10000個請求,就需要fork、kill php-cgi行程10000次。 fastcgi是cgi的改良版本。 fast-cgi每次處理完請求後,不會kill掉這個行程,而是保留這個行程,讓這個行程可以一次處理多個請求。大大提高了效率。

補充:反向代理與正向代理的相關知識(簡言之,正向代理-代理的是客戶端;反向代理-代理的是伺服器)

正向代理程式的用途:
                (1)存取原先無法存取的資源,如Google
               (2) 為授權,上網進行認證
                (4)代理可以記錄用戶訪問記錄上網行為管理,對外隱藏用戶信息)

反向代理的用途:反向代理,"它代理的是服務端",主要用於伺服器叢集分散式部署的情況下,反向代理隱藏了伺服器的資訊。

               (1)確保內網的安全,通常以反向代理程式為公網存取位址,Web伺服器是內網
               (2)負載,透過反向代理伺服器來最佳化網站負載,透過反向負載#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 的最後一個坑位置(fall back)是特別的,它會發出一個內部「子請求」 而不是直接在檔案系統裡尋找這個檔案!!!
  • )對nginx location ~ \.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 )#cnblogs.com/knowledgesea/p/5175711.html )#cnblogs.com/knowledgesea/p/5175711.html )#cnblogs.com/knowledgesea/p/5175711.html )#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配置:<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中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板