热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

配置nginx使期支持PHP

安装Nginx及php在这里就不多说了,毕竟网上教程已经很全面了。无论是rpm、apt-get还是下载源码安装只要按照步骤走就可以了,(PHP我是使用dpkg?Pphp5-cgi然后再apt-getinstallphp5-cgi进行安装的,平台是Ubuntu)这里要说一下的是php支持模式,这部分
安装Nginxphp在这里就不多说了,毕竟网上教程已经很全面了。无论是rpm、apt-get还是下载源码安装只要按照步骤走就可以了,(PHP我是使用dpkg ?P php5-cgi然后再apt-get install php5-cgi进行安装的,平台是Ubuntu)这里要说一下的是php支持模式,这部分为转帖

1)      目前各种服务器HTTP ServerPHP的支持一共有三种: 
a.通过HTTPServer内置的模块来实现,
例如Apache的mod_php5,类似的Apache内置的mod_perl可以对perl支持;
b.通过CGI来实现,这个就好比之前perl的CGI,该种方式的缺点是性能差,因为每次服务器遇到这些脚本都需要重新启动脚本解析器来执行脚本然后将结果返回给服务器;另一方面就是不太安全;该方面几乎很少使用了。
c.最新出现一种叫做FastCGI。所谓FastCGI就是对CGI的改进。它一般采用C/S结构,一般脚本处理器会启动一个或者多个daemon进程,每次HTTPServer遇到脚本的时候,直接交付给FastCGI的进程来执行,然后将得到的结果(通常为html)返回给浏览器。
>该种方法的问题存在一个小问题是当遇到大流量的频繁请求的话,脚本处理器的daemon进程可能会超负荷从而变得很慢,甚至发生内存泄漏;
>但是比较起Apache的内置模块的方式的优点是由于Server和脚本解析器完全分开各负其责,因此服务器不再臃肿,可以专心地进行静态文件响应或者将动态脚本解析器的结果返回给用户客户端。所以比较起Apache的内置模块方式,有时候性能要提高很多。有人测试可能会达到 Apache+mod_php的5~10倍。

2)使用FastCGI方式现在常见的有两种stackligthttpd+spawn-fcgi; 另外一种是nginx+PHP-FPM(也可以用spawn-fcgi)  
a.如上面所说该两种结构都采用FastCGI对PHP支持,因此HTTPServer完全解放出来,可以更好地进行响应和并发处理。因此lighttpd和nginx都有small, but powerful和efficient的美誉。
b. 该两者还可以分出一个好坏来,spawn-fcgi由于是lighttpd的一部分,因此安装了lighttpd一般就会使用spawn-fcgi对 php支持,但是目前有用户说ligttpd的spwan-fcgi在高并发访问的时候,会出现上面说的内存泄漏甚至自动重启fastcgi。即:PHP 脚本处理器当机,这个时候如果用户访问的话,可能就会出现白页(即PHP不能被解析或者出错)。
另一个:首先nginx不像lighttpd本身含带了fastcgi(spawn-fcgi),因此它完全是轻量级的,必须借助第三方的FastCGI 处理器才可以对PHP进行解析,因此其实这样看来nginx是非常灵活的,它可以和任何第三方提供解析的处理器实现连接从而实现对PHP的解析(在 nginx.conf中很容易设置)。
nginx可以使用spwan-fcgi(需要一同安装lighttpd,但是需要为nginx避开端口,一些较早的blog有这方面安装的教程),但是由于spawn-fcgi具有上面所述的用户逐渐发现的缺陷,现在慢慢减少使用nginx+spawn-fcgi组合了。
c. 由于spawn-fcgi的缺陷,现在出现了新的第三方(目前还是,听说正在努力不久将来加入到PHP core中)的PHP的FastCGI处理器,叫做PHP-FPM(具体可以google)。它和spawn-fcgi比较起来有如下优点:
由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,也就是说编译到php core中了,因此在性能方面要优秀一些;
同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器。具体采用的算法和设计可以google了解。
因此,如上所说由于nginx的轻量和灵活性,因此目前性能优越,越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM 

