导读 对很多人而言,配置Nginx+PHP无外乎就是搜索一篇教程,然后拷贝粘贴。听上去似乎也没什么问题,可惜实际上网络上很多资料本身年久失修,漏洞百出,如果大家不求甚解,一味的拷贝粘贴,早晚有一天会为此付出代价。

假设我们用PHP实现了一个前端控制器,或者直白点说就是统一入口:把PHP请求都发送到同一个文件上,然后在此文件里通过解析「REQUEST_URI」实现路由。

此时很多教程会教大家这样配置Nginx+PHP:
server {listen 80;server_name foo.com;root /path;location / {index index.html index.htm index.php;if (!-e $request_filename) {rewrite . /index.php last;}}location ~ \.php$ {include fastcgi_params;fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;}
}

这里面有很多错误,或者说至少是坏味道的地方,大家看看能发现几个。

我们有必要先了解一下Nginx配置文件里指令的继承关系:

Nginx配置文件分为好多块,常见的从外到内依次是「http」、「server」、「location」等等,缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值作为缺省值。

让我们先从「index」指令入手吧

在问题配置中它是在「location」中定义的:

location / {index index.html index.htm index.php;
}

一旦未来需要加入新的「location」,必然会出现重复定义的「index」指令,这是因为多个「location」是平级的关系,不存在继承,此时应该在「server」里定义「index」,借助继承关系,「index」指令在所有的「location」中都能生效。

接下来看看「if」指令

说它是大家误解最深的Nginx指令毫不为过:

if (!-e $request_filename) {rewrite . /index.php last;
}

很多人喜欢用「if」指令做一系列的检查,不过这实际上是「try_files」指令的职责:

try_files $uri $uri/ /index.php;

除此以外,初学者往往会认为「if」指令是内核级的指令,但是实际上它是rewrite模块的一部分,加上Nginx配置实际上是声明式的,而非过程式的,所以当其和非rewrite模块的指令混用时,结果可能会非你所愿。

下面看看「fastcgi_params」配置文件:

include fastcgi_params;

Nginx有两份fastcgi配置文件,分别是「fastcgi_params」和「fastcgi.conf」,它们没有太大的差异,唯一的区别是后者比前者多了一行「SCRIPT_FILENAME」的定义:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

注意:$document_root 和 $fastcgi_script_name 之间没有 /。

原本Nginx只有「fastcgi_params」,后来发现很多人在定义「SCRIPT_FILENAME」时使用了硬编码的方式,于是为了规范用法便引入了「fastcgi.conf」。

不过这样的话就产生一个疑问:为什么一定要引入一个新的配置文件,而不是修改旧的配置文件?这是因为「fastcgi_param」指令是数组型的,和普通指令相同的是:内层替换外层;和普通指令不同的是:当在同级多次使用的时候,是新增而不是替换。换句话说,如果在同级定义两次「SCRIPT_FILENAME」,那么它们都会被发送到后端,这可能会导致一些潜在的问题,为了避免此类情况,便引入了一个新的配置文件。

此外,我们还需要考虑一个安全问题:在PHP开启「cgi.fix_pathinfo」的情况下,PHP可能会把错误的文件类型当作PHP文件来解析。如果Nginx和PHP安装在同一台服务器上的话,那么最简单的解决方法是用「try_files」指令做一次过滤:

try_files $uri =404;
依照前面的分析,给出一份改良后的版本,是不是比开始的版本清爽了很多:
server {listen 80;server_name foo.com;root /path;index index.html index.htm index.php;location / {try_files $uri $uri/ /index.php$is_args$args;}location ~ \.php$ {try_files $uri =404;include fastcgi.conf;fastcgi_pass 127.0.0.1:9000;}
}

