如何快速正確配置完整的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掉這個行程,而是保留這個行程,讓這個行程可以一次處理多個請求。大大提高了效率。
#二.nginx實作php動態解析.之如何設定nginx補充:反向代理與正向代理的相關知識(簡言之,正向代理-代理的是客戶端;反向代理-代理的是伺服器)
正向代理程式的用途:
反向代理的用途:反向代理,"它代理的是服務端",主要用於伺服器叢集分散式部署的情況下,反向代理隱藏了伺服器的資訊。
(1)存取原先無法存取的資源,如Google
(2) 為授權,上網進行認證
(4)代理可以記錄用戶訪問記錄上網行為管理,對外隱藏用戶信息)(1)確保內網的安全,通常以反向代理程式為公網存取位址,Web伺服器是內網
(2)負載,透過反向代理伺服器來最佳化網站負載,透過反向負載#2)的負載負載,透過反向負載
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动态解析.之配置过程中常见错误
- php-fpm需要进行一些配置修改(超时时长:request_slowlog_timeout等 php-fpm 的request_terminate_timeout设置不当导致的502错误)
- Nginx-配置误区 (fastcgi_param SCRIPT_FILENAME)
- Nginx + Php-fpm 一个神奇的502错误
- nginx+php-fpm打开index.php显示空白
- php国际化插件安装、debug插件安装(extension php.ini)
- php缓存信息关闭(https://www.cnblogs.com/JohnABC/p/3529786.html !!开启缓存会引起许多问题,视情况而定)
- ?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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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