3)因此总结: 
目前在HTTPServer这块基本可以看到有三种stack比较流行: 

>Apache+mod_php5
>lighttp+spawn-fcgi
>nginx+PHP-FPM

好了,以上为转帖部分,下面回归正题,这里主要介绍lighttp+spawn-fcgi来控制php。而php-fpm的安装主要是在配置php时加上参数--enable-fpm就ok了,当然是用源码包也可以,但我没有安装成功~Nginx、PHP及Lighttpd的安装这里就不多说了,下面还是说一下设置Nginx可以解析PHP的问题。这个问题困扰了我N天之久,通过坚持不懈的实验及搜索,总结如下:
Nginx目录结构如下:
/usr/local/nginx/conf 配置目录
/usr/local/nginx/html 默认的网站根目录
/usr/local/nginx/logs 日志和pid文件目录
/usr/local/nginx/sbin 执行文件目录
/etc/nginx也有配置文件,但是基本不用修改,我开始查网上去修改那些文件后测试一点用也没有。。
在介绍nginx配置文件之前还要注意安装好PHP后修改一些文件:
/usr/local/nginx/conf #vi fastcgi_params
#fastcgi_params
fastcgi_param QUERY_STRING      $query_string;
fastcgi_param REQUEST_METHOD    $request_method;
fastcgi_param CONTENT_TYPE      $content_type;
fastcgi_param CONTENT_LENGTH    $content_length;
fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME       $fastcgi_script_name;
 
fastcgi_param SCRIPT_NAME       $fastcgi_script_name;
fastcgi_param REQUEST_URI       $request_uri;
fastcgi_param DOCUMENT_URI      $document_uri;
fastcgi_param DOCUMENT_ROOT     $document_root;
fastcgi_param SERVER_PROTOCOL   $server_protocol;
 
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE   nginx/$nginx_version;
 
fastcgi_param REMOTE_ADDR       $remote_addr;
fastcgi_param REMOTE_PORT       $remote_port;
fastcgi_param SERVER_ADDR       $server_addr;
fastcgi_param SERVER_PORT       $server_port;
fastcgi_param SERVER_NAME       $server_name;
 
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS   200;
还需要在PHP-CGI的配置文件(Ubuntu 上此配置文件位于/etc/php5/cgi/php.ini)中,打开cgi.fix_pathinfo选项:

设置 cgi.fix_pathinfo=1; 这样php-cgi方能正常使用SCRIPT_FILENAME这个变量。

