23-1-nginx虚拟主机实战

以下是使用 Mermaid 绘制的基于 Nginx 部署网站的流程图,同时给出对应的代码和详细解释。

Mermaid 代码

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(准备工作):::process --> B(安装 Nginx):::process
    B --> C(创建网站目录):::process
    C --> D(上传网站文件):::process
    D --> E(配置 Nginx):::process
    E --> F(创建虚拟主机配置文件):::process
    F --> G(编辑配置文件):::process
    G --> H(检查配置文件语法):::process
    H -->|语法正确| I(重新加载 Nginx 配置):::process
    H -->|语法错误| J(修改配置文件):::process
    J --> H(检查配置文件语法):::process
    I --> K(启动 Nginx 服务):::process
    K --> L{检查网站是否可访问}:::process
    L -->|是| M(部署成功):::process
    L -->|否| N(排查错误):::process
    N --> E(配置 Nginx):::process

代码解释

准备工作

这是整个部署流程的起始步骤,需要确保服务器满足基本要求,例如具备足够的磁盘空间、网络连接正常等,同时要获取网站的相关文件和域名信息。

安装 Nginx

根据服务器的操作系统类型,使用相应的包管理工具(如 aptyum)来安装 Nginx。例如,在 Ubuntu 系统上可以使用以下命令:

sudo apt update
sudo apt install nginx

创建网站目录

为网站创建一个专门的目录,用于存放网站的文件。通常可以将目录创建在 /var/www 下,例如:

sudo mkdir -p /var/www/example.com

上传网站文件

将网站的 HTML、CSS、JavaScript 等文件上传到刚刚创建的网站目录中。可以使用 scprsync 等工具进行文件传输。

配置 Nginx

Nginx 的配置主要通过编辑配置文件来完成,重点是创建和编辑虚拟主机配置文件。

创建虚拟主机配置文件

在 Nginx 的配置目录(通常是 /etc/nginx/sites-available)下创建一个新的虚拟主机配置文件,例如:

sudo touch /etc/nginx/sites-available/example.com

编辑配置文件

使用文本编辑器(如 vimnano)打开虚拟主机配置文件,添加以下基本配置:

server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

检查配置文件语法

使用 nginx -t 命令检查配置文件的语法是否正确。如果语法正确,会显示 syntax is oktest is successful;如果语法错误,会显示具体的错误信息。

重新加载 Nginx 配置

如果配置文件语法检查通过,使用 nginx -s reload 命令重新加载 Nginx 配置,使新配置生效。

启动 Nginx 服务

确保 Nginx 服务已经启动,如果未启动,可以使用以下命令启动:

sudo systemctl start nginx

检查网站是否可访问

在浏览器中输入网站的域名或服务器的 IP 地址,检查网站是否可以正常访问。如果可以访问,说明部署成功;如果无法访问,需要进行错误排查。

排查错误

如果网站无法访问,需要检查 Nginx 的日志文件(通常位于 /var/log/nginx 目录下),查看错误信息,可能需要重新检查配置文件或网络设置。

这个流程图清晰地展示了基于 Nginx 部署网站的完整过程,以及在部署过程中可能遇到的问题和处理方式。

基于nginx部署网站

image-20220507190942536

虚拟主机指的就是一个独立的站点,具有独立的域名,有完整的www服务,例如网站、FTP、邮件等。

Nginx支持多虚拟主机,在一台机器上可以运行完全独立的多个站点。

下面我会通过 Mermaid 图示展示虚拟主机的概念,同时给出相应代码、对图示的解释以及虚拟主机的文字说明。

Mermaid 代码

graph LR
    classDef server fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef vhost fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
    classDef client fill:#E8F5E9,stroke:#81C784,stroke-width:2px;

    A(物理服务器):::server --> B(虚拟主机 1):::vhost
    A --> C(虚拟主机 2):::vhost
    A --> D(虚拟主机 N):::vhost
    E(客户端 1):::client -->|请求| B
    F(客户端 2):::client -->|请求| C
    G(客户端 M):::client -->|请求| D
    B -->|响应| E
    C -->|响应| F
    D -->|响应| G

图示解释

  • 物理服务器:代表一台实际的硬件服务器,拥有 CPU、内存、硬盘等物理资源,是承载虚拟主机的基础。
  • 虚拟主机:从物理服务器划分出来的多个逻辑服务器实例,图中有虚拟主机 1、虚拟主机 2 直到虚拟主机 N。每个虚拟主机都可以独立配置,运行不同的网站或应用程序。
  • 客户端:表示访问网站或应用程序的用户端设备,如电脑、手机等。客户端 1、客户端 2 直到客户端 M 分别向不同的虚拟主机发送请求,并接收来自对应虚拟主机的响应。

虚拟主机文字说明

虚拟主机是一种将一台物理服务器划分成多个逻辑服务器的技术。通过软件手段,在一台服务器上创建多个相互隔离的虚拟环境,每个虚拟环境就称为一个虚拟主机。每个虚拟主机都有独立的域名和网站空间,并且可以独立配置和管理,就好像拥有一台独立的服务器一样。

虚拟主机技术可以让多个用户或网站共享一台服务器的硬件资源,从而降低了网站建设和运营的成本。同时,虚拟主机之间相互隔离,一个虚拟主机出现问题不会影响其他虚拟主机的正常运行。用户可以根据自己的需求选择不同规格的虚拟主机,如不同的磁盘空间、带宽、流量等。常见的虚拟主机类型有基于 HTTP 的 Web 虚拟主机、基于邮件协议的邮件虚拟主机等。在 Web 服务器(如 Nginx、Apache)中,通过配置虚拟主机,可以方便地在一台服务器上部署多个不同的网站。

一、为什么配置虚拟主机

在使用 Nginx 等 Web 服务器时,配置虚拟主机具有多方面的重要意义,下面为你详细阐述配置虚拟主机的原因:

充分利用服务器资源

  • 硬件资源共享:在同一台物理服务器上可以运行多个网站或应用程序,这些网站或应用程序可以共享服务器的 CPU、内存、磁盘 I/O 等硬件资源。例如,一家小型企业服务器有足够的硬件性能,同时为公司官网、内部论坛和产品展示网站提供服务,通过虚拟主机配置,能让这些网站高效地利用服务器资源,避免为每个网站单独配备服务器造成的资源浪费和成本增加。
  • IP 地址复用:多个虚拟主机可以使用同一个 IP 地址。在 IPv4 地址资源日益稀缺的情况下,这种方式能有效节省 IP 地址资源。比如,服务器只有一个公网 IP 地址,但通过虚拟主机配置,可以同时部署多个不同域名的网站,通过 HTTP 请求头中的 Host 字段来区分不同的网站。

