Home  >  Article  >  Backend Development  >  How to set up php in nginx

How to set up php in nginx

藏色散人
藏色散人Original
2020-12-01 09:52:073794browse

How to set up php in nginx: first modify the fastcgi_params and fastcgi.conf configuration files in Nginx; then use the try_files command to filter once when cgi.fix_pathinfo is turned on in PHP.

How to set up php in nginx

Recommended: "PHP Video Tutorial"

The operating environment of this tutorial: linux5.9.8 system, PHP7.1 version, this method is applicable to all brands of computers.

Configuring Nginx PHP

For many people, configuring Nginx PHP is nothing more than searching for a tutorial and then copying and pasting it. It sounds like there is nothing wrong with it, but in fact, a lot of information on the Internet is in disrepair and full of loopholes. If you just copy and paste without asking for a deeper understanding, you will pay the price sooner or later.

Suppose we use PHP to implement a front-end controller, or to put it bluntly, it is a unified entrance: send all PHP requests to the same file, and then implement routing by parsing "REQUEST_URI" in this file.

At this time, many tutorials will teach you to configure Nginx PHP like this:

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;
    }
}

There are many errors, or at least bad smells, you can find a few if you take a look.

We need to first understand the inheritance relationship of the instructions in the Nginx configuration file: the Nginx configuration file is divided into many blocks, the common ones from outside to inside are "http" , "server", "location", etc., the default inheritance relationship is from outside to inside, which means that the inner block will automatically obtain the value of the outer block as the default value (there are exceptions, see the reference for details).

Let’s start with the “index” directive. In the problem configuration it is defined in “location”:

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

Once new data needs to be added in the future "location", there will inevitably be repeatedly defined "index" instructions. This is because multiple "locations" are in a horizontal relationship and there is no inheritance. At this time, "index" should be defined in "server" with the help of inheritance relationship. , the "index" command can take effect in all "locations".

Let’s take a look at the “if” command. It is no exaggeration to say that it is the most misunderstood Nginx command:

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

Many people like to use it The "if" instruction does a series of checks, but this is actually the responsibility of the "try_files" instruction:

try_files $uri $uri/ /index.php;

In addition, beginners often think that the "if" instruction is a kernel-level instruction, but in fact It is part of the rewrite module, and Nginx configuration is actually declarative rather than procedural, so when it is mixed with instructions from non-rewrite modules, the results may not be what you want.

Let’s take a look at the "fastcgi_params" configuration file:

include fastcgi_params;

Nginx has two fastcgi configuration files, namely "fastcgi_params" and "fastcgi.conf". There is not much difference. The only difference is that the latter has one more line of "SCRIPT_FILENAME" definition than the former:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Note: There is no / between $document_root and $fastcgi_script_name.

Originally, Nginx only had "fastcgi_params". Later, I found that many people used hard-coding when defining "SCRIPT_FILENAME", so "fastcgi.conf" was introduced to standardize usage.

But this raises a question: Why must we introduce a new configuration file instead of modifying the old configuration file? This is because the "fastcgi_param" instruction is an array type. The same as the ordinary instruction: the inner layer replaces the outer layer. The difference from the ordinary instruction is that when used multiple times at the same level, it is added instead of replaced. In other words, if "SCRIPT_FILENAME" is defined twice at the same level, they will both be sent to the backend, which may cause some potential problems. In order to avoid such situations, a new configuration file was introduced.

In addition, we also need to consider a security issue: when PHP turns on "cgi.fix_pathinfo", PHP may parse the wrong file type as a PHP file. If Nginx and PHP are installed on the same server, the simplest solution is to use the "try_files" command to filter:

try_files $uri =404;

According to the previous analysis, give a Is this improved version much cleaner than the original version:

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;
    }
}

Actually there are still some flaws, mainly because "try_files" and "fastcgi_split_path_info" are not compatible enough. Although it can be solved, the solution is rather ugly. , I won’t go into details.

Supplement: Because “location” has been limited, “fastcgi_index” is actually not necessary.

The above is the detailed content of How to set up php in nginx. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn