Configuración de Nginx + PHP

Supongamos que usamos PHP para implementar un controlador frontal, o para decirlo sin rodeos, una entrada unificada: envía todas las solicitudes PHP al mismo archivo y luego implementamos el enrutamiento analizando "REQUEST_URI" en este archivo.

En este momento, muchos tutoriales le enseñarán a configurar Nginx + PHP de esta manera:

servidor { 
    escuchar 80; 
    nombre_servidor foo.com; 

    raíz / ruta; 

    ubicación / { 
        index index.html index.htm index.php; 

        if (! -e $ request_filename) { 
            reescribir. /index.php último; 
        } 
    } 

    ubicación ~ \ .php $ { 
        incluir fastcgi_params; 
        fastcgi_param SCRIPT_FILENAME / ruta $ fastcgi_script_name; 
        fastcgi_pass 127.0.0.1:9000; 
        fastcgi_index index.php; 
    } 
}

Hay muchos errores, o al menos malos olores, puedes encontrar algunos si los miras.

...

Es necesario que primero comprendamos la relación de herencia de las directivas en el archivo de configuración de Nginx:

El archivo de configuración de Nginx está dividido en muchos bloques. Los más comunes son "http", "servidor", "ubicación", etc. de afuera hacia adentro. La relación de herencia predeterminada es de afuera hacia adentro, lo que significa que el bloque interior se obtendrá automáticamente. El valor del bloque exterior se toma como valor predeterminado.

Primero comencemos con el comando "index"

Se define en "ubicación" en la configuración del problema:

ubicación / { 
    index index.html index.htm index.php; 
}

Una vez que se deba agregar una nueva "ubicación" en el futuro, inevitablemente habrá un comando de "índice" definido repetidamente. Esto se debe a que varias "ubicaciones" están en una relación de nivel y no hay herencia. En este momento, el " index "debe definirse en el" servidor "", con la ayuda de la herencia, el comando "index" puede tener efecto en todas las "ubicaciones".

A continuación, mire el comando "si"

No es exagerado decir que es el comando de Nginx más incomprendido:

if (! -e $ request_filename) { 
    reescribir. /index.php último; 
}

A muchas personas les gusta usar el comando "if" para realizar una serie de comprobaciones, pero en realidad esto es responsabilidad del comando "try_files":

try_files $ uri $ uri / /index.php;

Además, los principiantes a menudo piensan que la instrucción "if" es una instrucción a nivel de kernel, pero de hecho es parte del módulo de reescritura, y la configuración de Nginx es en realidad declarativa en lugar de procedimental, por lo que cuando se combina con When las instrucciones de los módulos que no son de reescritura se mezclan, el resultado puede no ser el deseado.

Echemos un vistazo al archivo de configuración "fastcgi_params":

incluir fastcgi_params;

Nginx tiene dos archivos de configuración fastcgi, a saber, "fastcgi_params" y "fastcgi.conf". No hay mucha diferencia entre ellos. La única diferencia es que este último tiene una línea adicional de definición de "SCRIPT_FILENAME" que el primero:

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;
    }
}
更过技术问题解决防范请搜索千锋PHP,千锋论坛

Supongo que te gusta

Origin blog.csdn.net/chengshaolei2012/article/details/72638576
Recomendado
Clasificación