目錄
一.nginx實作php動態解析原理
三.nginx实现php动态解析.之配置过程中常见错误
五.php依赖管理工具-composer
六.其他
首頁 後端開發 php教程 如何快速正確配置完整的php環境(nginx和php)

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

May 20, 2021 pm 03:12 PM

如何快速正確配置完整的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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1328
25
PHP教程
1273
29
C# 教程
1253
24
說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

See all articles