实现网站隔离与独立管理

  • 配置独立:每个虚拟主机都可以有自己独立的配置文件,包括监听端口、文档根目录、日志文件路径、访问控制规则等。这使得不同的网站可以根据自身需求进行个性化配置。例如,一个电商网站可能需要配置 SSL 证书以支持 HTTPS 协议,而一个博客网站可能只需要简单的 HTTP 服务,通过虚拟主机配置,就可以分别为它们设置不同的协议和相关参数。
  • 文件隔离:不同虚拟主机的网站文件存储在不同的目录中,相互之间不会产生干扰。即使某个网站的文件出现问题,也不会影响其他网站的正常运行。例如,一个虚拟主机的网站代码被恶意篡改,由于文件隔离,不会波及到同一服务器上的其他虚拟主机。
  • 日志独立:每个虚拟主机可以有自己独立的访问日志和错误日志,方便对每个网站的访问情况和错误信息进行单独分析和排查。例如,通过分析电商网站的访问日志,可以了解用户的浏览行为和购买习惯,而博客网站的日志则有助于了解文章的受欢迎程度和用户反馈。

便于域名管理与业务拓展

  • 多域名支持:可以为每个虚拟主机绑定不同的域名,这样用户可以通过不同的域名访问不同的网站。例如,一家公司可以将公司官网绑定到 company.com,将产品销售网站绑定到 shop.company.com,通过合理的域名规划,提升品牌形象和用户体验。
  • 业务拓展灵活:随着企业业务的发展,可能需要新增网站或应用程序。通过配置虚拟主机,可以方便地在同一服务器上添加新的网站,而无需进行大规模的服务器架构调整。例如,企业计划推出一个新的产品线,只需配置一个新的虚拟主机,将相关的网站文件部署到对应的目录,并进行相应的配置,即可快速上线新网站。

提高安全性

  • 访问控制:可以为每个虚拟主机设置独立的访问控制规则,如限制特定 IP 地址的访问、设置访问密码等。例如,对于企业的内部论坛,可以设置只允许公司内部 IP 地址访问,从而增强网站的安全性。
  • 资源限制:可以对每个虚拟主机的资源使用进行限制,防止某个网站过度占用服务器资源,影响其他网站的正常运行。例如,为每个虚拟主机设置最大并发连接数、最大带宽使用量等,确保服务器的稳定性和可靠性。

一些草根流量站长,常会搭建个人站点进行资源分享交流,并且可能有多个不同业务的站点,如果每台服务器只运行一个网站,那么将造成资源浪费,成本浪费。

利用虚拟主机的功能,就不用为了运行一个网站而单独配置一个Nginx服务器,或是单独再运行一组Nginx进程。

虚拟主机可以在一台服务器,同一个Nginx进程上运行多个网站。

nginx.conf主配置文件中,最简单的一段虚拟主机配置如下

1.单虚拟主机(静态资源网站)

以下是使用 Mermaid 绘制的单虚拟主机静态资源站点部署流程图,以及对应的代码和详细解释。

graph LR
    classDef step fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(准备工作):::step --> B(安装 Nginx):::step
    B --> C(创建站点目录):::step
    C --> D(上传静态资源):::step
    D --> E(配置 Nginx 虚拟主机):::step
    E --> F(编辑虚拟主机配置文件):::step
    F --> G(检查配置文件语法):::step
    G -->|语法正确| H(重新加载 Nginx 配置):::step
    G -->|语法错误| I(修改配置文件):::step
    I --> G(检查配置文件语法):::step
    H --> J(启动/重启 Nginx 服务):::step
    J --> K(验证站点访问):::step
    K -->|访问成功| L(部署完成):::step
    K -->|访问失败| M(排查错误):::step
    M --> E(配置 Nginx 虚拟主机):::step

各步骤解释

准备工作

在开始部署之前,要确保服务器已联网,具备基本的操作权限,并且了解站点所需的基本信息,如域名、IP 地址等。

安装 Nginx

根据服务器的操作系统,使用相应的包管理工具来安装 Nginx。例如在 Ubuntu 系统中,可以使用以下命令:

sudo apt update
sudo apt install nginx

创建站点目录

为静态资源站点创建一个专门的目录,用来存放 HTML、CSS、JavaScript、图片等文件。一般可以将其创建在 /var/www 目录下,示例命令如下:

sudo mkdir -p /var/www/my-static-site

上传静态资源

将本地开发好的静态资源文件上传到刚刚创建的站点目录中。可以使用 scp 或者 FTP 工具来完成文件的传输。

配置 Nginx 虚拟主机

Nginx 的虚拟主机配置通过编辑配置文件来实现,通常在 /etc/nginx/sites-available 目录下创建一个新的配置文件。

编辑虚拟主机配置文件

使用文本编辑器(如 vimnano)打开配置文件,添加如下基本配置内容:

