(Nginx)基于Nginx+PHP 驱动 Web 应用(上):配置文件与虚拟主机篇

1.应用场景

主要用于学习基于 Nginx + PHP 驱动 Web 应用(上):

配置文件与虚拟主机篇,学习弄清楚Nginx的常规操作,之前困惑的地方。

本文主要介绍了基于Nginx+PHP驱动Web应用的配置方法,重点讲解了Nginx配置文件与虚拟主机设置。文章首先说明可通过Homestead等工具快速搭建Laravel运行环境,然后详细解析了nginx.conf配置文件的结构和各模块功能。核心内容围绕虚拟主机配置展开,通过示例展示了如何为Laravel项目配置独立的虚拟主机,包括监听端口、域名解析、项目根目录、索引文件设置等关键参数。特别强调了location块的作用机制,以及如何通过FastCGI(PHP-FPM)处理PHP动态请求。文章还介绍了多站点部署时虚拟主机的管理方式,以及配置修改后的重启注意事项,为后续深入理解Nginx+PHP工作流程奠定了基础。

2.学习/操作

1.文档阅读

网络协议概论 | Laravel 学院 - 基于 Nginx + PHP 驱动 Web 应用(上):配置文件与虚拟主机篇

PHP - PHP-FPM - 学习/实践_穿素白衫的中少年的博客-CSDN博客 -- 推荐

2.整理输出

Note

可结合PHP-FPM的配置文件一起学习

上篇教程学院君介绍了 Web 服务器的基本概念、简单实现和工作流程,下面学院君将以两篇教程的篇幅,以一个简单的 Laravel 项目为例详细介绍服务器端如何基于 Nginx + PHP-FPM 驱动 PHP Web 应用。

在开始介绍 Nginx 处理客户端请求之前,我们先简单介绍下 Nginx 服务器的配置文件。为此需要准备好 Laravel 项目服务端运行环境(Nignx + PHP-FPM + Laravel),我们可以基于 Homestead、Laradock、Laragon 或 Valet 快速搭建起这样的环境。

做好上述准备工作后,打开 Nginx 的配置文件 nginx.conf(通常位于 /etc/nginx/nginx.conf):

user vagrant;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

       

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

       

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

该配置文件中提供了 Nginx 服务器的一些基本配置,Nginx 是由模块驱动的,负责 HTTP 服务的是 http 模块,这里我们重点关注 http 模块中的虚拟主机配置(Virtual Host Configs)。

如果一台服务器上只能部署一个 Web 站点显然有点浪费,所以 HTTP/1.1 规范允许在一台 HTTP 服务器上搭建多个 Web 站点,这个功能叫做虚拟主机(Virtual Host)。

所谓虚拟主机的意思是物理层面只有一台服务器,但是通过虚拟主机功能可以在该服务器上搭建多个站点,从而让访问者觉得配备了多台服务器。

