如何正确配置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;}
}
来源: http://www.cnblogs.com/linuxprobe/p/5335949.html

转载于:https://www.cnblogs.com/youyuanjuyou/p/8258366.html

正确配置nginx和php相关推荐

  1. 如何正确配置Nginx+PHP

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

  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. Nginx配置文件详细说明
  2. 工作经验总结201606
  3. 使用NGUINGUI的相关介绍
  4. 方正计算机软件保护进超级用户,超级用户权限补丁(SuperSU Pro)含刷机包
  5. 什么是公有云、私有云、混合云?
  6. vue - webpack.dev.conf.js
  7. ssas对数据仓库_SSAS多维数据集中的警告
  8. java 字符串 数字个数_JAVA 统计字符串中中文,英文,数字,空格的个数
  9. Atitit 视图参数解决方案 oracle版和mysql版本 attilax总结.docx
  10. [ 物联网篇 ] ESP32 AWS IoT and Amazon Alexa Development / FreeRTOS平台的Alexa语音助手
  11. 《穿越计算机的迷雾》读书笔记一
  12. 同一个项目中让R和Python无缝工作的五种方法
  13. ansys添加力矩_ansys中施加力矩
  14. 5款十分小众,却又非常好用的良心软件
  15. app界面设计规范及缺陷
  16. 世界顶级黑客,都有哪些神仙操作?这篇文章带你了解一下!
  17. QT象棋暗棋游戏(一)
  18. SQL SERVER 去掉字符串左边的0
  19. 基于Wireshark的TCP SACK重传介绍
  20. js git基本命令

热门文章

  1. 京瓷1110打印自检页_如何修改小票打印机、厨房打印机IP地址
  2. java list原理_Java集合:ArrayList的实现原理
  3. “造车时代”多方笃定小米造车,网络营销外包专员如何看待这一波营销?
  4. 网站降低用户跳出率的常见技巧有哪些?
  5. 浅析网站SEO中图片优化是如何进行的?
  6. 纸飞机html,Flyaway.css-炫酷纯CSS3纸飞机动画特效
  7. python构造一个二叉树_如何用python构造一个n层的完全二叉树
  8. elementui图片上传php,vue+Element Ui 实现自动上传图片
  9. 光滑噪声数据常用的方法_九大常用数据分析方法汇总
  10. python无限次输入_在Raspberry Pi上的Python用户输入无限循环内部输入时很多输入错过了输入...