server {
    listen 80;
    server_name example.com;  # 替换为实际的域名或 IP 地址
    root /var/www/my-static-site;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

检查配置文件语法

使用 nginx -t 命令来检查配置文件的语法是否正确。若语法无误,会显示 syntax is oktest is successful;若存在错误,会显示具体的错误信息。

重新加载 Nginx 配置

当配置文件语法检查通过后,使用 nginx -s reload 命令重新加载 Nginx 配置,使新配置生效。

启动/重启 Nginx 服务

确保 Nginx 服务处于运行状态,若未启动或需要更新配置,可以使用以下命令启动或重启服务:

sudo systemctl start nginx  # 启动服务
sudo systemctl restart nginx  # 重启服务

验证站点访问

在浏览器中输入站点的域名或 IP 地址,检查是否能够正常访问静态资源站点。若能看到预期的页面内容,则表示部署成功;若无法访问,则需要进行错误排查。

排查错误

如果站点无法访问,需要查看 Nginx 的日志文件(通常位于 /var/log/nginx 目录下),查看错误信息,可能需要重新检查配置文件、网络设置等。

这个流程图清晰展示了单虚拟主机静态资源站点部署的完整过程,以及在部署过程中可能遇到的问题和处理方式。

nginx.conf

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

yuchaoit.conf

利用include功能导入其他目录下的配置文件,便于管理多个网站配置,防止全部塞进一个配置文件,难以维护。

[root@web-9 /etc/nginx/conf.d]#grep -Ev '^$|#' /etc/nginx/conf.d/yuchaoit.conf 
server {
    listen       80;
    server_name  localhost;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

查看主页

image-20220507195944431

静态资源如图片等

wget -O 1.gif https://p5.itc.cn/images01/20210329/1ddda8eb9945487f9bdfe951e75a1737.gif

wget -O 2.gif https://p1.itc.cn/images01/20210329/f9a37ab55ba04ff692bccc61bc1cd829.gif

image-20220507204233240

静态文本数据

以下使用 Mermaid 绘制 Nginx 解析静态文本数据的流程图,并给出代码和详细解释。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef data fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A(客户端发起请求):::process --> B(Nginx 接收请求):::process
    B --> C(解析请求 URI):::process
    C --> D{请求是否匹配静态文本资源规则}:::process
    D -->|是| E(根据规则查找静态文本文件):::process
    D -->|否| F(执行其他处理逻辑):::process
    E --> G{是否找到文件}:::process
    G -->|是| H(读取静态文本文件内容):::process
    G -->|否| I(返回 404 错误):::process
    H --> J(设置响应头):::process
    J --> K(返回静态文本数据给客户端):::process
    F --> K
    I --> K
    K --> L(客户端接收响应):::process

流程解释

1. 客户端发起请求

客户端(如浏览器)向 Nginx 服务器发送 HTTP 请求,请求特定的资源,这个请求包含请求方法(如 GET、POST)、请求的 URI 等信息。

2. Nginx 接收请求

Nginx 监听指定的端口(通常是 80 或 443),当接收到客户端的请求后,开始对请求进行处理。

3. 解析请求 URI

Nginx 对请求中的 URI 进行解析,提取出关键信息,例如路径、查询参数等,以便后续判断该请求是否为静态文本资源请求。

4. 判断请求是否匹配静态文本资源规则

Nginx 根据配置文件中定义的规则,判断当前请求的 URI 是否符合静态文本资源的匹配规则。这些规则通常通过 location 指令来定义,例如:

location ~ \.(txt|html)$ {
    # 处理静态文本资源的配置
}

5. 查找静态文本文件

如果请求匹配静态文本资源规则,Nginx 会根据配置的根目录(root 指令)和请求的 URI 来查找对应的静态文本文件。例如:

root /var/www/html;

如果请求的 URI 是 /example.txt,Nginx 会在 /var/www/html 目录下查找 example.txt 文件。

6. 判断是否找到文件

Nginx 检查是否成功找到对应的静态文本文件。如果找到,继续下一步;如果未找到,返回 404 错误给客户端。

7. 读取静态文本文件内容

当找到文件后,Nginx 会读取该文件的内容,准备将其作为响应返回给客户端。

8. 设置响应头

Nginx 根据文件的类型和其他信息,设置合适的响应头,例如 Content-TypeContent-Length 等。对于文本文件,Content-Type 通常设置为 text/plain

9. 返回静态文本数据给客户端

Nginx 将读取的文件内容和设置好的响应头发送给客户端。

10. 客户端接收响应

客户端接收到 Nginx 发送的响应,显示静态文本数据或处理错误信息。

11. 其他处理逻辑

如果请求不匹配静态文本资源规则,Nginx 会执行其他预先配置好的处理逻辑,例如将请求转发到后端服务器等,最终也会将处理结果返回给客户端。

image-20220507204355201

多虚拟主机

以下是使用 Mermaid 绘制的 Nginx 多虚拟主机工作原理的图示代码,以及对该图示的详细解释。

graph LR
    classDef client fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef nginx fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
    classDef vhost fill:#E8F5E9,stroke:#81C784,stroke-width:2px;
    classDef backend fill:#FFEBEE,stroke:#E57373,stroke-width:2px;

    A(客户端 1):::client -->|请求 example1.com| B(Nginx 服务器):::nginx
    C(客户端 2):::client -->|请求 example2.com| B
    D(客户端 3):::client -->|请求 example3.com| B
    B -->|匹配 example1.com| E(虚拟主机 1):::vhost
    B -->|匹配 example2.com| F(虚拟主机 2):::vhost
    B -->|匹配 example3.com| G(虚拟主机 3):::vhost
    E -->|静态资源| A
    E -->|反向代理| H(后端服务器 1):::backend
    F -->|静态资源| C
    F -->|反向代理| I(后端服务器 2):::backend
    G -->|静态资源| D
    G -->|反向代理| J(后端服务器 3):::backend
    H -->|响应| E
    I -->|响应| F
    J -->|响应| G
    E -->|响应| A
    F -->|响应| C
    G -->|响应| D

图示解释

客户端请求

  • 图中有多个客户端(客户端 1、客户端 2、客户端 3),它们分别向 Nginx 服务器发起请求,请求的域名不同,分别是 example1.comexample2.comexample3.com

Nginx 服务器

  • Nginx 服务器作为请求的接收者,它会根据请求头中的 Host 字段来判断请求应该被路由到哪个虚拟主机。

虚拟主机

  • 图中展示了三个虚拟主机(虚拟主机 1、虚拟主机 2、虚拟主机 3),每个虚拟主机对应一个不同的域名。Nginx 根据请求的域名将请求转发到相应的虚拟主机进行处理。
  • 虚拟主机有两种处理方式:
    • 静态资源处理:如果请求的是静态资源(如 HTML、CSS、JavaScript 文件等),虚拟主机可以直接从本地文件系统中读取资源并返回给客户端。
    • 反向代理:如果请求需要由后端服务器处理,虚拟主机可以将请求转发到对应的后端服务器(后端服务器 1、后端服务器 2、后端服务器 3)。

后端服务器

  • 后端服务器接收到虚拟主机转发的请求后,进行相应的处理,并将处理结果返回给虚拟主机。
  • 虚拟主机再将后端服务器的响应返回给客户端。

多虚拟主机的优势

  • 资源共享:多个虚拟主机可以共享同一台物理服务器的硬件资源,降低成本。
  • 独立配置:每个虚拟主机可以有独立的配置,包括监听端口、文档根目录、访问控制规则等,方便管理和维护。
  • 域名隔离:不同的域名可以对应不同的虚拟主机,实现多个网站在同一服务器上的隔离运行。

2.基于IP多虚拟主机

Linux操作系统都能够支持给网卡绑定多个IP地址,可以使得一块网卡上运行多个基于IP的虚拟主机。

[root@web-9 /usr/share/nginx/html]#ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.9  netmask 255.255.255.0  broadcast 10.0.0.255
        ether 00:0c:29:ca:e3:88  txqueuelen 1000  (Ethernet)
        RX packets 180107  bytes 156489622 (149.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 109642  bytes 14407514 (13.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


添加ip
ip addr add 10.0.0.77/24 dev eth0

[root@web-9 /usr/share/nginx/html]#ip addr add 10.0.0.77/24 dev eth0
[root@web-9 /usr/share/nginx/html]#ping 10.0.0.77
PING 10.0.0.77 (10.0.0.77) 56(84) bytes of data.
64 bytes from 10.0.0.77: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 10.0.0.77: icmp_seq=2 ttl=64 time=0.021 ms

修改yuchaoit.conf支持多虚拟主机,编写多个server{}标签即可。

[root@web-9 /usr/share/nginx/html]#grep -Ev '^$|#' /etc/nginx/conf.d/yuchaoit.conf
server {
    listen       10.0.0.9:80;
    server_name  localhost;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/movie;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       10.0.0.77:80;
    server_name  localhost;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

创建测试数据

[root@web-9 /usr/share/nginx/html]#mkdir -p /usr/share/nginx/html/{movie,game}
[root@web-9 /usr/share/nginx/html]#echo '《绝命毒师》' > /usr/share/nginx/html/movie/index.html
[root@web-9 /usr/share/nginx/html]#echo '《王者荣耀》' > /usr/share/nginx/html/game/index.html

重启nginx,访问测试

[root@web-9 /usr/share/nginx/html]#systemctl reload nginx

[root@web-9 /usr/share/nginx/html]#curl 10.0.0.9
《绝命毒师》
[root@web-9 /usr/share/nginx/html]#
[root@web-9 /usr/share/nginx/html]#curl 10.0.0.77
《王者荣耀》

3.基于域名的多虚拟主机

基于多IP的虚拟主机可能会造成IP地址不足的问题,如果没有特殊需求,更常用的是基于多域名的形式。

只需要你单独配置DNS服务器,将主机名对应到正确的IP地址,修改Nginx配置,可以识别到不同的主机即可,这样就可以使得多个虚拟主机用同一个IP,解决了IP不足的隐患。

image-20220507205303909

需要先做好域名解析

未配置dns服务器的话,修改hosts即可

C:\Windows\System32\drivers\etc

写入解析
C:\Windows\System32\drivers\etc

10.0.0.9 movie.yuchaoit.cn
10.0.0.9 www.yuchaoit.cn

yuchaoit.conf

[root@web-9 /usr/share/nginx/html]#grep -Ev '^$|#' /etc/nginx/conf.d/yuchaoit.conf

server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       80;
    server_name  movie.yuchaoit.cn;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/movie;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启查看多域名解析的情况

[root@web-9 /usr/share/nginx/html]#systemctl restart nginx

image-20220507210521385

4.基于多端口的虚拟主机

基于端口的配置在生产环境比较少见,用于特殊场景,例如公司内部测试平台网站,使用特殊端口的后台,OA系统、网站后台,CRM后台等。

案例:运行基于80、81端口的虚拟主机运行

yuchaoit.conf

[root@web-9 /usr/share/nginx/html]#grep -Ev '^$|#' /etc/nginx/conf.d/yuchaoit.conf
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       88;
    server_name  movie.yuchaoit.cn;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/movie;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启查看多端口虚拟主机

image-20220507210840153

5.nginx include

如果所有配置都写入一个文件,维护起来很麻烦,修改错了某一个conf文件,导致所有页面都报错,因此拆分为单个的文件更为合适。

include 指令在 Nginx 配置中用于将一个或多个配置文件包含到主配置文件中,这样可以提高配置文件的可维护性和模块化程度。下面是一个展示 Nginx include 功能的 Mermaid 图示及相关解释。

Mermaid 代码

graph LR
    classDef config fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef subconfig fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A(Nginx 主配置文件 nginx.conf):::config --> B(include 指令):::config
    B --> C(/etc/nginx/conf.d/*.conf):::subconfig
    B --> D(/etc/nginx/sites-enabled/*):::subconfig
    C --> C1(example1.conf):::subconfig
    C --> C2(example2.conf):::subconfig
    D --> D1(site1.conf):::subconfig
    D --> D2(site2.conf):::subconfig
    C1 --> E(虚拟主机配置 1):::subconfig
    C2 --> F(虚拟主机配置 2):::subconfig
    D1 --> G(虚拟主机配置 3):::subconfig
    D2 --> H(虚拟主机配置 4):::subconfig

图示解释

1. Nginx 主配置文件

  • Nginx 主配置文件 nginx.conf 是 Nginx 启动时首先加载的配置文件,它是整个 Nginx 配置的核心。在这个文件中,通常会使用 include 指令来引入其他配置文件。

2. include 指令

  • include 指令用于将其他配置文件的内容合并到当前配置文件中。在图示中,主配置文件通过 include 指令引入了 /etc/nginx/conf.d/*.conf/etc/nginx/sites-enabled/* 这两个路径下的配置文件。

3. 被包含的配置文件路径

  • /etc/nginx/conf.d/*.conf:这是一个通配符路径,表示包含 /etc/nginx/conf.d 目录下所有以 .conf 结尾的文件。例如 example1.confexample2.conf 。这些文件通常包含一些通用的配置,如全局的 HTTP 配置、日志配置等。
  • /etc/nginx/sites-enabled/*:同样是通配符路径,包含 /etc/nginx/sites-enabled 目录下的所有文件。这个目录通常用于存放虚拟主机的配置文件,如 site1.confsite2.conf

4. 具体的配置文件及内容

  • 每个被包含的配置文件都有其特定的用途。例如,example1.conf 可能包含一些特定的 HTTP 模块配置,而 site1.conf 则可能是一个具体虚拟主机的完整配置,包括监听端口、域名、文档根目录等信息。

实际应用中的好处

  • 模块化配置:将不同功能的配置分散到多个文件中,使得每个文件的内容更加简洁,便于管理和维护。例如,将虚拟主机的配置单独存放在一个文件中,当需要修改某个虚拟主机的配置时,只需编辑对应的文件即可。
  • 提高可读性:主配置文件只包含关键的全局配置和 include 指令,避免了主配置文件过于庞大和复杂,提高了配置文件的可读性。
  • 方便团队协作:不同的团队成员可以负责不同的配置文件,减少了因多人同时修改主配置文件而产生的冲突。

/etc/nginx/nginx.conf主文件

[root@web-9 /usr/share/nginx/html]#grep -Ev '^$|#' /etc/nginx/nginx.conf 
user  www;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;  # 这里指定了导入的conf路径
}

www页面配置文件

[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

movie页面配置文件

[root@web-9 /etc/nginx/conf.d]#cat movie.yuchaoit.conf
server {
    listen       80;
    server_name  movie.yuchaoit.cn;
    charset utf-8;
    location / {
        root   /usr/share/nginx/html/movie;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

创建对应的网页数据

[root@web-9 /etc/nginx/conf.d]#echo '我是www页面,今天开心吗 我的朋友' > /usr/share/nginx/html/game/index.html 
[root@web-9 /etc/nginx/conf.d]#
[root@web-9 /etc/nginx/conf.d]#echo "我是movie页面,未来可期是一个积极向上的状态,种下辛苦的种子,来年收获美好" > /usr/share/nginx/html/movie/index.html

查看页面

image-20220508114031357

Nginx日志

以下是使用 Mermaid 绘制的 Nginx 日志相关流程的图示,包含代码、图示及详细解释。

Mermaid 代码

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef log fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A(客户端发起请求):::process --> B(Nginx 处理请求):::process
    B --> C(生成日志记录):::process
    C --> D{日志类型}:::process
    D -->|访问日志| E(access_log):::log
    D -->|错误日志| F(error_log):::log
    E --> G(存储在指定路径):::log
    F --> H(存储在指定路径):::log
    I(管理员):::process --> J(查看访问日志):::process
    I --> K(查看错误日志):::process
    J --> G
    K --> H
    G --> L(日志分析工具):::process
    H --> L
    L --> M(生成分析报告):::process
    M --> N(辅助决策优化):::process

图示解释

1. 请求处理与日志生成

  • 客户端发起请求:客户端(如浏览器)向 Nginx 服务器发送 HTTP 请求。
  • Nginx 处理请求:Nginx 接收到请求后,根据配置进行相应的处理,如转发请求到后端服务器、返回静态资源等。
  • 生成日志记录:在处理请求的过程中,Nginx 会根据配置生成日志记录,记录请求的相关信息。

2. 日志类型及存储

  • 日志类型判断:Nginx 生成的日志主要分为访问日志(access_log)和错误日志(error_log)。
    • 访问日志:记录客户端的访问信息,如客户端 IP 地址、请求时间、请求的 URI、HTTP 状态码等。访问日志会存储在配置中指定的路径下。
    • 错误日志:记录 Nginx 在处理请求过程中出现的错误信息,如配置错误、连接后端服务器失败等。同样,错误日志也会存储在指定路径。

3. 日志查看与分析

  • 管理员查看日志:管理员可以通过命令行工具(如 cattail 等)查看访问日志和错误日志,以便及时发现问题。
  • 日志分析工具:可以使用专业的日志分析工具(如 AWStats、GoAccess 等)对日志进行深入分析。这些工具可以统计访问量、热门页面、客户端地区分布等信息。
  • 生成分析报告:日志分析工具根据分析结果生成详细的报告,直观展示网站的访问情况和性能指标。
  • 辅助决策优化:管理员根据分析报告做出决策,对网站进行优化,如调整配置、优化页面内容、扩展服务器资源等。

Nginx 日志配置示例

以下是一个简单的 Nginx 日志配置示例,展示如何配置访问日志和错误日志:

http {
    # 定义访问日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # 配置访问日志
    access_log /var/log/nginx/access.log main;

    # 配置错误日志
    error_log /var/log/nginx/error.log warn;

    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

在上述配置中,log_format 定义了访问日志的格式,access_log 指定了访问日志的存储路径和使用的日志格式,error_log 指定了错误日志的存储路径和日志级别。

二、创建nginx访问日志

日志对于程序员很重要,可用于问题排错,记录程序运行状态,一个好的日志能够给与精确的问题定位。

Nginx日志功能需要在nginx.conf中打开相关指令log_format,设置日志格式,以及设置日志的存储位置access_log,指定日志的格式,路径,缓存大小。

以下是使用 Mermaid 绘制的 Nginx 日志变量相关图示,通过图示可以更清晰地理解各个日志变量在请求处理流程中的作用和关联。

graph LR
    classDef client fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef nginx fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
    classDef var fill:#E8F5E9,stroke:#81C784,stroke-width:2px;
    classDef log fill:#FFEBEE,stroke:#E57373,stroke-width:2px;

    A(客户端):::client -->|发送请求| B(Nginx 服务器):::nginx
    B --> C{处理请求}:::nginx
    C -->|记录变量| D($remote_addr):::var
    C -->|记录变量| E($remote_user):::var
    C -->|记录变量| F($http_user_agent):::var
    C -->|记录变量| G($http_referer):::var
    C -->|记录变量| H($request):::var
    C -->|记录变量| I($request_method):::var
    C -->|记录变量| J($request_uri):::var
    C -->|记录变量| K($query_string):::var
    C -->|记录变量| L($status):::var
    C -->|记录变量| M($body_bytes_sent):::var
    C -->|记录变量| N($time_local):::var
    C -->|记录变量| O($request_time):::var
    C -->|记录变量| P($server_name):::var
    C -->|记录变量| Q($http_x_forwarded_for):::var
    D --> R(日志格式组合):::log
    E --> R
    F --> R
    G --> R
    H --> R
    I --> R
    J --> R
    K --> R
    L --> R
    M --> R
    N --> R
    O --> R
    P --> R
    Q --> R
    R --> S(写入日志文件):::log

图示解释

1. 客户端与 Nginx 交互

  • 客户端向 Nginx 服务器发送 HTTP 请求,Nginx 服务器接收到请求后开始处理。

2. 记录日志变量

  • 在处理请求的过程中,Nginx 会记录各种日志变量,这些变量反映了请求和响应的不同方面:
    • 客户端信息
      • $remote_addr:客户端的 IP 地址。
      • $remote_user:客户端用户的名称(用于基本认证)。
      • $http_user_agent:客户端的用户代理信息。
      • $http_referer:请求的来源页面 URL。
    • 请求信息
      • $request:完整的请求行。
      • $request_method:请求方法(如 GET、POST)。
      • $request_uri:请求的完整 URI。
      • $query_string:请求 URI 中的查询参数。
    • 响应信息
      • $status:响应状态码。
      • $body_bytes_sent:发送给客户端的响应体字节数。
    • 时间信息
      • $time_local:请求处理完成的本地时间。
      • $request_time:处理请求所花费的时间。
    • 其他信息
      • $server_name:处理请求的虚拟主机名称。
      • $http_x_forwarded_for:客户端的真实 IP 地址(在反向代理场景下)。

3. 日志格式组合

  • 这些日志变量会根据 log_format 指令中定义的格式进行组合,形成完整的日志记录。

4. 写入日志文件

  • 最终,组合好的日志记录会被写入到指定的日志文件中,供后续的分析和查看。

通过这个图示,可以直观地看到 Nginx 日志变量在请求处理和日志记录过程中的作用和流程。

1.日志格式字段解释

nginx.conf中有关访客日志定义如下
 #a
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

 access_log  logs/access.log  main;

参数解释 
$remote_addr :记录访问网站的客户端IP地址
$remote_user :记录远程客户端用户名称
$time_local :记录访问时间与时区
$request :记录用户的 http 请求起始行信息(请求方法,http协议)
$status :记录 http 状态码,即请求返回的状态,例如 200 、404 、502 等
$body_bytes_sent :记录服务器发送给客户端的响应 body 字节数
$http_referer :记录此次请求是从哪个链接访问过来的,可以根据 referer 进行防盗链设置
$http_user_agent :记录客户端访问信息,如浏览器、手机客户端等
$http_x_forwarded_for :当前端有代理服务器时,设置 Web 节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的 x_forwarded_for 设置

备注
$remote_addr 可能拿到的是反向代理IP地址
$http_x_forwarded_for 可以获取客户端真实IP地址

在 Nginx 中,日志变量用于记录 HTTP 请求和响应的各种信息,这些变量可以在 log_format 指令中组合使用,以定制日志的输出格式。以下是一些常见的 Nginx 日志变量字段及其解释:

客户端相关变量

$remote_addr

  • 含义:客户端的 IP 地址。这是客户端发起请求时使用的 IP 地址,如果客户端通过代理服务器访问,该地址通常是代理服务器的 IP 地址。
  • 示例192.168.1.100

$remote_user

  • 含义:客户端用户的名称,通常用于 HTTP 基本认证。如果客户端没有进行认证,该变量的值为空。
  • 示例username

$http_user_agent

  • 含义:客户端使用的用户代理信息,包含了客户端的浏览器类型、版本、操作系统等信息。通过该变量可以了解客户端的设备和软件环境。
  • 示例Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36

$http_referer

  • 含义:客户端请求的来源页面的 URL。该变量可以用于分析用户是从哪个页面链接到当前页面的,对于了解网站的流量来源很有帮助。
  • 示例https://www.example.com/page1.html

请求相关变量

$request

  • 含义:完整的 HTTP 请求行,包括请求方法(如 GET、POST)、请求的 URI 和 HTTP 版本。
  • 示例GET /index.html HTTP/1.1

$request_method

  • 含义:HTTP 请求方法,常见的有 GET、POST、PUT、DELETE 等。
  • 示例GET

$request_uri

  • 含义:客户端请求的完整 URI,包括路径和查询参数。
  • 示例/products?category=electronics

$query_string

  • 含义:请求 URI 中的查询参数部分,不包括 ? 符号。
  • 示例category=electronics

响应相关变量

$status

  • 含义:HTTP 响应状态码,用于表示请求的处理结果。常见的状态码有 200 表示成功,404 表示未找到资源,500 表示服务器内部错误等。
  • 示例200

$body_bytes_sent

  • 含义:发送给客户端的响应体的字节数,不包括响应头的字节数。
  • 示例1234

时间相关变量

$time_local

  • 含义:请求处理完成的本地时间,格式为 [日/月/年:时:分:秒 +时区]
  • 示例15/Jul/2023:10:30:45 +0800

$request_time

  • 含义:处理请求所花费的时间,单位为秒,精确到毫秒。该变量可以用于分析请求的处理性能。
  • 示例0.023

其他变量

$server_name

  • 含义:处理请求的虚拟主机的名称,即 server_name 指令中配置的名称。
  • 示例www.example.com

$http_x_forwarded_for

  • 含义:在使用反向代理时,该变量记录了客户端的真实 IP 地址。当客户端通过多个代理服务器访问时,该变量会包含多个 IP 地址,用逗号分隔。
  • 示例192.168.1.100, 10.0.0.1

日志格式配置示例

以下是一个使用上述部分日志变量的 log_format 配置示例:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

在这个示例中,定义了一个名为 main 的日志格式,然后将其应用到访问日志中。这样,访问日志将按照指定的格式记录请求和响应的相关信息。

2.日志格式参考

image-20220508114914425

3.生成日志

image-20220508115345194

1.检测日志
[root@web-9 ~]#tail -f /var/log/nginx/access.log 


2.循环访问10次
[root@web-9 ~]#for i in {1..10};do curl 10.0.0.9/yuchao.png;done

3.查看日志

4.关闭日志

若是有大量日志写入是比较占用磁盘IO,特殊情况下,可以关闭日志功能;

关于日志的2个参数

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

日志指令语法

access_log  path  [format  buffer=size  | off]

path代表日志存放路径
off是关闭日志

关闭日志记录

#access_log  /var/log/nginx/access.log  main;
access_log off;

此时就不会记录访客日志了

5.多虚拟主机的日志

由于企业会有多个网站业务,日志也必然需要分开记录。

单独写入到各自的server{}标签内即可。

在 Nginx 中为多虚拟主机进行独立的日志配置,有助于更精准地对每个虚拟主机的访问情况和错误信息进行监控、分析与管理。以下详细介绍配置步骤和示例。

配置思路

为每个虚拟主机创建独立的访问日志和错误日志文件,这样可以分别查看和分析每个网站的日志信息,避免不同虚拟主机的日志信息混杂在一起。

配置步骤

1. 准备工作

确保 Nginx 已经安装并且处于运行状态。同时,为每个虚拟主机创建对应的网站根目录,例如:

sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html

设置目录权限,确保 Nginx 有访问权限:

sudo chown -R www-data:www-data /var/www
sudo chmod -R 755 /var/www

2. 创建虚拟主机配置文件

为每个虚拟主机创建独立的配置文件,存放在 /etc/nginx/sites-available 目录下。

示例 1:/etc/nginx/sites-available/example1.com

server {
    listen 80;
    server_name example1.com;

    root /var/www/example1.com/html;
    index index.html;

    # 独立的访问日志配置
    access_log /var/log/nginx/example1.com.access.log;
    # 独立的错误日志配置
    error_log /var/log/nginx/example1.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

示例 2:/etc/nginx/sites-available/example2.com

server {
    listen 80;
    server_name example2.com;

    root /var/www/example2.com/html;
    index index.html;

    # 独立的访问日志配置
    access_log /var/log/nginx/example2.com.access.log;
    # 独立的错误日志配置
    error_log /var/log/nginx/example2.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

配置解释

  • access_log:指定该虚拟主机的访问日志文件路径。Nginx 会将客户端对该虚拟主机的访问请求信息记录到这个文件中。
  • error_log:指定该虚拟主机的错误日志文件路径。当 Nginx 在处理该虚拟主机的请求过程中出现错误时,相关错误信息会记录到这个文件中。

3. 创建符号链接

/etc/nginx/sites-available 目录下的配置文件链接到 /etc/nginx/sites-enabled 目录,使配置文件生效:

sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/

4. 检查配置文件语法

在重新加载 Nginx 之前,使用以下命令检查配置文件的语法是否正确:

sudo nginx -t

如果语法正确,会显示 syntax is oktest is successful

5. 重新加载 Nginx 配置

如果配置文件语法检查通过,使用以下命令重新加载 Nginx 配置:

sudo systemctl reload nginx

自定义日志格式(可选)

除了使用默认的日志格式,你还可以为每个虚拟主机自定义日志格式。例如,在 http 块中定义一个新的日志格式,然后在虚拟主机配置中使用:

http {
    # 定义自定义日志格式
    log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {
        listen 80;
        server_name example1.com;

        root /var/www/example1.com/html;
        index index.html;

        # 使用自定义日志格式
        access_log /var/log/nginx/example1.com.access.log custom;
        error_log /var/log/nginx/example1.com.error.log;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

通过以上步骤,你就可以为多虚拟主机实现独立的日志配置,方便对每个虚拟主机的日志进行管理和分析。

1.全局配置

全局定义好日志格式,子页面配置中定义日志路径即可。

[root@web-9 /etc/nginx/conf.d]#cat /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';


    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

2.www页面的日志

定义日志路径

[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf 
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

3.movie页面日志

[root@web-9 /etc/nginx/conf.d]#cat movie.yuchaoit.conf 
server {
    listen       80;
    server_name  movie.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/movie.yuchaoit.log;
    location / {
        root   /usr/share/nginx/html/movie;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

4.日志记录结果

image-20220508121048214

三、错误日志

以下是一个使用 Mermaid 绘制的 Nginx 错误日志相关流程的图示,包含了从客户端请求到错误日志记录、查看与分析的整个过程。

graph LR
    classDef client fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef nginx fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
    classDef error fill:#FFEBEE,stroke:#E57373,stroke-width:2px;
    classDef log fill:#F1F8E9,stroke:#8BC34A,stroke-width:2px;
    classDef admin fill:#E3F2FD,stroke:#2196F3,stroke-width:2px;
    classDef analysis fill:#FCE4EC,stroke:#EC407A,stroke-width:2px;

    A(客户端):::client -->|发送请求| B(Nginx 服务器):::nginx
    B --> C{处理请求}:::nginx
    C -->|正常处理| D(返回响应):::nginx
    C -->|出现错误| E(错误类型判断):::error
    E -->|配置错误| F(记录配置错误日志):::log
    E -->|连接错误| G(记录连接错误日志):::log
    E -->|资源错误| H(记录资源错误日志):::log
    F --> I(错误日志文件):::log
    G --> I
    H --> I
    J(管理员):::admin -->|查看| I
    I -->|分析| K(日志分析工具):::analysis
    K -->|生成报告| L(错误分析报告):::analysis
    L -->|决策| M(优化配置或修复问题):::admin

图示解释

1. 客户端请求与 Nginx 处理

  • 客户端向 Nginx 服务器发送 HTTP 请求,Nginx 服务器接收到请求后开始进行处理。

2. 错误判断与日志记录

  • 正常处理:如果请求处理过程中没有出现错误,Nginx 会直接返回响应给客户端。
  • 出现错误:当请求处理过程中出现错误时,Nginx 会对错误类型进行判断,常见的错误类型包括:
    • 配置错误:例如 Nginx 配置文件中的语法错误、指令使用错误等。当出现配置错误时,Nginx 会将相关错误信息记录到错误日志文件中。
    • 连接错误:如无法连接到后端服务器、客户端连接超时等。这些连接错误信息也会被记录到日志中。
    • 资源错误:例如请求的文件不存在、权限不足等情况,同样会被记录下来。

3. 错误日志文件

所有不同类型的错误信息最终都会汇总到错误日志文件中,该文件的路径可以在 Nginx 配置文件中通过 error_log 指令进行指定。

4. 管理员查看与分析

  • 管理员可以通过命令行工具(如 cattail 等)查看错误日志文件的内容,了解服务器出现的错误情况。
  • 为了更深入地分析错误,管理员可以使用专业的日志分析工具对错误日志进行处理,生成详细的错误分析报告。

5. 决策与优化

根据错误分析报告,管理员可以做出相应的决策,对 Nginx 的配置进行优化或者修复服务器中存在的问题,以提高服务器的稳定性和性能。

Nginx 错误日志配置示例

在 Nginx 配置文件中,错误日志的配置如下:

error_log /var/log/nginx/error.log warn;

这里指定了错误日志文件的路径为 /var/log/nginx/error.log,日志级别为 warn,表示只记录警告级别及以上的错误信息。你可以根据需要调整日志级别,常见的日志级别包括 debuginfonoticewarnerrorcritalertemerg

Nginx能够将自身运行故障的信息也写入到指定的日志文件中。对于错误信息的调试,是维护Nginx的重要手段,指令是error_log,可以放在http{}全局中,也可以单独为虚拟主机记录。

语法:
error_log file  level;

日志级别在乎debug|info|notice|warn|error|crit|alert|emerg
级别越高,日志记录越少,生产常用模式是warn|error|crit级别
日志的记录,会给服务器增加额外大量的IO消耗,按需修改

0.自动生成配置文件模板

https://www.digitalocean.com/community/tools/nginx?domains.0.php.wordPressRules=true&domains.0.logging.accessLog=true&domains.0.logging.errorLog=true&global.app.lang=zhCN

0.去掉主配置的error_log

[root@web-9 /etc/nginx/conf.d]#cat  /etc/nginx/nginx.conf 

user  www;
worker_processes  auto;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';


    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

1.记录movie页面的错误日志

[root@web-9 /etc/nginx/conf.d]#cat movie.yuchaoit.conf 
server {
    listen       80;
    server_name  movie.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/movie.yuchaoit.log;
    error_log /var/log/nginx/error.movie.yuchaoit.log;
    location / {
        root   /usr/share/nginx/html/movie;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

2.记录www页面的错误日志

[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf 
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    error_log  /var/log/nginx/error.www.yuchaoit.log;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

3.重启服务,检查日志

[root@web-9 /etc/nginx/conf.d]#systemctl restart nginx

[root@web-9 ~]#ls /var/log/nginx/
access.log  error.movie.yuchaoit.log  movie.yuchaoit.log
error.log   error.www.yuchaoit.log    www.yuchaoit.log

4.记录错误日志

当访问该网站出现各种错误时,将被记录日志;

运维可以根据该日志找出当前服务器存在的错误问题,进行修复;

image-20220508123050035

四、404页面优化

以下是使用 Mermaid 绘制的 404 页面优化流程图示,以及对应的代码和详细解释。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef page fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
    classDef check fill:#E8F5E9,stroke:#81C784,stroke-width:2px;

    A(用户请求页面):::process --> B{页面是否存在}:::check
    B -->|是| C(返回正常页面):::process
    B -->|否| D(触发 404 错误):::process
    D --> E(显示默认 404 页面):::page
    E --> F(评估默认页面效果):::check
    F -->|效果不佳| G(设计自定义 404 页面):::process
    F -->|效果良好| H(继续使用默认页面):::process
    G --> I(添加友好提示信息):::process
    I --> J(提供导航链接):::process
    J --> K(设计美观布局):::process
    K --> L(测试自定义 404 页面):::process
    L --> M{测试是否通过}:::check
    M -->|是| N(部署自定义 404 页面):::process
    M -->|否| G(重新设计自定义 404 页面):::process
    N --> O(持续监控与优化):::process

图示解释

1. 用户请求与 404 错误触发

  • 用户请求页面:用户在浏览器中输入 URL 发起页面请求。
  • 页面是否存在判断:服务器检查请求的页面是否存在。如果存在,返回正常页面;如果不存在,触发 404 错误。

2. 默认 404 页面处理

  • 显示默认 404 页面:当触发 404 错误时,服务器首先显示默认的 404 页面。
  • 评估默认页面效果:对默认 404 页面的效果进行评估,判断其是否能够满足用户需求,如是否提供了有用信息、界面是否友好等。

3. 自定义 404 页面设计

  • 设计自定义 404 页面:如果默认 404 页面效果不佳,则开始设计自定义 404 页面。
  • 添加友好提示信息:在自定义 404 页面中添加友好的提示信息,如告知用户页面不存在的原因、表达歉意等。
  • 提供导航链接:为用户提供一些有用的导航链接,如返回主页、热门页面等,帮助用户继续浏览网站。
  • 设计美观布局:设计一个美观、与网站风格一致的页面布局,提高用户体验。

4. 测试与部署

  • 测试自定义 404 页面:对设计好的自定义 404 页面进行测试,检查页面的显示效果、链接是否可用等。
  • 测试是否通过判断:如果测试通过,部署自定义 404 页面;如果测试不通过,重新设计自定义 404 页面。

5. 持续监控与优化

  • 持续监控与优化:部署自定义 404 页面后,持续监控用户反馈和页面数据,根据情况对 404 页面进行优化,以提高用户满意度。

Nginx 配置自定义 404 页面示例

在 Nginx 配置文件中,可以通过以下配置指定自定义 404 页面:

server {
    listen 80;
    server_name example.com;

    root /var/www/html;
    index index.html;

    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
}

上述配置中,error_page 404 /404.html; 指定当出现 404 错误时,返回 /404.html 页面。location = /404.html { internal; } 确保该页面只能通过内部错误跳转访问。

nginx指令error_page的作用是当发生错误的时候能够显示一个预定义的uri;

语法1
error_page 404 /404.html;

语法2
error_page 404 https://error.taobao.com/app/tbhome/common/error.html;

1.修改www页面的404优化

默认404页面很丑

image-20220508124517199

优化之后

1.修改配置文件
[root@web-9 /usr/share/nginx/html]#cat  /etc/nginx/conf.d/www.yuchaoit.conf 
server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    error_log  /var/log/nginx/error.www.yuchaoit.log;
    error_page 404 /404.html;
    location / {
        root   /usr/share/nginx/html/game;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}


2.创建404.html,注意这里是表示去访问www.yuchaoit.cn/404.html
因此该文件要放入 root参数指定的网页根目录下
[root@web-9 /usr/share/nginx/html]#cat game/404.html 

<h1 style='red'>您访问的地址有误,请正确查找 </h1>

image-20220508125452027

2.指定另一个url

server {
    listen       80;
    server_name  movie.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/movie.yuchaoit.log;
    error_log /var/log/nginx/error.movie.yuchaoit.log;
    error_page 404 https://error.taobao.com/app/tbhome/common/error.html;
    location / {
        root   /usr/share/nginx/html/movie;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
~                                                                                       
~

image-20220508125645085

Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2025-02-12 20:25:14

results matching ""

    No results matching ""