zoukankan      html  css  js  c++  java
  • 配置nginx+php

    一般这样配置

    此时很多教程会教大家这样配置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;
        }
    }
    这个人不懒,写了一点东西
  • 相关阅读:
    bzoj3505 数三角形 组合计数
    cogs2057 殉国 扩展欧几里得
    cogs333 荒岛野人 扩展欧几里得
    bzoj1123 BLO tarjan求点双连通分量
    poj3352 road construction tarjan求双连通分量
    cogs1804 联合权值 dp
    cogs2478 简单的最近公共祖先 树形dp
    cogs1493 递推关系 矩阵
    cogs2557 天天爱跑步 LCA
    hdu4738 Caocao's Bridge Tarjan求割边
  • 原文地址:https://www.cnblogs.com/AnonymouL/p/5680241.html
Copyright © 2011-2022 走看看