基于 Nginx 驱动的所有 Web 站点都是通过 server 模块以虚拟主机的方式配置在各自的配置文件中,然后在 nginx.conf 中通过 include /etc/nginx/sites-enabled/*; 这行代码引入。

我们看下 Nginx 自带的一个虚拟主机配置 /etc/nginx/sites-enabled/default

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }    
}

如果 Nginx 服务器没有配置其它站点,则访问 IP 地址解析到该服务器上的所有域名都会指向这个配置文件,因为这个配置文件监听端口上指定了 default_server

listen 80 default_server;

由于是默认虚拟主机配置,所以一个 Nginx 服务器只允许配置一个标识为 default_server 的虚拟主机。如果配置了多个,启动 Nginx 的时候会报错。

对于我们测试的 Laravel 项目,可以为其配置一个独立的虚拟主机配置 /etc/nginx/sites-enabled/laravel

server {

    listen 80;    // IPv4
    listen [::]:80;  // IPv6

    server_name laravel.test;
    root /var/www/laravel/public;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass unix:/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    error_log /var/log/nginx/laravel_error.log;
    access_log /var/log/nginx/laravel_access.log;
}

Nginx 服务器支持几个 Web 站点,就配置几个虚拟主机,通常的做法是将虚拟主机配置到 /etc/nginx/sites-available 目录下,然后对于启用的站点,在 /etc/nginx/sites-enabled 目录下创建对应的软链接。

在这个基本的 Laravel 站点虚拟主机配置中,主要包含监听端口、站点域名、项目根目录、默认索引、日志信息、以及 location 配置块.

我们大致介绍下这几个配置的含义及用途:

  • 监听端口(listen):本站点监听的端口,一般默认是 80;
  • 站点域名(server_name):本站点域名,由于一台服务器上搭建了多个站点,而 TCP 连接的标识中只有 IP 地址和端口号,服务器如何识别客户端访问的是哪个站点呢?HTTP/1.1 的做法是要求请求首部中必须包含 Host 字段来指定访问的域名,Nginx 在接收请求时,会将解析出来的 Host 首部字段值与虚拟主机中的 server_name 值进行匹配,匹配成功则应用该虚拟主机中的配置;
  • 项目根目录(root):站点部署的目录,一般是入口索引文件所在的目录;
  • 索引文件:请求 URL 中未指定具体资源时默认的入口文件,可配置多个,然后以空格分隔。比如访问 Laravel 应用首页,一般请求起始行中的 URL 路径是 /,这个时候 Nginx 就会依次拼接 index 配置中的索引文件进行访问,比如 /index.php
  • location 配置块:会与请求起始行中的相对 URL 路径进行匹配,匹配成功则应用对应配置块中的配置,location / {...} 可以匹配所有请求,try_files 会依次访问后面配置的每个路径,如果通过对应 URL 可以直接访问($uri),比如静态资源文件,则直接返回响应给客户端;否则尝试以目录方式访问($uri/);最后尝试访问 /index.php$is_args$args,即以 Laravel 入口文件 + 动态参数形式访问资源,由于该路径包含了 .php所以会进入下一个匹配的 location 配置块 —— location ~ \.php$ {...},然后通过 FastCGI 网关(PHP-FPM)让后端 PHP 程序来处理动态请求。指定 PHP-FPM 进程时,可以通过 Unix 套接字,比如 unix:/run/php/php7.1-fpm.sock,也可以通过 IP 地址+端口号的形式,比如 http://127.0.0.1:9000,前者仅适用于 PHP-FPM 与 Nginx 运行在一台服务器,后者适用于所有场景,不过前者直接读取本地文件,没有额外的网络开销,因此从性能上来说更优,然后我们将请求的路径、参数传递给 PHP-FPM,同时设置缓存和超时配置;
  • 日志信息:可以通过 error_log 指定错误日志路径,access_log 指定访问日志路径。

新增虚拟主机配置后,需要重启 Nginx 让其生效(Nginx 启动过程中加载 nginx.conf 配置文件),有了以上基本知识储备后,下一篇我们将给大家介绍 Nginx + PHP-FPM 驱动 Laravel Web 应用的完整流程。

后续补充

...

3.问题/补充

TBD

后续补充

...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95064.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【golang长途旅行第34站】网络编程

网络编程 基本介绍核心主题:​​ Golang面向大规模后端服务程序的设计目标中,网络通信是必不可少且至关重要的部分。​两种网络编程方式:​​​TCP Socket编程​ •性质:网络编程的主流 •底层协议:基于TCP/IP协议 •举…

Hadoop(六)

目录:1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构1.Hadoop概述2.为什么需要分布式存储3.分布式的基础架构分析4.HDFS的基础架构

Oracle 12g安装

1. 下载地址 官方网站 一般这种导向的进入的都是oracle的官方网站(先登录,如果没有就创建账号),并没有真实的12g供你下载。需要你转入Oracle的云中下载:https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 。我选择的是12.1.0.2.0下…

ros2--service/服务--接口

获取service名称const char *get_service_name() const;std::string client_name client_->get_service_name();RCLCPP_INFO(this->get_logger(), "Client name: %s", client_name.c_str());

安卓开发---SimpleAdapter

概念&#xff1a;SimpleAdapter 是 Android 中比 ArrayAdapter 更强大的适配器&#xff0c;用于将复杂的数据绑定到复杂的布局&#xff0c;支持将 Map 中的数据映射到布局中的多个 View。方法签名&#xff1a;public SimpleAdapter( Context context, //上下文 List<? exte…

软考-系统架构设计师 办公自动化系统(OAS)详细讲解

个人博客&#xff1a;blogs.wurp.top 一、OAS的核心概念与演进 1. 什么是OAS&#xff1f; OAS是一个综合性的信息系统&#xff0c;它利用计算机技术、通信技术、系统科学和行为科学&#xff0c;为组织的日常办公事务、信息管理和协同工作提供支持。其本质是将传统办公流程电…

leetcode 155 官方golang标准答案错误

真是误人子弟&#xff0c;leetcode155题官网的golang答案是错误的。push方法的append操作&#xff0c;必然不能保证是o(1)的时间复杂度。就这还是官网的标准答案&#xff0c;就这水平&#xff0c;&#x1f604;leetcode误人子弟不是第一次了。光会刷算法&#xff0c;可惜水平还…

开源 python 应用 开发(十三)AI应用--百度智能云TTS语音合成

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#xf…

大白话说 AI 编程 Trae,小白进!

大家好&#xff0c;我是樱木。 一些小白用户&#xff0c;打开字节出的 AI 编程工具 Trae 时&#xff0c;可能觉得还是有点生疏&#xff0c;但是作为程序员&#xff0c;看到这样的界面分布&#xff0c;已经是在熟悉不过了&#xff0c;甚至心中窃喜&#xff0c;长得和 IDEA 等开…

主流国产数据库:文档完备性

官方文档通常是用户获取数据库产品相关信息最权威的渠道&#xff0c;文档的完备性&#xff08;准确、全面、易用&#xff09;直接影响着开发者的学习成本、项目实施的效率以及后期的运维便利性。 例如&#xff0c;Oracle 数据库的官方文档被广泛认为是行业的黄金标准&#xff…

现今流行的操作系统及其应用场景

2025 年主流操作系统及其应用场景&#xff0c;结合技术趋势与行业实践&#xff0c;涵盖从个人设备到关键基础设施的全场景覆盖&#xff1a;一、桌面与生产力领域1. Windows 11/12&#xff08;微软&#xff09;市场地位&#xff1a;全球桌面市场占比 71%&#xff0c;企业级场景市…

IP v 6

相关概念地址长度128bit&#xff0c;采用冒号划分为8段&#xff0c;并用16进制标识&#xff0c;其容量大到能为地球上的每一粒沙子分配一个地址&#xff0c;通常情况下其网络前缀为64位&#xff0c;接口标识为64位&#xff0c;依照写法可分为首选格式&#xff0c;即完整书写&am…

Elasticsearch冷热架构:性能与成本完美平衡

Elasticsearch 的冷热架构&#xff08;Hot-Warm-Cold Architecture&#xff09;是一种针对时序数据&#xff08;如日志、指标等&#xff09;的成本与性能优化方案&#xff0c;通过将数据在不同生命周期的存储需求分层处理&#xff0c;兼顾性能、容量和成本。其核心思想是&#…

【MFC自动生成的文件详解:YoloClassMFC.cpp 的逐行解释、作用及是否能删除】

大家好&#xff0c;欢迎来到我的MFC编程入门系列。上次我们聊了MFC项目创建后的核心文件区别&#xff08;项目名.cpp、.h、Dlg.cpp 和 Dlg.h&#xff09;&#xff0c;今天针对读者的反馈&#xff0c;专门来拆解其中最重要的一个文件&#xff1a;项目名.cpp&#xff08;这里以用…

玄机靶场 | 冰蝎3.0-jsp流量分析

文章目录一、冰蝎3.0流量特征二、索引三、题目列表步骤#1黑客IP是什么&#xff1f;步骤#2黑客上传的Webshell名是什么&#xff1f;步骤#3黑客上传WebShell的时间是多少&#xff1f;&#xff08;格式如&#xff1a;flag{YYYY-MM-DD HH:MM:SS}&#xff09;步骤#4木马的解密key是什…

基于物理信息神经网络(Physics-Informed Neural Network, PINN)的三维热传导方程求解器MATLAB

代码实现了一个基于物理信息神经网络&#xff08;Physics-Informed Neural Network, PINN&#xff09;的三维热传导方程求解器。以下是详细分析&#xff1a;&#x1f9e0; 一、主要功能 main.m&#xff1a; 构建一个全连接神经网络用于近似三维热传导方程的解 ( u(x, y, z, t) …

按钮计数器:jQuery / AngularJS / Vue / React / dagger.js 实现对比与技术解读

代码来源&#xff1a;https://codepen.io/dagger8224/pen/myeKgVQ 任务&#xff1a;实现“按钮点击 1”计数器&#xff0c;对比不同框架的写法与特性&#xff0c;并给出选型建议。 目录 代码解读&#xff08;逐框架&#xff09; jQuery&#xff08;命令式 DOM&#xff09;Angu…

useEffect中直接使用 await报错

在 useEffect 中直接使用 await 会报错&#xff0c;因为 useEffect 的回调函数不能是 async 函数。有几种正确的方式来处理异步操作&#xff1a; 方法一&#xff1a;在 useEffect 内部创建 async 函数并立即调用 这是最常用的方式。 import React, { useEffect } from react;co…

卷积神经网络为什么要填充(Padding)

填充&#xff08;Padding&#xff09;是卷积神经网络中一个至关重要且巧妙的设计。它的核心目的可以概括为&#xff1a;为了解决卷积操作导致的特征图尺寸缩小和边缘信息丢失问题。

C++ 并发编程:全面解析主流锁管理类

在 C 的并发世界里&#xff0c;管理共享资源就像是在一个繁忙的十字路口指挥交通。如果指挥不当&#xff0c;就会发生混乱甚至致命的“死锁”。C 标准库提供的各种锁管理工具&#xff0c;就是我们手中的“交通信号灯”&#xff0c;它们各自拥有独特的职能&#xff0c;帮助我们编…