Home Backend Development PHP Tutorial How to configure Nginx + PHP correctly

How to configure Nginx + PHP correctly

Apr 16, 2018 pm 05:14 PM
nginx php Configuration

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;
  }
}
Copy after login

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;
}
Copy after login

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;
}
Copy after login

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;
  }
}
Copy after login

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 of this Website
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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP's Purpose: Building Dynamic Websites PHP's Purpose: Building Dynamic Websites Apr 15, 2025 am 12:18 AM

PHP is used to build dynamic websites, and its core functions include: 1. Generate dynamic content and generate web pages in real time by connecting with the database; 2. Process user interaction and form submissions, verify inputs and respond to operations; 3. Manage sessions and user authentication to provide a personalized experience; 4. Optimize performance and follow best practices to improve website efficiency and security.

PHP and Python: Different Paradigms Explained PHP and Python: Different Paradigms Explained Apr 18, 2025 am 12:26 AM

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

PHP and Python: Code Examples and Comparison PHP and Python: Code Examples and Comparison Apr 15, 2025 am 12:07 AM

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.

Choosing Between PHP and Python: A Guide Choosing Between PHP and Python: A Guide Apr 18, 2025 am 12:24 AM

PHP is suitable for web development and rapid prototyping, and Python is suitable for data science and machine learning. 1.PHP is used for dynamic web development, with simple syntax and suitable for rapid development. 2. Python has concise syntax, is suitable for multiple fields, and has a strong library ecosystem.

Why Use PHP? Advantages and Benefits Explained Why Use PHP? Advantages and Benefits Explained Apr 16, 2025 am 12:16 AM

The core benefits of PHP include ease of learning, strong web development support, rich libraries and frameworks, high performance and scalability, cross-platform compatibility, and cost-effectiveness. 1) Easy to learn and use, suitable for beginners; 2) Good integration with web servers and supports multiple databases; 3) Have powerful frameworks such as Laravel; 4) High performance can be achieved through optimization; 5) Support multiple operating systems; 6) Open source to reduce development costs.

PHP: Handling Databases and Server-Side Logic PHP: Handling Databases and Server-Side Logic Apr 15, 2025 am 12:15 AM

PHP uses MySQLi and PDO extensions to interact in database operations and server-side logic processing, and processes server-side logic through functions such as session management. 1) Use MySQLi or PDO to connect to the database and execute SQL queries. 2) Handle HTTP requests and user status through session management and other functions. 3) Use transactions to ensure the atomicity of database operations. 4) Prevent SQL injection, use exception handling and closing connections for debugging. 5) Optimize performance through indexing and cache, write highly readable code and perform error handling.

How to configure nginx in Windows How to configure nginx in Windows Apr 14, 2025 pm 12:57 PM

How to configure Nginx in Windows? Install Nginx and create a virtual host configuration. Modify the main configuration file and include the virtual host configuration. Start or reload Nginx. Test the configuration and view the website. Selectively enable SSL and configure SSL certificates. Selectively set the firewall to allow port 80 and 443 traffic.

How to check the name of the docker container How to check the name of the docker container Apr 15, 2025 pm 12:21 PM

You can query the Docker container name by following the steps: List all containers (docker ps). Filter the container list (using the grep command). Gets the container name (located in the "NAMES" column).

See all articles