当前位置: 首页 > backend >正文

(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.xdnf.cn/news/19024.html

相关文章:

  • 网络编程(2)—多客户端交互
  • Uniapp + UView + FastAdmin 性格测试小程序方案
  • Qt类-扩充_xiaozuo
  • 龙巍:探究青铜器在木雕中的运用
  • 学习:uniapp全栈微信小程序vue3后台(6)
  • 【国内电子数据取证厂商龙信科技】ES 数据库重建
  • 【Flask】测试平台开发,产品管理实现添加功能-第五篇
  • DevOps
  • 沃尔玛AI系统Wally深度拆解:零售业库存周转提速18%,动态定价争议与员工转型成热议点
  • GitHub宕机自救指南
  • 2024年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 构建免费的音视频转文字工具:支持多语言的语音识别项目
  • 2025 DDC系统选型白皮书:构建高效低碳智慧楼宇的核心指南
  • MySQL 深分页:性能优化
  • SQL-Server分页查询多种方法讲解以及分页存储过程
  • Total PDF Converter多功能 PDF 批量转换工具,无水印 + 高效处理指南
  • 【Big Data】Alluxio 首个基于云的数据分析和开源AI数据编排技术
  • Zynq开发实践(FPGA之按键输入)
  • el-select多选下拉框出现了e611
  • 参数模板优化配置指南:从基础到进阶的完整解决方案
  • 学习游戏制作记录(音频的制作和使用)8.28
  • iOS开发之苹果系统包含的所有字体库
  • Node.js汉字转拼音指南:pinyin-pro全解析
  • R 语言 + 卒中 Meta 分析
  • 神经网络|(十六)概率论基础知识-伽马函数·中
  • vant Overlay 遮罩层内元素无法滚动解决方案
  • Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多模态数据融合与检测精度提升(405)
  • 手写链路追踪
  • 新手向:从零开始理解百度语音识别API的Python实现
  • 跨境物流数字化转型怎么做?集运/转运系统定制,源码交付,助力企业降本增效,抢占市场先机