Home  >  Article  >  Backend Development  >  How to configure Nginx + PHP correctly

How to configure Nginx + PHP correctly

不言
不言Original
2018-04-16 17:14:476250browse

This article mainly introduces the steps of configuring Nginx PHP in detail, and understands the simple tutorial of Nginx PHP configuration. Interested friends can refer to it

For many people, configuring Nginx PHP It's 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 in this file Routing is implemented by parsing "REQUEST_URI".

Generally configure it like this
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 a lot of mistakes here, or at least bad tastes. Let’s take a look and you can find a few.

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.

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 a new "location" needs to be added in the future, there will inevitably be repeatedly defined "index" instructions. This is because multiple "locations" are in a horizontal relationship and do not There is inheritance. At this time, "index" should be defined in "server". With the 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 the "if" instruction to do 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 the Nginx configuration is actually declarative. , not 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 between them. The only difference is that the latter has one more line of definition of "SCRIPT_FILENAME" 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, it was discovered 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;
Improved version
Based on the previous analysis, here is an improved version. Is it 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;
  }
}

Related Recommended:


nginx cannot parse php script


##

The above is the detailed content of How to configure Nginx + PHP correctly. 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