Home  >  Article  >  How to properly configure Nginx + PHP

How to properly configure Nginx + PHP

无忌哥哥
无忌哥哥Original
2018-06-27 15:21:321839browse

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.

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 many mistakes here, or at least bad taste, everyone See how many you can find.
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 "index" 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" and with the help of inheritance relationship, " The index" directive is effective 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” command 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 kernel-level directive, but it is actually part of the rewrite module, and Nginx configuration is actually declarative rather than procedural, so when it is mixed with directives from non-rewrite modules, the result 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", they are not too big 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, 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
Follow the previous Analyze and give 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;
  }
}

The above is the entire content of this article. I hope it will be helpful to everyone's study. I also hope that everyone will support the script. s home.

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