Home > Article > Backend Development > The correct idea and process of configuring Nginx PHP, the idea of configuring nginxphp_PHP tutorial
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.
How to configure Nginx PHP correctly
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 configured 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 errors in this, or at least bad taste, 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, that is to say, the inner block The value of the outer block is automatically obtained as the default value.
Let’s start with the “index” command
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 there is no inheritance. At this time, it should be in "server" Define "index", and 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 the "if" command to do a series of checks, but this is actually the responsibility of the "try_files" command:
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. In addition, Nginx configuration is actually declarative rather than procedural, so When mixed with directives from non-rewrite modules, the results may not be what you want.
Look at the "fastcgi_params" configuration file below
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 "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.
However, this raises a question: Why must a new configuration file be introduced 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 "cgi.fix_pathinfo" is turned on in PHP, 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; } }
How to correctly configure Nginx PHP, I believe everyone should have their own understanding!