如何正确配置Nginx+PHP相关推荐

  1. 正确配置nginx和php

    如何正确配置Nginx+PHP 假设用PHP实现了一个前端控制器,或者直白点说就是统一入口:把PHP请求都发送到同一个文件上,然后在此文件里通过解析「REQUEST_URI」实现路由. 此时很多教程会 ...

  2. php环境搭建(正确配置nginx和php)

    前言: 首先来了解一下nginx工作原理:https://blog.csdn.net/hguisu/article/details/8930668 一.nginx实现php动态解析原理 nginx 是 ...

  3. Ubuntu下配置Nginx HTTPS

    HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入S ...

  4. 正确配置Linux系统ulimit值的方法【转】

    转自:http://www.cnblogs.com/ibook360/archive/2012/05/11/2495405.html 在Linux下面部署应用的时候,有时候会遇上Socket/File ...

  5. 配置nginx对php的支持

    配置nginx对php的支持 案例声明:本次案例所有软件包用的都是源码包 一.基本环境: 因为nginx与httpd服务用的是同一个端口,所以在安装nginx之前必须要停止apache服务,释放80端 ...

  6. CentOS7.3 安装配置 Nginx、MariaDB、PHP

    CentOS7.3 安装配置 Nginx.MariaDB.PHP 配置 nginx 安装参数并安装 配置 以下参数也可以在后期通过配置 conf 文件进行配置 基本配置如下 ./configure - ...

  7. 正确配置Linux系统ulimit值的方法

    2019独角兽企业重金招聘Python工程师标准>>> 在Linux下面部署应用的时候,有时候会遇上Socket/File: Can't open so many files的问题: ...

  8. 正确设置nginx/php-fpm/apache权限 提高网站安全性 防止被挂木马

    2019独角兽企业重金招聘Python工程师标准>>> 核心总结:php-fpm/apache 进程所使用的用户,不能是网站文件所有者. 凡是违背这个原则,则不符合最小权限原则. 根 ...

  9. [转]正确配置Linux系统ulimit值的方法

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can't open so many files的问题:这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且L ...

最新文章

  1. 响应式开发一招致胜 学习视频 分享
  2. 打印机支持打印html页面吗,vue下调用打印功能,打印html页面
  3. leetcode - 111. 二叉树的最小深度
  4. jquery ajax提交表单数据的两种方式
  5. 盘点2019年5G:商用大戏开唱 三大问题亟待解决
  6. OPPO Find X继任者来了!Find Z曝光:搭载骁龙855
  7. Tuxedo中间件学习
  8. 科比数据集分析与预测
  9. 互联网行业数据安全建设实践方案
  10. 【HTML期末学生大作业】 制作一个简单HTML保护野生动物老虎网页设计专题(HTML+CSS)
  11. win10c语言乱码修复方法,大神详解win10系统记事本中文变乱码的处理方案
  12. Level Shift
  13. GNSS原理及技术(一)——GNSS现状与发展
  14. 变量 内存 分配 ios iphone
  15. 路由 OSPF简介、OSPF与其它路由的区别、OSPF区域概念、OSPF路由代名词IR、BR、ABR、ASBR概念简介。
  16. 使用腾讯企业邮箱为什么强烈建议启用安全登录?怎么启用?
  17. c语言指针什么时候加星号,c语言中指针前面的星号,什么时候可以省去,什么时候又必须带上呢?(转载)...
  18. 互联网 Web 技术发展史
  19. armbian n1 桌面_N1盒子初体验(降级+刷armbian)
  20. vue移动端底部菜单tabbar

热门文章

  1. C# 获取wave文件信息【转】
  2. mysql出现“Incorrect key file for table”解决办法
  3. flash程序员2012最大转变
  4. 1、大话设计模式,简单工厂
  5. 来51的时间也不短了,开始写blog了。
  6. 谨慎对待switch,用Object对象替换switch
  7. jar打包混淆上传全自动日志
  8. json字符串拼接 json_encode 数组带有花括号{}和中括号[]
  9. Linux下编译安装Apache、php和svn
  10. 『笔记』windows与CentOS间文件传输(win下实行)