接下来看nginx的配置,使PHP利用FastCGI进程执行
主要就是修改/usr/local/nginx/conf/nginx.conf,下面预设就有一个nginx.conf.default,将它cp为nginx.conf之后修改里面的配置,下面是个实例:
#user nobody;
worker_processes 8;
error_log logs/error.log;
pid       logs/nginx.pid;
events {
   worker_connections 1024;
}
http {
   include      mime.types;
   default_type application/octet-stream;
 
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $request_time $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
sendfile       on;
keepalive_timeout 65;
gzip on;
   server {                       #这是重点,开始配置虚拟主机
       listen 8080;             #我使用http://localhost:8080
       server_name localhost;
location / {
        root  /var/www/php/website; #实际页面文件所在目录,如.php .html等
         index index.php;     #/var/www/php/website下的实际文件名,可以输入支持的多种格式以空格分开,如果存在多个看前后顺序显示
    }
error_page 404             /404.html;
error_page  500 502 503 504 /50x.html;
      location = /50x.html {
           root  html;
       }
   location ~ \.php$ {                    #这是关键,配置解析php
           fastcgi_pass  127.0.0.1:9000;    #下面要开这个端口
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
           include       fastcgi_params;
       }
     location ~ /\.ht {
           deny all;
       }
   }
include /usr/local/nginx/sites-enabled/*;
#这里是页面文件的配置目录,上面配了就可以不设这个
}
这里要指出的是上面的配置文档虽然可运行nginx对PHP支持但还是会出现问题,主要是配置在这个档案里的第一个location/ {可拿掉,而且最后一行的include既然上面配置虚拟主机了这行就可拿掉,如果未配置虚拟主机可include一个有配置文件的目录。(看下面示例)
修改后的nginx.conf:
#user nobody;
worker_processes 8;
 
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
 
pid       logs/nginx.pid;
 
 
events {
   worker_connections 1024;
}
 
 
http {
   include      mime.types;
   default_type application/octet-stream;
 
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $request_time $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
 
 
   sendfile       on;
 
   keepalive_timeout 65;
 
   gzip on;
   
  server {
       listen 8080;
       server_name localhost;
 
       root  /var/www/php/website;
       index index.php index.html;
 
       error_page 404             /404.html;
 
       error_page  500 502 503 504 /50x.html;
 
 
       location ~ .*\.(php|php5)?$ {
           fastcgi_pass  127.0.0.1:9000;
           fastcgi_index index.php;
           fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
           include       fastcgi_params;
       }
   }
}
相比之前的少了一个location和include,这里完全使用nginx.conf这个配置文件,而不会将配置文件指向其他目录。而下面这个配置:
#user nobody;
worker_processes 8;
 
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
 
pid       logs/nginx.pid;
 
 
events {
   worker_connections 1024;
}
 
 
http {
   include      mime.types;
   default_type application/octet-stream;
 
   log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $request_time $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
 
 
   sendfile       on;
 
   keepalive_timeout 65;
 
   gzip on;
   
 server {
      listen 8080;
      server_name localhost;
 
      root  /var/www/php/website;
      index index.php index.html;
 
      error_page 404             /404.html;
 
      error_page  500 502 503 504 /50x.html;
 
 
     location ~ .*\.(php|php5)?$ {
          fastcgi_pass  127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
          include       fastcgi_params;
      }
  }
include /usr/local/nginx/sites-enabled/*;
}
相比之下这个配置就是完全指向/usr/local/nginx/sites-enabled/*下面的配置文件,如index.php对应sites-enabled下的文件内容为:
server {
       listen 8080;
       server_name *.xxx.com;
       access_log /var/log/nginx/php_xxx.access.log;
       location / {
               root /var/www/php/website;
               index index.php index.html index.htm;
           error_page  500 502 503 504 /50x.html;
               location = /50x.html {
                root  html;
                }
                
              if (-f $request_filename/index.html)
               {
                       rewrite (.*) $1/index.html break;
               }
               if (-f $request_filename/index.htm)
               {
                       rewrite (.*) $1/index.htm break;
               }
               if (-f $request_filename/index.php)
               {
                       rewrite (.*) $1/index.php break;
               }
location ~ \.php$ {
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME /var/www/php/website$fastcgi_script_name;
                       fastcgi_param SCRIPT_NAME /var/www/php/website$fastcgi_script_name;
                       include /usr/local/nginx/conf/fastcgi_params;
               }
    }
}
不难发现,其实这个目录下的文件是/usr/local/nginx/sites-available这个目录下文件的链接而已。
之后重新载入kill -HUP `cat /usr/local/nginx/logs/nginx.pid`或sudo /etc/init.d/nginx reload
随后sudo spawn-fcgi -a 127.0.0.1 -p 9000 -C 3 -u www-data -f php5-cgi启动PHP

将index.php放进/var/www/php/website/下,并包含”phpinfo();”的内容,现在再看http://localhost:8080便应该能看到php的调试信息了。


推荐阅读
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 腾讯安全平台部招聘安全工程师和数据分析工程师
    腾讯安全平台部正在招聘安全工程师和数据分析工程师。安全工程师负责安全问题和安全事件的跟踪和分析,提供安全测试技术支持;数据分析工程师负责安全产品相关系统数据统计和分析挖掘,通过用户行为数据建模为业务决策提供参考。招聘要求包括熟悉渗透测试和常见安全工具原理,精通Web漏洞,熟练使用多门编程语言等。有相关工作经验和在安全站点发表作品的候选人优先考虑。 ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
author-avatar
lyglpp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有