如何快速正確配置完整的php環境(nginx和php)
#首先來了解nginx工作原理:https://blog.csdn. net/hguisu/article/details/8930668
nginx 是高效能的http伺服器與反向代理伺服器.即nginx可以作為一個HTTP伺服器進行網站的發布處理,也可以作為一個反向代理伺服器進行負載平衡。 但要注意的是:nginx本身並不會對php檔案進行解析。 對PHP頁面的請求將會被nginx交給FastCGI進程監聽的IP位址及端口,由php-fpm(第三方的fastcgi進程管理器)作為動態解析伺服器處理,最後將處理結果再傳回給nginx 。即nginx透過反向代理功能將動態請求轉向後端php-fpm,從而實現對PHP的解析支持,這就是Nginx實現PHP動態解析的基本原理。
首先需要了解一些概念。 (nginx php-fpm fastcgi)
非阻塞IO & IO複用
模型,透過作業系統提供的類似epoll 的功能,可以在一個線程裡處理多個客戶端的請求。 Nginx 的進程就是線程,也就是每個行程只有一個線程,但這一個執行緒可以服務多個客戶端。 pm.max_children
指定的是最大的行程數量,pm.max_requests
指定的是每個行程處理多少個請求後重啟(因為PHP 偶爾會有記憶體洩漏,所以需要重啟)。 PHP-FPM 的每個行程也只有一個線程,但是一個行程同時只能服務一個客戶端。 #二.nginx實作php動態解析.之如何設定nginx補充:反向代理與正向代理的相關知識(簡言之,正向代理-代理的是客戶端;反向代理-代理的是伺服器)
正向代理程式的用途:
反向代理的用途:反向代理,"它代理的是服務端",主要用於伺服器叢集分散式部署的情況下,反向代理隱藏了伺服器的資訊。
(1)存取原先無法存取的資源,如Google
(2) 為授權,上網進行認證
(4)代理可以記錄用戶訪問記錄上網行為管理,對外隱藏用戶信息)(1)確保內網的安全,通常以反向代理程式為公網存取位址,Web伺服器是內網
(2)負載,透過反向代理伺服器來最佳化網站負載,透過反向負載#2)的負載負載,透過反向負載
(nginx.conf )nginx.conf組成及基本配置語法講解詳見另外一篇文章,此處將解析php配置用到的幾個語法做一下簡單介紹:
try_files $uri $uri/ /index.php$is_args$args : (https://blog.51cto.com/13930997/2311716、、、Nginx try_files 裡的一個坑---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為例:
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)
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)
查看發現設定檔目錄在/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配置的意思
其中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中文網其他相關文章!