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

Nginx 开发总结

文章目录

    • 1. Nginx 基础概念
      • 1-1、什么是 Nginx
      • 1-2、Nginx 的工作原理
      • 1-3、Nginx 的核心特点
      • 1-4、Nginx 的常见应用场景
      • 1-5、Nginx 与 Apache 的区别
      • 1-6、 Nginx 配置的基本结构
      • 1-7、Nginx 常见指令
    • 2. Nginx 配置基础
      • 2-1、Nginx 配置文件结构
      • 2-2、全局配置 (Global Block)
      • 2-3、HTTP 配置 (HTTP Block)
      • 2-4、Server 配置 (Server Block)
      • 2-5、Location 配置 (Location Block)
      • 2-6、配置反向代理
      • 2-7、配置负载均衡
    • 3. Nginx 作为 Web 服务器
      • 3-1、Nginx Web 服务器基本概念
        • **Web 服务器的作用**
        • **Nginx 的工作方式**
      • 3-2、配置 Nginx 作为 Web 服务器
        • **配置静态文件服务**
        • **配置动态请求(例如 PHP)**
        • **配置访问日志和错误日志**
        • **配置文件的热重载**
      • 3-3、Nginx 配置优化
        • **启用 Gzip 压缩**
        • **配置缓存**
        • **配置负载均衡**
          • 轮询(Round Robin)
          • 最少连接(Least Connections)
          • IP 哈希(IP Hash)
          • 总结:
        • 配置 SSL/TLS 加密
      • 3-4、Nginx 作为 Web 服务器的优势
      • 备注:什么是事件驱动?
    • 4. Nginx 反向代理
      • 4-1、反向代理的优势
      • 4-2、反向代理配置
        • **配置负载均衡**
        • **配置负载均衡策略**
        • **配置 SSL 终结**
        • **配置缓存**
      • 4-3、反向代理的常见用途
        • **负载均衡**
        • **安全性**
        • **SSL/TLS 终结**
        • **缓存和加速**
      • 4-4、Nginx 反向代理配置总结
    • 5. Nginx 负载均衡
      • **5-1、负载均衡的基本概念**
      • 5-2、Nginx 的负载均衡配置
        • **基本的负载均衡配置**
        • **负载均衡策略**
        • **后端服务器的权重**
        • **健康检查与故障转移**
        • **加权负载均衡与健康检查(Nginx Plus)**
      • 5-3、负载均衡示例
      • 5-4、总结
    • 6. Nginx 安全与性能优化
      • 6-1、Nginx 安全优化
      • 6-2、Nginx 性能优化
        • **配置工作进程数**
        • **静态文件缓存**
        • **代理缓存**
      • 6-3、启用 Gzip 压缩
      • 6-4、配置适当的客户端请求大小
      • 6-5、使用异步 I/O
      • 6-6、调整 TCP 配置
      • 6-7、总结
      • **安全优化要点**
      • **性能优化要点**
    • 7. Nginx 与 PHP 结合
      • 7-1、Nginx 与 PHP 的结合原理
      • 7-2、配置 Nginx 与 PHP 的结合
        • **编辑 PHP-FPM 配置文件**
      • 7-3、配置 Nginx
        • **编辑 Nginx 配置文件**
        • **关键配置项说明:**
      • 7-4、重启 Nginx 和 PHP-FPM
      • 7-5、测试 PHP 是否正常工作
      • 7-6、安全配置
      • 7-7、总结
    • 8. Nginx 日志管理
      • 8-1、Nginx 日志的基本概念
      • 8-2、配置 Nginx 日志
      • 8-3、查看和分析 Nginx 日志
      • 8-4、总结
    • 9. Nginx 高级功能
      • 9-1、Nginx 的高级功能概述
      • 9-2、负载均衡
      • 9-3、健康检查
      • 9-4、缓存机制
      • 注意:`proxy_cache` 和 `fastcgi_cache`的区别
      • 9-4、WebSocket 支持
      • 9-5、SSL/TLS 加密
      • 9-6、限制请求和流量控制
      • 9-7、访问控制
      • 9-8、配置文件热更新
      • 9-9、动态模块支持
      • 9-10、异步处理与性能优化
      • 9-11、总结
    • 10. Nginx 常见问题及排查
      • 10-1、Nginx 启动或重启失败
      • 10-2、Nginx 无法访问网站
      • 10-3、性能问题
      • 10-4、日志问题
      • 10-5、SSL/TLS 问题
      • 10-6、文件上传问题
      • 10-7、常见错误码及排查
      • 10-8、总结

1. Nginx 基础概念

Nginx(发音为 “Engine-X”)是一个高性能的 Web 服务器,反向代理服务器,负载均衡器以及 HTTP 和反向代理缓存系统。它最初由 Igor Sysoev 开发,目标是提供高性能的 Web 服务,能够处理高并发的连接。

1-1、什么是 Nginx

Nginx 是一个开源的 Web 服务器软件,最初设计为一个高性能的 HTTP 服务器,后来也被广泛用于反向代理、负载均衡、缓存和其他网络服务

  • Web 服务器:Nginx 最常用的角色是作为 Web 服务器,它可以处理静态文件(如 HTML、图片、CSS 和 JavaScript 等),并能通过反向代理将动态请求转发给其他服务(如 PHP、Node.js 等)。
  • 反向代理服务器:反向代理是将客户端请求转发到后端服务器,并将响应返回给客户端。Nginx 可以作为反向代理服务器,广泛用于负载均衡、请求路由等场景。
  • 负载均衡器:Nginx 能够分配进入的请求到多个后端服务器(如 Web 应用服务器),从而实现负载均衡,确保系统的高可用性和可扩展性。
  • HTTP 缓存:Nginx 能够缓存后端响应,减少后端服务器的负载,提高响应速度。

1-2、Nginx 的工作原理

Nginx 的工作原理基于事件驱动的架构,能够处理大量的并发连接。与传统的进程/线程模型不同,Nginx 采用异步、事件驱动模型,确保能够高效地处理大量并发请求。

  • 事件驱动模型:Nginx 使用事件驱动模型,在收到请求后,它并不立即启动新的进程或线程,而是将请求分配给 worker 进程来处理。worker 进程会在一个事件循环中处理请求,这种方式避免了传统 Web 服务器的进程切换和上下文切换的性能开销。
  • 主进程(master process)和工作进程(worker process)
  • 主进程:负责管理工作进程,包括启动、停止和重新加载配置。
  • 工作进程:每个工作进程处理来自客户端的请求。Nginx 使用多工作进程的设计,以便可以并行处理多个请求,提高并发性能。

1-3、Nginx 的核心特点

  • 高性能:Nginx 采用异步事件驱动模型,能够高效处理成千上万的并发请求,且每个请求只占用一个线程,因此能够有效减少系统资源的消耗。
  • 轻量级:Nginx 的内存占用和 CPU 消耗较少,能够在资源有限的服务器上运行,并能支持高并发的访问。
  • 反向代理和负载均衡:Nginx 可以将请求转发到多个后端服务器,支持多种负载均衡策略(如轮询、最少连接等)。
  • 灵活的配置:Nginx 配置灵活,可以根据需要进行调整,如设置反向代理、缓存、SSL 配置等。
  • 高可用性:Nginx 能够与多个后端服务器共同工作,支持健康检查、自动故障转移等机制,提高系统的可靠性。

1-4、Nginx 的常见应用场景

  • 静态内容的服务:Nginx 通常用于提供静态文件的服务,例如 HTML 文件、CSS 文件、JavaScript 文件以及图片、音频和视频等。
  • 反向代理:Nginx 被广泛用于反向代理其他应用服务器,如将请求代理到 Node.js、PHP 或其他后端服务。
  • 负载均衡当有多个 Web 应用服务器时,Nginx 可以作为负载均衡器,将请求分发到后端服务器,平衡负载并提高应用的可扩展性
  • API 网关:Nginx 还可以作为 API 网关,将请求路由到不同的服务和微服务架构中。
  • SSL/TLS 加密:Nginx 可以用于配置 HTTPS 连接,对 Web 流量进行加密,提高安全性。

1-5、Nginx 与 Apache 的区别

Nginx 和 Apache 都是最常用的 Web 服务器,但它们的工作方式和适用场景有所不同。

  • 性能差异:Nginx 在高并发的场景下表现更加优越,因为它基于事件驱动模型,而 Apache 是基于多进程或多线程模型。在高并发的情况下,Apache 会消耗更多的系统资源。
  • 配置复杂度:Nginx 的配置文件语法简单、清晰,而 Apache 的配置更为复杂。
  • 资源消耗:Nginx 占用的内存和 CPU 比 Apache 更少,这使得 Nginx 更适合处理大量并发请求。
  • 反向代理和负载均衡:Nginx 天生支持反向代理和负载均衡,而 Apache 则需要额外的模块支持。

1-6、 Nginx 配置的基本结构

Nginx 配置文件(nginx.conf)采用模块化配置结构,通常包含以下几个部分:

  • 全局设置:包括设置工作进程数、用户、日志路径等。
  • HTTP 块:配置 HTTP 服务的相关选项,如静态文件处理、反向代理、缓存等
  • Server 块:每个 Server 块对应一个虚拟主机的配置,指定如何处理特定域名的请求。
  • Location 块:在 Server 块内,Location 块用于定义如何处理特定路径的请求。

1-7、Nginx 常见指令

  • worker_processes:设置工作进程数,通常设为 CPU 核心数。
  • worker_connections:每个工作进程最多能处理的连接数。
  • server_name:配置服务器名称,匹配域名请求。
  • listen:指定监听的端口。
  • location:定义请求路径的处理规则,如 <font style="color:#DF2A3F;">/api/</font><font style="color:#DF2A3F;">/static/</font>
  • proxy_pass:配置反向代理,指定后端服务器的地址。
  • access_log:定义访问日志的存储路径。
  • error_log:定义错误日志的存储路径。

Nginx 是一个强大、灵活且高效的 Web 服务器,适用于各种 Web 服务场景。它不仅能高效处理静态文件,还能通过反向代理和负载均衡功能将请求分发到后端服务器,提高系统的扩展性和可用性。

2. Nginx 配置基础

Nginx 配置文件(nginx.conf)采用层次化的模块化配置结构,灵活且强大。

2-1、Nginx 配置文件结构

Nginx 配置文件一般位于 /etc/nginx/nginx.conf,其中包含了全局配置、HTTP 配置以及 Server 配置等内容。配置文件的基本结构如下:

# 全局配置
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;# HTTP 配置
http {include       /etc/nginx/mime.types;default_type  application/octet-stream;server {listen       80;server_name  localhost;# 网站根目录和索引文件root   /usr/share/nginx/html;index  index.html index.htm;location / {try_files $uri $uri/ =404;}}
}

配置文件主要分为4个区域:

  1. 全局配置:用于全局的 Nginx 配置。
  2. HTTP 配置:用于配置 HTTP 服务和网络处理规则。
  3. Server 配置:配置虚拟主机、域名和处理规则。
  4. Location 配置:细化 Server 配置,处理不同路径的请求。

2-2、全局配置 (Global Block)

全局配置部分用于定义 Nginx 进程的行为,通常包含以下指令:

  • user:指定运行 Nginx 的用户和用户组。
user www-data;
  • worker_processes:指定 Nginx 启动的工作进程数,通常设为 CPU 核心数。
worker_processes 1;
  • error_log:指定错误日志文件的路径。
error_log /var/log/nginx/error.log;
  • pid:指定存储 Nginx 进程 ID 的文件路径。
pid /var/run/nginx.pid;
  • worker_connections:设置每个工作进程的最大连接数。
worker_connections 1024;

2-3、HTTP 配置 (HTTP Block)

HTTP 块是配置 HTTP 服务的地方,包含了常见的 Web 服务器配置,例如虚拟主机、代理、缓存等。http 块可以包含多个 server 块,定义不同的虚拟主机。

常用的 HTTP 配置指令:

  • include:引入外部配置文件。
include /etc/nginx/mime.types;
  • default_type:指定默认的文件类型。
default_type application/octet-stream;
  • server:定义一个虚拟主机的配置。
server {listen 80;server_name example.com;root /var/www/html;
}
  • server_name:指定虚拟主机的域名或 IP。
server_name example.com;
  • listen:指定服务器监听的端口号。
listen 80;
  • access_log:指定访问日志文件的路径。
access_log:指定访问日志文件的路径。
  • root:指定站点的根目录。
root /var/www/html;

2-4、Server 配置 (Server Block)

Server 块是虚拟主机的配置,用于处理不同域名、端口号的请求。每个 server 块可以包含多个 location 块,用于处理不同路径的请求。

常见的 Server 配置指令:

  • location:用于匹配请求的 URL 路径,可以用于配置静态文件、反向代理等。
location / {try_files $uri $uri/ =404;
}
  • index:定义默认的索引文件。
index index.html index.htm;
  • try_files:尝试访问多个文件或路径。
try_files $uri $uri/ /index.php?$query_string;
  • proxy_pass:设置反向代理,将请求转发到后端服务器。
location /api/ {proxy_pass http://backend_server;
}
  • rewrite:重写请求的 URL 地址。
rewrite ^/old-url$ /new-url permanent;
  • error_page:自定义错误页面。
error_page 404 /404.html;

2-5、Location 配置 (Location Block)

Location 块用于处理特定路径的请求,通常用来进行重定向、反向代理、静态资源路径等配置。它可以嵌套在 server 块内。

常见的 Location 配置指令:

  • 精准匹配= 表示精准匹配路径。
location = /favicon.ico {log_not_found off;access_log off;
}
  • 前缀匹配:不带任何符号,表示匹配路径前缀。
location /images/ {root /var/www;
}
  • 正则匹配:用 ~ 表示启用正则表达式匹配。
location ~ \.php$ {fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;
}
  • 通配符匹配:用 * 表示匹配所有路径。
location / {try_files $uri $uri/ =404;
}
  • 内部重定向:用 internal 标识,表示只能从 Nginx 内部访问。
location /images/ {internal;
}

2-6、配置反向代理

反向代理是将客户端请求转发到后端服务器。常用于负载均衡、API 网关等场景。

反向代理配置示例:

server {listen 80;server_name example.com;location / {proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
  • proxy_pass:指定后端服务器的地址。
  • proxy_set_header:传递请求头信息,例如传递客户端 IP 地址等。

2-7、配置负载均衡

Nginx 支持多种负载均衡策略,如轮询、最少连接、IP hash 等。

负载均衡配置示例:

http {upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}}
}
  • upstream:定义一组后端服务器。
  • proxy_pass:将请求转发到 upstream 定义的服务器集群。

Nginx 配置的基本结构由全局配置、HTTP 配置、Server 配置和 Location 配置组成。通过灵活的配置文件语法,Nginx 可以实现反向代理、负载均衡、静态资源服务、URL 重写等多种功能。掌握 Nginx 配置的基本概念和常用指令,能够帮助开发者更好地部署和优化 Web 应用。

3. Nginx 作为 Web 服务器

Nginx(Engine-X)是一个高性能的 Web 服务器、反向代理服务器和负载均衡器。作为 Web 服务器,它的主要作用是处理和响应客户端的 HTTP 请求,提供静态文件处理动态请求,或者将请求转发给应用服务器

Nginx 因其高并发、低内存消耗、灵活的配置而广泛用于 Web 服务和反向代理。与传统的 Apache 服务器相比,Nginx 更适用于高并发和高流量的场景

3-1、Nginx Web 服务器基本概念

Web 服务器的作用

Web 服务器主要负责以下任务:

  • 接收请求:监听客户端(如浏览器)发起的请求(通常是 HTTP 请求)。
  • 提供响应:根据请求提供静态资源(如 HTML、CSS、图片等)或者将请求转发给动态处理程序(如 PHP、Python)。
  • 处理请求:根据请求的 URL 或者路径查找对应的文件,如果找到了文件,则将其发送给客户端;如果找不到文件,则返回错误页面。
Nginx 的工作方式

Nginx 的核心特点是使用 事件驱动模型,不同于传统的 Apache 服务器采用的多进程/线程模型。Nginx 使用少量的工作进程和异步非阻塞 I/O 处理请求,这使得它能高效地处理大量并发连接。

3-2、配置 Nginx 作为 Web 服务器

Nginx 中配置 Web 服务的核心步骤:

配置虚拟主机

虚拟主机(Virtual Host)是指在同一个物理服务器上,针对不同的域名或 IP 地址配置不同的 Web 服务。Nginx 使用 server 块来配置虚拟主机。

例如,配置一个基本的虚拟主机来服务 example.com 的 HTTP 请求:

server {listen 80;  # 监听 80 端口server_name example.com;  # 配置域名root /var/www/html;  # 网站根目录index index.html index.htm;  # 默认首页文件# 处理请求location / {try_files $uri $uri/ =404;  # 如果请求的文件不存在,返回 404 错误}
}

Nginx 会监听 example.com 域名的请求,并从 /var/www/html 目录提供静态文件。

配置静态文件服务

Nginx 非常适合提供静态文件服务(如 HTML、CSS、图片、视频等)。可以通过 location 块配置不同路径的静态文件访问规则:

server {listen 80;server_name example.com;root /var/www/html;index index.html;# 配置静态文件路径location /images/ {root /var/www;}location /css/ {root /var/www;}
}
配置动态请求(例如 PHP)

Nginx 本身不直接处理 PHP、Python 等动态请求,但是它可以通过配置反向代理将请求转发给应用服务器(如 PHP-FPM)。

server {listen 80;server_name example.com;root /var/www/html;index index.php index.html;# 将 PHP 请求转发给 PHP-FPM 处理location ~ \.php$ {fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}

这里,Nginx 会将 .php 文件的请求转发给 PHP-FPM 进程处理。fastcgi_pass 指定了 PHP-FPM 的地址,fastcgi_param 用来传递请求的文件路径。

配置访问日志和错误日志

Nginx 会记录每个请求的日志,默认会生成访问日志和错误日志。可以通过 access_logerror_log 指令来指定日志文件路径。

server {listen 80;server_name example.com;root /var/www/html;index index.html;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;location / {try_files $uri $uri/ =404;}
}
  • access_log:记录客户端请求的信息。
  • error_log:记录服务器错误信息。
配置文件的热重载

Nginx 支持配置文件的热重载,可以在不停止服务的情况下应用新的配置。执行如下命令来重新加载配置:

sudo nginx -s reload

3-3、Nginx 配置优化

启用 Gzip 压缩

通过启用 Gzip,可以减少传输的数据量,提高加载速度。可以通过在 http 块中加入以下配置启用

http {gzip on;gzip_types text/plain text/css application/javascript application/json;gzip_min_length 1000;
}
  • gzip on;:启用 Gzip 压缩。
  • gzip_types:设置需要压缩的文件类型。
  • gzip_min_length:设置启用压缩的最小文件大小。
配置缓存

为提高性能,可以配置静态文件缓存。通过 expires 或者 cache-control 可以控制文件缓存的过期时间。

location /images/ {root /var/www;expires 30d;  # 缓存 30 天add_header Cache-Control public;
}

这里配置了 /images/ 路径下的图片文件缓存 30 天。

配置负载均衡

Nginx 作为负载均衡器,可以分担请求到多个后端服务器。

常见的负载均衡策略有:轮询、最少连接、IP 哈希等。

轮询(Round Robin)

轮询是一种最简单的负载均衡算法,它会将请求按顺序依次分配给每一台后端服务器,直到所有服务器都分配一次请求后,再从头开始分配。这种方法适用于后端服务器性能相当且请求负载比较均匀的情况。

最少连接(Least Connections)

最少连接算法将请求分配给当前活动连接数最少的后端服务器。也就是说,每当一个请求到来时,负载均衡器会选择那些当前正在处理的连接数最少的服务器来处理请求。

IP 哈希(IP Hash)

IP 哈希算法根据客户端的 IP 地址计算出一个哈希值,然后根据哈希值将请求分配给固定的后端服务器。也就是说,相同 IP 地址的客户端请求始终会被分配给同一台服务器,从而实现“会话粘性”(session persistence)。

总结:
  • 轮询适用于负载相对均衡的情况。
  • 最少连接适用于负载差异较大的场景,能够更智能地分配请求。
  • IP 哈希适用于需要会话粘性的应用,确保同一客户端的请求始终由同一台服务器处理。
配置 SSL/TLS 加密

为了保障 Web 安全,可以通过 SSL/TLS 对网站进行加密。Nginx 提供了对 HTTPS 的支持,配置方式如下:

server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;root /var/www/html;index index.html;
}

在此配置中,Nginx 会监听 443 端口,并启用 SSL 加密。需要提供 SSL 证书文件和密钥文件。

3-4、Nginx 作为 Web 服务器的优势

  • 高性能:Nginx 可处理大量并发连接,适用于高流量网站。
  • 低资源消耗:Nginx 采用事件驱动模型,使用少量的内存和 CPU 资源。
  • 反向代理与负载均衡:Nginx 提供反向代理和负载均衡功能,可以用于分担负载和提高可用性。
  • 易于配置与扩展:Nginx 的配置文件灵活,易于根据需求进行定制,支持多种模块扩展。
  • 支持 HTTPS:通过 SSL/TLS 配置,Nginx 能够提供安全的加密通信。

备注:什么是事件驱动?

4. Nginx 反向代理

反向代理 是一种服务器配置,客户端请求首先到达代理服务器,然后由代理服务器将请求转发给实际处理请求的内部服务器客户端无法直接与这些内部服务器通信。在 Nginx 中,反向代理的主要功能是转发请求并返回后端服务器的响应,Nginx 在其中充当“中介”角色

4-1、反向代理的优势

  • 负载均衡:Nginx 可以把流量分发到多个后端服务器上,以实现负载均衡,提升性能和可扩展性。
  • 安全性:反向代理可以隐藏内部服务器的 IP 地址和架构,减少攻击面,增加系统的安全性。
  • SSL 终结:Nginx 可以处理所有的 SSL 加密/解密工作,后端服务器只需要处理 HTTP 请求,减轻负担。
  • 缓存功能:Nginx 能缓存后端服务器的响应,减少数据库查询次数和处理延迟。
  • 带宽控制和流量控制:Nginx 作为反向代理可以对请求进行限流,防止恶意请求。

4-2、反向代理配置

基本的反向代理配置

基本的反向代理配置会将所有请求转发到后端服务器(如 Apache、Node.js 或其他 Web 服务器):

server {listen 80;server_name example.com;location / {proxy_pass http://backend_server;  # 将请求转发到后端服务器proxy_set_header Host $host;       # 保留原始请求的主机头proxy_set_header X-Real-IP $remote_addr;  # 保留客户端真实 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 保留代理链中的所有 IP}
}
  • proxy_pass:指定请求要转发的目标服务器,http://backend_server 可以是一个域名或 IP 地址。
  • proxy_set_header:这些配置确保将客户端的原始请求头(如主机、IP 地址等)转发到后端服务器,这对于一些后端日志分析和安全性很有帮助。
配置负载均衡

Nginx 可以通过负载均衡将请求分发到多个后端服务器,以提高可用性和扩展性:

upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}server {listen 80;server_name example.com;location / {proxy_pass http://backend;  # 请求会被均匀分发到 upstream 中的多个服务器proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
  • upstream:指定多个后端服务器地址,Nginx 会按顺序将请求分发到这些服务器。
  • 默认的负载均衡策略是 轮询(Round Robin),即依次将请求发往下一个服务器。也可以配置其他负载均衡策略。
配置负载均衡策略

Nginx 提供多种负载均衡策略:

  • 轮询(默认):按照顺序依次转发请求。
  • 最少连接:将请求转发给当前连接数最少的服务器。
  • IP 哈希:根据客户端的 IP 地址的哈希值决定请求发往哪个服务器。

最少链接

upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}

使用 IP 哈希 策略

upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
配置 SSL 终结

Nginx 可以处理客户端和服务器之间的 SSL/TLS 加密/解密操作,减轻后端服务器的负担:

server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;location / {proxy_pass http://backend;  # 转发到后端 HTTP 服务器proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
  • ssl_certificatessl_certificate_key 用于配置 SSL 证书。
  • 该配置会处理 HTTPS 请求,解密后再通过 HTTP 发送到后端服务器。
配置缓存

Nginx 作为反向代理时,还可以缓存从后端服务器返回的响应。这样可以减少后端服务器的负担,提高性能,尤其是在大量的相同请求场景下。

server {listen 80;server_name example.com;location / {proxy_cache my_cache;  # 启用缓存proxy_cache_valid 200 1h;  # 缓存 200 响应 1 小时proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
  • proxy_cache:指定缓存区域。
  • proxy_cache_valid:设置缓存的有效期。

4-3、反向代理的常见用途

负载均衡

当网站流量较大时,可以通过反向代理将流量分配给多个后端服务器。这样不仅能提高系统的可用性,还能实现流量的平滑分配。

安全性

通过反向代理可以隐藏后端服务器的真实 IP 地址,保护它们不受外部攻击。另外,反向代理服务器也能执行访问控制,限制不合法的请求。

SSL/TLS 终结

Nginx 可以处理所有的 SSL 终结工作,即加密和解密操作。后端服务器只需要处理 HTTP 请求,不需要处理 SSL,减轻后端的负担。

缓存和加速

反向代理服务器可以缓存从后端返回的静态内容,减少后端的负载并加速页面加载。

4-4、Nginx 反向代理配置总结

  • proxy_pass:用来指定请求转发的目标服务器
  • upstream:用来定义一组后端服务器,支持负载均衡。
  • proxy_set_header:转发请求头信息。
  • proxy_cache:开启缓存机制。
  • proxy_cache_valid:设置缓存的有效期。

5. Nginx 负载均衡

Nginx 作为反向代理服务器,广泛用于实现 负载均衡。负载均衡指的是将流量均匀分配到多个后端服务器上,确保系统的高可用性、可靠性、性能和可扩展性。

Nginx 提供了多种负载均衡策略,可以根据不同需求进行配置。以下是 Nginx 负载均衡的基本概念、配置方法和策略。

5-1、负载均衡的基本概念

负载均衡的目标是确保多个服务器之间的请求均衡分配,从而提高处理能力并优化响应时间。它可以解决以下问题:

  • 性能优化:分散请求压力,提升整体性能。
  • 高可用性:避免单一服务器故障,减少系统宕机风险。
  • 可扩展性:支持随时添加新的服务器来应对流量增长。

5-2、Nginx 的负载均衡配置

基本的负载均衡配置

Nginx 的负载均衡配置通过 upstream 模块来实现。在 upstream 模块中,我们可以定义一组后端服务器,Nginx 会根据负载均衡策略将请求转发到这些服务器。

基本配置如下:

http {upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;  # 请求转发到 upstream 定义的后端服务器}}
}
  • upstream:定义一个名为 backend 的后端服务器池,包含三个服务器。
  • proxy_pass:将客户端请求转发到 backend 服务器池。

在此配置中,Nginx 会使用默认的 轮询 策略将请求依次转发给后端服务器。

负载均衡策略

Nginx 提供了多种负载均衡策略,常用的包括:

  1. 轮询(默认):按顺序依次将请求分发到后端服务器。
  2. 最少连接(least_conn):将请求分发给当前连接数最少的后端服务器。
  3. IP 哈希(ip_hash):根据客户端的 IP 地址的哈希值来决定请求发往哪个服务器。
后端服务器的权重

你可以为不同的后端服务器配置权重权重越大,分配的请求数量越多。默认情况下,每个服务器的权重为 1。

upstream backend {server backend1.example.com weight=3;  # 权重为3,分配更多请求server backend2.example.com weight=1;  # 权重为1,分配较少请求
}
健康检查与故障转移

Nginx 本身不支持主动健康检查,但它支持 被动健康检查

当某个服务器不可用时,Nginx 会自动跳过该服务器,继续将请求转发到其他健康的服务器。

可以通过设置 max_failsfail_timeout控制失败次数超时,进行被动故障转移:

upstream backend {server backend1.example.com max_fails=3 fail_timeout=30s;server backend2.example.com;server backend3.example.com;
}
加权负载均衡与健康检查(Nginx Plus)

对于企业版 Nginx Plus,提供了更强大的负载均衡和健康检查功能。它支持主动健康检查、加权负载均衡、会话保持等高级特性。

upstream backend {zone backend 64k;server backend1.example.com weight=3;server backend2.example.com;server backend3.example.com;health_check;
}
  • health_check:启用主动健康检查,Nginx Plus 会定期检查后端服务器的健康状况,并自动将请求路由到健康的服务器

5-3、负载均衡示例

基本轮询负载均衡

http {upstream backend {server backend1.example.com;server backend2.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;  # 请求将被均匀地分发到 backend1 和 backend2}}
}

最少连接负载均衡

http {upstream backend {least_conn;  # 使用最少连接策略server backend1.example.com;server backend2.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}}
}

IP 哈希负载均衡

http {upstream backend {ip_hash;  # 使用 IP 哈希策略server backend1.example.com;server backend2.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}}
}

处理服务器故障

http {upstream backend {server backend1.example.com max_fails=3 fail_timeout=30s;server backend2.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}}
}

5-4、总结

  • Nginx 的负载均衡 使得多台后端服务器能够共享请求负载,提高系统的可用性和扩展性
  • 通过 upstream 模块,可以定义多个后端服务器,使用不同的负载均衡策略(如轮询、最少连接、IP 哈希等)。
  • 通过 权重健康检查故障转移,可以提高系统的容错能力和稳定性。

6. Nginx 安全与性能优化

Nginx 是一个高性能高可靠性的 Web 服务器和反向代理服务器,广泛用于提供高可用性的网站服务。为了确保 Nginx 的安全性和性能,合理的配置和优化非常重要。下面我们将详细介绍如何在 Nginx 上进行 安全优化性能优化

6-1、Nginx 安全优化

关闭不必要的功能

Nginx 提供了一些不常用或可能存在安全隐患的功能,关闭这些功能可以提高系统的安全性。

  • 禁用 Nginx 的版本信息
http {server_tokens off;  # 禁用版本信息
}
  • 防止 Nginx 服务器被扫描
http {server_tokens off;   # 禁用版本信息error_page 403 404 500 502 503 504 /50x.html;  # 自定义错误页面,避免泄露详细信息log_not_found off;   # 禁用未找到文件的日志记录,防止攻击者扫描
}
  • 限制 HTTP 请求头
http {client_max_body_size 10M;     # 限制客户端请求的最大体积client_header_buffer_size 1k; # 请求头的最大缓冲区大小large_client_header_buffers 4 16k; # 请求头缓冲区大小
}
  • 防止跨站请求伪造 (CSRF) CSRF(Cross-Site Request Forgery,跨站请求伪造)

CSRF的防御方法:CSRF Token(令牌);使用 SameSite Cookie 属性;验证 HTTP Referer 或 Origin 头;确保敏感操作使用 HTTP 方法限制;多因素认证(MFA)。

http {add_header X-Content-Type-Options nosniff;add_header X-Frame-Options SAMEORIGIN; # 防止页面被嵌入 iframeadd_header X-XSS-Protection "1; mode=block";  # 启用 XSS 保护
}
  • 设置 HTTP 头防止点击劫持
http {add_header X-Frame-Options SAMEORIGIN;
}
  • 使用 SSL/TLS 加密通信
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;ssl_protocols TLSv1.2 TLSv1.3;     # 强制使用较新版本的 TLSssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';  # 强加安全加密套件
}
  • 防止 DoS 攻击(DDoS 防护)
http {limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;  # 限制每秒最多 10 个请求limit_req zone=req_limit_per_ip burst=20;  # 允许突发流量最多 20 次
}

6-2、Nginx 性能优化

调整**工作进程和线程配置**

Nginx 的性能主要受工作进程(worker processes)工作线程(worker connections)的影响。

合理配置这些参数可以大大提高 Nginx 的性能。

配置工作进程数

worker_processes 指定 Nginx 使用的工作进程数。一般情况下,设置为服务器的 CPU 核心数可以获得较好的性能。

worker_connections 1024;  # 每个工作进程最大连接数

启用缓存

Nginx 支持多种缓存机制,包括内容缓存、代理缓存等,能够提高响应速度和减少服务器负载。

静态文件缓存

静态文件如图片、CSS、JS 文件可以缓存到浏览器,减少请求响应时间。

http {server {location /images/ {expires 30d;  # 设置图片缓存 30 天}location /css/ {expires 7d;   # 设置 CSS 缓存 7 天}}
}
代理缓存

Nginx 可以缓存反向代理服务器返回的响应减少向后端服务器的请求,提高性能。

http {proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_zone:10m max_size=1g inactive=60m use_temp_path=off;server {location / {proxy_cache cache_zone;  # 启用缓存proxy_cache_valid 200 1h;  # 设置缓存有效时间}}
}

6-3、启用 Gzip 压缩

启用 Gzip 可以减小传输数据的大小提高页面加载速度

http {gzip on;gzip_comp_level 5;  # 压缩级别,取值 1-9,1 最快,9 最慢,压缩比最大gzip_types text/plain text/css application/javascript text/xml application/xml application/xml+rss text/javascript;
}

6-4、配置适当的客户端请求大小

通过调整 client_max_body_size 来控制客户端可以上传的最大文件大小。如果应用涉及到大文件上传,可以适当增加此值。

http {client_max_body_size 100M;  # 最大请求体为 100MB
}

6-5、使用异步 I/O

Nginx 是基于异步 I/O 模型的,可以同时处理成千上万的连接。

确保系统的文件描述符足够高,以支持大量并发连接。

worker_rlimit_nofile 10240;  # 增加文件描述符数目

6-6、调整 TCP 配置

优化 Nginx 与客户端之间的 TCP 连接,提高处理性能。

http {tcp_nopush on;  # 减少发送小的数据包tcp_nodelay on; # 发送小的数据包时关闭 Nagle 算法sendfile on;    # 启用高效的文件传输tcp_keepalive_time 600;  # 设置 TCP 连接的保持时间
}

6-7、总结

安全优化要点

  1. 禁用 Nginx 版本信息;
  2. 限制请求头大小;
  3. 启用 HTTP 安全头防护;
  4. 配置 SSL/TLS 加密通信;
  5. 限制并发请求速率,防止 DDoS 攻击。

性能优化要点

  1. 合理配置工作进程和连接数;
  2. 启用缓存(静态文件缓存、代理缓存等);
  3. 启用 Gzip 压缩以减小传输数据;
  4. 调整客户端请求大小限制;
  5. 使用异步 I/O 和调整 TCP 配置。

通过合理的 安全性能优化,可以提高 Nginx 的稳定性、安全性和响应速度,从而提升网站的整体用户体验。

7. Nginx 与 PHP 结合

Nginx 是一个高效的 Web 服务器,而 PHP 是一种广泛使用的动态脚本语言。Nginx 本身并不支持直接处理 PHP 文件,它依赖于外部的处理程序来执行 PHP 代码。最常见的方式是通过 FastCGI 与 PHP 结合。在这里,我们将介绍如何将 NginxPHP 结合使用,设置 PHP-FPM(FastCGI Process Manager)作为处理 PHP 请求的后端。

7-1、Nginx 与 PHP 的结合原理

Nginx 是一个轻量级的 Web 服务器,主要用于处理静态文件反向代理负载均衡等任务。对于动态内容(如 PHP),Nginx 会将请求转发给外部程序(如 PHP-FPM)进行处理PHP-FPM 会解析 PHP 脚本并将输出返回给 Nginx最后由 Nginx 发送给客户端

PHP-FPM(FastCGI Process Manager)是一个 PHP 的 FastCGI 进程管理器,可以有效地管理多个 PHP 进程,提升性能

7-2、配置 Nginx 与 PHP 的结合

安装 PHP 和 PHP-FPM

首先,需要在服务器上安装 PHP 和 PHP-FPM。如果你使用的是 Linux 系统,可以通过以下命令进行安装。

安装 PHP 和 PHP-FPM(以 Ubuntu 为例)

sudo apt update
sudo apt install php php-fpm php-mysql

其他 PHP 扩展,通过 apt 安装。例如,安装 php-gdphp-mbstring 等扩展:

sudo apt install php-gd php-mbstring php-xml php-cli

配置 PHP-FPM

安装完成后,配置 PHP-FPM。编辑 php-fpm 配置文件来确保 PHP-FPM 监听正确的地址。

默认情况下,PHP-FPM 使用 Unix Socket 或 TCP 协议监听请求。

编辑 PHP-FPM 配置文件

/etc/php/7.x/fpm/pool.d/www.conf 文件中(7.x 是 PHP 的版本号),找到 listen 配置项。你可以选择使用 Unix Socket 或 TCP。

  • 使用 Unix Socket(推荐)
listen = /run/php/php7.x-fpm.sock
  • 使用 TCP 协议(不推荐)
listen = 127.0.0.1:9000

在选择使用 Unix Socket 时,确保 Nginx 有权限访问该 Socket 文件。

7-3、配置 Nginx

接下来,需要在 Nginx 的配置文件中设置 FastCGI 代理,将 PHP 请求转发给 PHP-FPM 进行处理。

编辑 Nginx 配置文件

假设你的网站根目录是 /var/www/html,可以按照以下步骤配置 Nginx:

  1. 打开 Nginx 的配置文件,通常位于 /etc/nginx/sites-available/default/etc/nginx/nginx.conf
  2. 配置 server 块以处理 PHP 请求。
server {listen 80;server_name example.com;root /var/www/html;index index.php index.html index.htm;location / {try_files $uri $uri/ =404;}# 配置 PHP 请求处理location ~ \.php$ {include snippets/fastcgi-php.conf;  # 包含 fastcgi 配置fastcgi_pass unix:/run/php/php7.x-fpm.sock;  # PHP-FPM 使用的 Unix Socketfastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  # 传递 PHP 脚本的路径include fastcgi_params;  # 包含默认的 FastCGI 参数}# 错误页面配置error_page 404 /404.html;location = /404.html {root /var/www/html;}
}
关键配置项说明:
  • root /var/www/html;:指定网站根目录。
  • index index.php index.html index.htm;:设置默认的索引文件,优先加载 index.php
  • location ~ \.php$:所有以 .php 结尾的请求都会经过这个配置处理。
  • fastcgi_pass unix:/run/php/php7.x-fpm.sock;:指定 PHP-FPM 的监听地址(这里是 Unix Socket)。
  • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;:设置 PHP 脚本文件的路径。
  • include fastcgi_params;:包含一些默认的 FastCGI 参数(如请求方法、客户端 IP 等)。

7-4、重启 Nginx 和 PHP-FPM

配置完成后,需要重启 Nginx 和 PHP-FPM 以使配置生效。

sudo systemctl restart nginx
sudo systemctl restart php7.x-fpm

7-5、测试 PHP 是否正常工作

为了验证配置是否正确,可以创建一个简单的 PHP 文件进行测试。

创建 info.php 文件

echo "<?php phpinfo(); ?>" > /var/www/html/info.php

7-6、安全配置

禁用访问 **info.php** 由于 info.php 页面包含了服务器的敏感信息,建议在生产环境中禁用该文件的访问

location ~ ^/info.php {deny all;
}

7-7、总结

  1. 安装 PHP 和 PHP-FPM:首先需要在服务器上安装 PHP 和 PHP-FPM。
  2. 配置 PHP-FPM:确保 PHP-FPM 配置正确,特别是监听方式(Unix Socket 或 TCP)。
  3. 配置 Nginx:通过配置 fastcgi_pass 来将 PHP 请求转发给 PHP-FPM 进行处理。
  4. 重启服务:完成配置后,重启 Nginx 和 PHP-FPM 使配置生效。
  5. 测试 PHP 页面:通过创建 info.php 测试 PHP 是否能够正确工作。

8. Nginx 日志管理

Nginx 日志对于监控服务器状态、排查问题、分析访问流量等方面至关重要。Nginx 提供了详细的访问日志和错误日志,可以帮助我们跟踪服务器的工作状态和定位问题。以下是 Nginx 日志管理的详细内容。

8-1、Nginx 日志的基本概念

Nginx 有两种主要的日志类型:

  1. 访问日志(Access Logs):记录客户端请求的信息。
  2. 错误日志(Error Logs):记录 Nginx 在处理请求过程中遇到的错误信息。

访问日志

访问日志记录了所有进入 Nginx 的请求包括客户端的 IP 地址、请求的时间、请求的 URL、返回状态码响应时间等信息。它对于了解网站的访问情况非常有用。

默认情况下,访问日志记录格式类似于:

192.168.1.1 - - [19/Jan/2025:10:01:23 +0000] "GET /index.html HTTP/1.1" 200 1024 "http://example.com" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"

错误日志

错误日志记录了 Nginx 在处理请求过程中出现的各种错误,包括配置错误程序错误等。

根据日志的级别,错误日志的详细程度不同。

错误日志记录的格式通常为:

2025/01/19 10:02:25 [error] 12345#0: *1 open() "/var/www/html/index.html" failed (2: No such file or directory), client: 192.168.1.1, server: example.com, request: "GET /index.html HTTP/1.1", host: "example.com"

8-2、配置 Nginx 日志

Nginx 日志的配置通常在主配置文件 nginx.conf 中进行。Nginx 的日志配置项包括日志格式和日志文件的位置。

配置访问日志

Nginx 允许自定义访问日志的格式。

可以使用 log_format 指令来定义日志格式。

默认情况下,Nginx 使用标准的日志格式:

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

上面的格式包括了以下信息:

  • $remote_addr:客户端的 IP 地址。
  • $remote_user:客户端的用户名(如果启用了基本认证)。
  • $time_local:本地时间。
  • $request:请求的详细信息。
  • $status:响应状态码。
  • $body_bytes_sent:响应体的字节数。
  • $http_referer:请求来源页面(即 Referer 头)。
  • $http_user_agent:客户端的 User-Agent 字段。
  • $http_x_forwarded_for:通过代理服务器时,包含的客户端真实 IP 地址。

可以使用以下配置来启用访问日志:

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

配置错误日志

错误日志通过 error_log 指令进行配置。可以指定日志文件的路径以及日志的级别。

常见的错误日志级别有:

  • debug:最详细的日志级别,包含调试信息。
  • info:包含常规信息。
  • notice:记录普通的运行信息。
  • warn:记录警告信息。
  • error:记录错误信息。
  • crit:记录严重错误信息。
  • alert:记录需要立即处理的错误。
  • emerg:记录紧急错误信息,通常是系统崩溃的情况。

例如,配置错误日志文件和级别:

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

日志轮转(Log Rotation)

为了防止日志文件过大需要对 Nginx 的日志进行轮转使用工具 <u>logrotate</u> 来定期备份和清理日志文件。示例:

/var/log/nginx/*.log {dailymissingokrotate 30compressdelaycompressnotifemptycreate 0640 www-data www-data
}
  • daily:日志每天轮转一次。
  • rotate 30:保留最近的 30 个日志文件。
  • compress:压缩旧的日志文件。
  • create 0640 www-data www-data:为新日志文件设置权限和所有者。

条件化日志记录

Nginx 还支持按条件记录日志。例如,如果请求的状态码不是 200,可以记录该请求:

if ($status != 200) {access_log /var/log/nginx/error_access.log;
}

8-3、查看和分析 Nginx 日志

查看日志

使用 tail 命令查看实时访问日志:

tail -f /var/log/nginx/access.log

分析日志

对于大量的日志数据,手动查看可能很困难。这时可以使用一些工具来帮助分析。

  • GoAccess

GoAccess 是一个实时的 Web 日志分析工具,能够直接解析 Nginx 日志,并提供图形化界面。

安装和使用 GoAccess:

sudo apt install goaccess
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED

生成一个 report.html 文件,可以在浏览器中查看分析结果。

  • AWStats

AWStats 是一个强大的 Web 日志分析工具,适用于访问日志的深入分析,支持图形化展示。

Nginx 日志常见问题排查

通过查看错误日志和访问日志,你可以分析一些常见的问题:

  • 404 错误:检查访问日志中是否有请求返回 404 错误,如果有,检查文件路径是否正确,或者请求是否指向了一个不存在的资源。
  • 502 错误:502 错误通常表示后端服务(如 PHP-FPM)不可用,检查错误日志并确保后端服务正常运行。
  • 慢请求:如果某些请求响应慢,在访问日志中查看响应时间,并根据响应时间对服务器进行性能调优。

8-4、总结

Nginx 的日志功能对 Web 服务器的监控、问题排查、性能优化等至关重要。

通过合理配置访问日志和错误日志,结合日志分析工具,可以帮助管理员快速定位并解决问题。

  1. 访问日志:记录客户端的请求信息。
  2. 错误日志:记录服务器处理请求时出现的错误信息。
  3. 日志配置:通过 log_formaterror_log 配置来管理日志的格式和存储路径。
  4. 日志轮转:通过 logrotate 定期备份和清理日志文件。
  5. 日志分析:使用 GoAccess 或 AWStats 等工具分析 Nginx 日志。
  6. 排查问题:通过日志分析可以发现请求问题、性能瓶颈等,进而优化服务器配置。

掌握 Nginx 日志的配置和管理方法,可以大大提升服务器的运维效率,帮助你及时发现并解决潜在的问题。

9. Nginx 高级功能

Nginx 是一个功能强大的 Web 服务器,除了常见的反向代理和负载均衡外,它还提供了很多高级功能,可以帮助管理员在处理高并发、复杂配置和安全性要求时提供更多灵活性和可扩展性。以下是 Nginx 的一些高级功能及其应用场景:

9-1、Nginx 的高级功能概述

  • 负载均衡
  • 缓存机制
  • WebSocket
  • 反向代理与微服务架构
  • SSL/TLS 加密
  • 限制请求和流量控制
  • 访问控制
  • 配置文件热更新
  • 动态模块支持
  • 异步处理与性能优化
  • 集成第三方模块

9-2、负载均衡

  • 轮询(Round Robin):默认的负载均衡算法,Nginx 会按照顺序轮流将请求分配给各个后端服务器。
  • 加权轮询(Weighted Round Robin):在轮询的基础上,为不同的服务器设置不同的权重,权重较大的服务器会接收到更多的请求。
  • 最少连接(Least Connections):将请求转发给连接数最少的服务器,适合负载差异较大的服务器。
  • IP 哈希(IP Hash):根据客户端的 IP 地址来选择后端服务器,保证来自同一 IP 的请求总是转发到同一台后端服务器。

9-3、健康检查

Nginx 可以定期检查后端服务器的健康状态,确保请求只会转发到健康的服务器。

如果某台服务器故障,Nginx 会自动将流量转发到其它正常的服务器。

upstream backend {server backend1.example.com;server backend2.example.com;# 定期检查后端服务器的健康状态check interval=5000 rise=2 fall=3 timeout=1000;
}

9-4、缓存机制

静态内容缓存

Nginx 可以缓存静态内容(如图片、CSS 文件等),减少后端服务器的负载,提高访问速度。

可以通过 proxy_cachefastcgi_cache 实现缓存。

http {proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:10m inactive=60m;server {location / {proxy_cache cache_zone;proxy_cache_valid 200 1h;proxy_pass http://backend;}}
}

动态内容缓存

Nginx 可以缓存通过 FastCGI(如 PHP)、uWSGI 或其他协议传递的动态内容,这有助于减少对数据库的请求,提高性能。

注意:proxy_cachefastcgi_cache的区别

proxy_cachefastcgi_cache 都是 Nginx 中用于缓存内容的机制,旨在提高网站性能,减少后端服务器的负载。不过,它们的使用场景、缓存对象和工作原理有所不同。

  • proxy_cache(反向代理缓存)

用于缓存通过 Nginx 代理的内容,主要针对通过 HTTP 请求访问的内容(例如:从其他服务器或服务获取的页面或资源)。

  • fastcgi_cache(FastCGI 缓存)

专门为 FastCGI 应用程序(例如 PHP-FPM、Python WSGI 等) 配置的缓存机制,用于缓存通过 FastCGI 协议处理的动态请求。

9-4、WebSocket 支持

Nginx 支持 WebSocket 协议,它可以通过反向代理将 WebSocket 请求转发到后端服务器。

WebSocket 是一种全双工协议,通常用于实时通信场景。

server {listen 80;location /ws/ {proxy_pass http://backend;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';}
}

9-5、SSL/TLS 加密

Nginx 支持 SSL/TLS 加密,可以为网站启用 HTTPS。

配置 SSL/TLS 时,主要是设置 SSL 证书、私钥,并配置相关的加密协议。

基本 SSL 配置

server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/example.com.crt;ssl_certificate_key /etc/nginx/ssl/example.com.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:...';location / {proxy_pass http://backend;}
}

强制使用 HTTPS

为了确保所有用户都通过 HTTPS 访问网站,可以通过以下配置进行强制重定向。

server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}

9-6、限制请求和流量控制

Nginx 支持对请求进行速率限制,以防止恶意请求和减少 DDoS 攻击的风险。

可以使用 limit_req 指令来限制请求频率。

限制请求速率

http {limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;server {location / {limit_req zone=req_zone burst=5;}}
}

限制连接数

通过 limit_conn 指令,Nginx 可以限制每个客户端的最大连接数,以避免某些用户占用过多的资源。

http {limit_conn_zone $binary_remote_addr zone=conn_zone:10m;server {location / {limit_conn conn_zone 1;}}
}

9-7、访问控制

Nginx 提供了多种方式来控制对资源的访问,包括基于 IP 地址、用户名等。

  • 基于 IP 地址的访问控制
server {location /admin {allow 192.168.1.0/24;   # 允许来自 192.168.1.x 网段的请求deny all;                # 拒绝其他所有请求}
}
  • 基于 HTTP 基本认证的访问控制

使用 .htpasswd 文件进行 HTTP 基本认证。

server {location /admin {auth_basic "Restricted Access";auth_basic_user_file /etc/nginx/.htpasswd;}
}

9-8、配置文件热更新

Nginx 支持热更新配置文件,无需重启服务器即可使新的配置生效。

使用以下命令可以重新加载配置:

sudo nginx -s reload

9-9、动态模块支持

Nginx 支持动态模块,意味着 Nginx 本身不需要重新编译就可以加载外部模块。这使得 Nginx 的扩展更加灵活。

可以使用 --add-dynamic-module 编译选项来动态加载模块:

./configure --add-dynamic-module=/path/to/module
make
sudo make install

9-10、异步处理与性能优化

Nginx 的核心优势之一就是其基于异步事件驱动模型的架构,可以高效处理大量并发请求。在性能优化方面,Nginx 提供了一些重要的配置选项,如:

使用 **worker_processes****worker_connections** 优化性能

worker_processes auto;
worker_connections 1024;
  • worker_processes定义 Nginx 启动的工作进程数通常可以设置为 <u>auto</u>让 Nginx 自动根据 CPU 核心数进行调整
  • worker_connections:设置每个工作进程的最大连接数,合理调整以提高并发处理能力。

使用缓存和压缩

通过合理配置缓存和启用 gzip 压缩,可以显著提高 Nginx 的响应速度和服务器的吞吐量。

9-11、总结

Nginx 提供了丰富的高级功能,使其成为高性能、高可用性的 Web 服务器。通过灵活的配置,Nginx 可以处理各种负载均衡、缓存、SSL 加密、访问控制等需求,并提供了卓越的性能和安全性。

  • 负载均衡:通过不同的负载均衡算法和健康检查,确保请求分发到健康的服务器。
  • 缓存机制:减少后端负载,提高响应速度。
  • WebSocket 支持:处理实时通信应用。
  • SSL/TLS 加密:确保数据传输的安全性。
  • 流量控制:限制请求频率,防止滥用。
  • 访问控制:通过 IP 地址、认证等方式

10. Nginx 常见问题及排查

Nginx 是一个非常稳定和高效的 Web 服务器,但在使用过程中可能会遇到一些常见问题。了解这些问题的排查方法能够帮助你快速解决服务器故障,提高运维效率。

10-1、Nginx 启动或重启失败

配置文件语法错误

Nginx 在启动或重启时,首先会检查配置文件的语法,如果语法错误,则会导致启动失败。

使用 nginx -t 命令来检测配置文件语法。

sudo nginx -t
  • 提示:如果配置文件没有错误,输出会显示 nginx: configuration file /etc/nginx/nginx.conf test is successful。如果有错误,错误信息会提供出错的位置和原因。

权限问题

Nginx 启动时需要访问特定的文件或目录(如日志文件、证书文件、配置文件等)。如果这些文件或目录的权限设置不正确,也会导致启动失败。

检查 Nginx 进程是否有访问配置文件和目录的权限。

ls -l /etc/nginx/nginx.conf
ls -l /var/log/nginx

确保 Nginx 用户(通常是 www-datanginx)有相应的读取权限。

端口被占用

Nginx 启动时会尝试绑定指定的端口(如 80 或 443)。如果端口被其他程序占用,则会导致启动失败。

使用 netstatss 命令检查端口占用情况。

sudo netstat -tuln | grep :80

如果发现端口已经被占用,可以使用 kill 命令杀死占用端口的进程,或者修改 Nginx 配置文件中的端口。

10-2、Nginx 无法访问网站

防火墙设置

防火墙设置不当可能会导致 Nginx 不能正常访问,尤其是云服务器(如 AWS、阿里云、腾讯云等)的防火墙设置。

  • 使用 ufwfirewalldiptables 命令检查防火墙规则。
  • 确保防火墙允许访问 HTTP(80)和 HTTPS(443)端口。
sudo ufw allow 80,443/tcp

配置错误

Nginx 配置文件中的错误会导致无法访问站点,例如,错误的 server_name 或错误的 proxy_pass

  • 使用 nginx -t 检查配置文件。
  • 检查 server 块中的 server_name 是否正确。
  • 确保 location 配置正确,且后端服务可访问。

后端服务问题

如果 Nginx 配置了反向代理,而后端服务不可用或崩溃,Nginx 也会无法提供服务。

  • 检查后端服务是否运行,使用 pssystemctl 命令查看服务状态。
sudo systemctl status nginx
sudo systemctl status apache2  # 或其他 Web 服务
  • 检查后端服务的端口是否正确,并且 Nginx 配置中的 proxy_pass 设置正确。

10-3、性能问题

Nginx 响应慢

当网站响应较慢时,可能是由于以下原因:

  • Nginx 配置不当(如 worker_processesworker_connections 配置不合适)。
  • 后端服务器性能瓶颈(数据库、应用服务器等)。
  • 资源文件(如图片、JS、CSS)未缓存。

排查方法:

  • 调整 Nginx 的 worker_processesworker_connections 参数。
worker_processes auto;
worker_connections 1024;
  • 检查后端服务的性能瓶颈(CPU、内存、磁盘、网络)。
  • 启用文件缓存、静态资源压缩等优化手段。

内存或 CPU 占用过高

如果 Nginx 进程的 CPU 或内存占用过高,可能是由于配置不当或恶意请求导致的。

排查方法:

  • 使用 tophtop 检查系统资源占用情况。
  • 检查 Nginx 日志文件(如 /var/log/nginx/error.log)中是否有大量的错误信息,可能会指示某些异常请求或攻击。

10-4、日志问题

日志文件过大

随着时间的推移,Nginx 的日志文件可能会变得非常大,占用大量磁盘空间。

排查方法:

  • 定期轮换日志文件,使用 logrotate 工具。
sudo vi /etc/logrotate.d/nginx

配置示例:

/var/log/nginx/*.log {dailymissingokrotate 14compressdelaycompressnotifemptycreate 0640 www-data www-data
}
  • 手动清理旧的日志文件。
sudo rm /var/log/nginx/access.log.*

日志无法记录

如果日志无法记录,可能是日志路径权限设置错误,或日志文件被删除。

排查方法:

  • 检查日志路径和日志文件的权限。
ls -l /var/log/nginx

10-5、SSL/TLS 问题

SSL 证书错误

如果使用 HTTPS 时出现证书错误,可能是证书过期、配置错误或证书链不完整。

排查方法:

  • 检查 SSL 证书是否有效,并且没有过期。
  • 使用 openssl 命令检查证书链是否完整。
openssl s_client -connect example.com:443
  • 检查 Nginx 配置中的 ssl_certificatessl_certificate_key 是否正确指向证书和私钥。

10-6、文件上传问题

上传文件大小限制

Nginx 默认限制上传文件的大小,可能会导致上传失败。

排查方法:

  • 修改 client_max_body_size 配置,增加文件上传大小限制。
server {client_max_body_size 100M;  # 增加文件上传限制
}

10-7、常见错误码及排查

403 Forbidden

  • 原因:权限问题,Nginx 无权访问资源。
  • 排查方法:检查文件和目录权限,确保 Nginx 进程用户有读取权限。

404 Not Found

  • 原因:请求的资源不存在。
  • 排查方法:检查 server 配置中的 rootalias 是否正确。

502 Bad Gateway

  • 原因:Nginx 作为反向代理时,无法与后端服务器通信。
  • 排查方法:检查后端服务是否正常运行,端口配置是否正确。

504 Gateway Timeout

  • 原因:Nginx 与后端服务器通信超时。
  • 排查方法:增加 proxy_read_timeout 或检查后端服务的响应时间。

10-8、总结

排查 Nginx 的问题时,首先要确保配置文件语法正确,检查常见的权限、端口占用、防火墙等问题。对于性能问题,要分析 Nginx 和后端服务的资源消耗,并进行相应的优化。日志管理和 SSL 配置也是常见的故障源,通过合理的日志轮换和证书管理可以避免很多问题。

根据以上排查步骤,可以快速定位并解决 Nginx 常见的问题。

相关文章:

Nginx 开发总结

文章目录 1. Nginx 基础概念1-1、什么是 Nginx1-2、Nginx 的工作原理1-3、Nginx 的核心特点1-4、Nginx 的常见应用场景1-5、Nginx 与 Apache 的区别1-6、 Nginx 配置的基本结构1-7、Nginx 常见指令 2. Nginx 配置基础2-1、Nginx 配置文件结构2-2、全局配置 (Global Block)2-3、…...

目标跟踪之sort算法(3)

这里写目录标题 1 流程1 预处理2 跟踪 2 代码 参考&#xff1a;sort代码 https://github.com/abewley/sort 1 流程 1 预处理 1.1 获取离线检测数据。1.2 实例化跟踪器。2 跟踪 2.1 轨迹处理。根据上一帧的轨迹预测当前帧的轨迹&#xff0c;剔除到当前轨迹中为空的轨迹得到当前…...

C++/stack_queue

目录 1.stack 1.1stack的介绍 1.2stack的使用 练习题&#xff1a; 1.3stack的模拟实现 2.queue的介绍和使用 2.1queue的介绍 2.2queue的使用 2.3queue的模拟实现 3.priority_queue的介绍和使用 3.1priority_queue的介绍 3.2priority_queue的使用 欢迎 1.stack 1.1stack…...

小程序电商运营内容真实性增强策略及开源链动2+1模式AI智能名片S2B2C商城系统源码的应用探索

摘要&#xff1a;随着互联网技术的不断发展&#xff0c;小程序电商已成为现代商业的重要组成部分。然而&#xff0c;如何在竞争激烈的市场中增强小程序内容的真实性&#xff0c;提高用户信任度&#xff0c;成为电商运营者面临的一大挑战。本文首先探讨了通过图片、视频等方式增…...

「Unity3D」在Unity中使用C#控制显示Android的状态栏

Unity打包的Android默认都是全屏&#xff0c;如果想要在真机上显示状态栏&#xff0c;就需要额外设置&#xff0c;有两种方式&#xff1a; 第一种&#xff0c;使用Android的Java代码去控制&#xff0c;然后以插件的方式放到Unity中&#xff0c;被C#调用。第二种&#xff0c;使…...

基于51单片机和ESP8266(01S)、LCD1602、DS1302、独立按键的WiFi时钟

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、延时2、定时器03、串口通信4、DS13025、LCD16026、独立按键 四、主函数总结 系列文章目录 前言 之前做了一个WiFi定时器时钟&#xff0c;用八位数码管进行显示&#xff0c;但是定时器时钟的精度较低&#xff0…...

AI 浪潮席卷中国年,开启科技新春新纪元

在这博主提前祝大家蛇年快乐呀&#xff01;&#xff01;&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其影响力已经渗透到社会生活的方方面面。在中国传统节日 —— 春节期间&#xff0c;AI 技术也展现出了巨大的潜力&#xff0c;为中国年带…...

STM32 LED呼吸灯

接线图&#xff1a; 这里将正极接到PA0引脚上&#xff0c;负极接到GND&#xff0c;这样就高电平点亮LED&#xff0c;低电平熄灭。 占空比越大&#xff0c;LED越亮&#xff0c;占空比越小&#xff0c;LED越暗 PWM初始化配置 输出比较函数介绍&#xff1a; 用这四个函数配置输…...

机器学习day4

自定义数据集 使用pytorch框架实现逻辑回归并保存模型&#xff0c;然后保存模型后再加载模型进行预测 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyplot as pltclass1_points np.array([[2.1, 1.8],[1.9, 2…...

《哈佛家训》

《哈佛家训》是一本以教育为主题的书籍&#xff0c;旨在通过一系列富有哲理的故事和案例&#xff0c;传递积极的人生观、价值观和教育理念。虽然它并非直接由哈佛大学官方出版&#xff0c;但其内容深受读者喜爱&#xff0c;尤其是在家庭教育和个人成长领域。 以下是《哈佛家训…...

为什么redis会开小差?Redis 频繁异常的深度剖析与解决方案

文章目录 导读为什么redis会开小差&#xff1f;1.连接数过多2.bigkey3.慢命令操作4.内存策略不合理5.外部数据双写一致性6.保护机制未开启7. 数据集中过期8. CPU饱和9. 持久化阻塞10. 网络问题结论 导读 提起分布式缓存&#xff0c;想必大多数同学脑海中都会浮出redis这个名字…...

window中80端口被占用问题

1&#xff0c;查看报错信息 可以看到在启动项目的时候&#xff0c;8081端口被占用了&#xff0c;导致项目无法启动。 2&#xff0c;查看被占用端口的pid #语法 netstat -aon|findstr :被占用端口#示例 netstat -aon|findstr :8080 3&#xff0c;杀死进程 #语法 taikkill /pid…...

< OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机

原因&#xff1a; &#xff1c; OS 有关 &#xff1e; 阿里云&#xff1a;轻量应用服务器 的使用 &#xff1a;从新开始 配置 SSH 主机名 DNS Tailscale 更新OS安装包 最主要是 清除阿里云客户端这个性能杀手-CSDN博客 防止 I/O 祸害系统 操作&#xff1a; 查看进程&#x…...

解决报错“The layer xxx has never been called and thus has no defined input shape”

解决报错“The layer xxx has never been called and thus has no defined input shape”(这里写自定义目录标题) 报错显示 最近在跑yolo的代码时遇到这样一个错误&#xff0c;显示“the layer {self.name} has never been called”.这个程序闲置了很久&#xff0c;每次一遇到…...

Microsoft Visual Studio 2022 主题修改(补充)

Microsoft Visual Studio 2022 透明背景修改这方面已经有很多佬介绍过了&#xff0c;今天闲来无事就补充几点细节。 具体的修改可以参考&#xff1a;Microsoft Visual Studio 2022 透明背景修改&#xff08;快捷方法&#xff09;_material studio怎么把背景弄成透明-CSDN博客文…...

PyCharm接入DeepSeek实现AI编程

目录 效果演示 创建API key 在PyCharm中下载CodeGPT插件 配置Continue DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其前身是 DeepSeek-V2.5&#xff0c;经过持续的…...

C++ 包装器与绑定器的应用之回调函数的实现

回调函数的实现 在消息队列和网络库的框架中&#xff0c;当接收到消息&#xff08;报文&#xff09;时&#xff0c;回调用户自定义的函数对象&#xff0c;把消息&#xff08;报文&#xff09;参数传给它&#xff0c;由它决定如何处理。 queue参考文章:C queue(STL queue&…...

一文读懂DeepSeek-R1论文

目录 论文总结 摘要 1. 引言 1.1. 贡献 1.2. 评估结果总结 2. 方法 2.1. 概述 2.2. DeepSeek-R1-Zero&#xff1a;在基础模型上进行强化学习 2.2.1. 强化学习算法 2.2.2. 奖励建模 2.2.3. 训练模板 2.2.4. DeepSeek-R1-Zero 的性能、自我进化过程和顿悟时刻 2.3. …...

文献阅读 250128-Tropical forests are approaching critical temperature thresholds

Tropical forests are approaching critical temperature thresholds 来自 <Tropical forests are approaching critical temperature thresholds | Nature> 热带森林正在接近临界温度阈值 ## Abstract: The critical temperature beyond which photosynthetic machinery…...

【python】python基于机器学习与数据分析的二手手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的二手手机特性关联与…...

构建可靠的时间序列预测模型:数据泄露检测、前瞻性偏差消除与因果关系验证

在时间序列分析领域中&#xff0c;存在多种可能影响分析结果有效性的技术挑战。其中&#xff0c;数据泄露、前瞻性偏差和因果关系违反是最为常见且具有显著影响的问题。 数据泄露&#xff1a;隐蔽的系统性错误 数据泄露是指在预测时理论上无法获取的信息&#xff0c;通过某种…...

Spring Boot - 数据库集成05 - 集成MongoDB

Spring Boot集成MongoDB 文章目录 Spring Boot集成MongoDB一&#xff1a;使用前的准备1&#xff1a;依赖导入 & 配置2&#xff1a;实体类创建 二&#xff1a;核心 - MongoRepository三&#xff1a;核心 - MongoTemplate1&#xff1a;集合操作2&#xff1a;文档操作(重点)3&…...

计算机网络之运输层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 04 传输层 在网上看到其他人做了相关笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 王道考研 计算机网络笔记 第五章&#xff1a;传输层_王道计算机网络传输层_Baret-H的博客-CSDN博…...

DeepSeekMoE:迈向混合专家语言模型的终极专业化

一、结论写在前面 论文提出了MoE语言模型的DeepSeekMoE架构&#xff0c;目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离&#xff0c;DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。从较小的2B参数规模开始&#x…...

知识库管理驱动企业知识流动与工作协同创新模式

内容概要 知识库管理在现代企业中扮演着至关重要的角色&#xff0c;其价值不仅体现在知识的积累&#xff0c;还在于通过优质的信息流动促进协作与创新。有效的知识库能够将分散的信息整合为有序、易于访问的资源&#xff0c;为员工提供实时支持&#xff0c;进而提升整体工作效…...

二叉树-堆(补充)

二叉树-堆 1.二叉树的基本特性2.堆2.1.堆的基本概念2.2.堆的实现2.2.1.基本结构2.2.2.堆的初始化2.2.3.堆的销毁2.2.4.堆的插入2.2.5.取出堆顶的数据2.2.6.堆的删除2.2.7.堆的判空2.2.8.堆的数据个数2.2.9.交换2.2.10.打印堆数据2.2.11.堆的创建2.2.12.堆排序2.2.13.完整代码 3…...

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …...

【方法论】ChatGPT与DeepSeek的联合应用,提升工作效率的新解决方案

标题&#xff1a;ChatGPT与DeepSeek的联合应用&#xff0c;提升工作效率的新解决方案 【表格】ChatGPT与DeepSeek联合应用流程 阶段工具主要任务优势备注初稿生成ChatGPT基于用户输入生成初步内容高效、快速生成内容&#xff0c;适应多种主题适合生成长篇文章、报告、分析等验…...

RoboMaster- RDK X5能量机关实现案例(一)识别

作者&#xff1a;SkyXZ CSDN&#xff1a;https://blog.csdn.net/xiongqi123123 博客园&#xff1a;https://www.cnblogs.com/SkyXZ 在RoboMaster的25赛季&#xff0c;我主要负责了能量机关的视觉方案开发&#xff0c;目前整体算法已经搭建完成&#xff0c;实际方案上我使用的上…...

5分钟带你获取deepseek api并搭建简易问答应用

目录 1、获取api 2、获取base_url和chat_model 3、配置模型参数 方法一&#xff1a;终端中临时将加入 方法二&#xff1a;创建.env文件 4、 配置client 5、利用deepseek大模型实现简易问答 deepseek-v3是截止博文撰写之日&#xff0c;无论是国内还是国际上发布的大模型中…...

Ikigai是什么

Ikigai&#xff08;生き甲斐&#xff09; 是一个日语词语&#xff0c;意思是“生活的意义”或“生命的价值所在”。它是一种关于人生意义的哲学概念&#xff0c;源自日本文化&#xff0c;强调通过找到自己热爱、擅长、社会需要以及能带来经济回报的交集来实现幸福和满足感。 I…...

基于PyQt设计的智能停车管理系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】设计意义【4】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】VSCODE【2】python【3】ptqt【4】HyperLPR31.5 参考文献二、安装Python环境1.1 环境介绍**1.2 Python版本介…...

Flink (十二) :Table API SQL (一) 概览

Apache Flink 有两种关系型 API 来做流批统一处理&#xff1a;Table API 和 SQL。Table API 是用于 Scala 和 Java 语言的查询API&#xff0c;它可以用一种非常直观的方式来组合使用选取、过滤、join 等关系型算子。Flink SQL 是基于 Apache Calcite 来实现的标准 SQL。无论输入…...

MySQL知识点总结(十三)

执行逻辑备份要具备哪些条件&#xff0c;其优缺点在哪。 逻辑备份是温备&#xff0c;创建逻辑备份文件时&#xff0c;MySQL服务器必须处于运行状态&#xff0c;其他应用程序在逻辑备份期间不能修改但可以执行读取操作。逻辑备份会把表结构和数据转换为SQL语句保存。 逻辑备份…...

ACL-2024 | 具身智能空间理解能力几何?EmbSpatial-Bench:视觉语言大模型在具身任务中空间理解水平测试基准

作者&#xff1a;Mengfei Du, Binhao Wu, Zejun Li, Xuanjing Huang, Zhongyu Wei 单位&#xff1a;复旦大学数据科学学院&#xff0c;复旦大学计算机科学学院 论文标题&#xff1a;EmbSpatial-Bench: Benchmarking Spatial Understanding for Embodied Tasks with Large Vis…...

动手学图神经网络(6):利用图神经网络进行点云分类

利用图神经网络进行点云分类 引言 在本教程中,大家将学习使用图神经网络(Graph Neural Networks, GNN)进行点云分类的基本工具。给定一组对象或点集的数据集,将这些对象嵌入到一个特征空间中,使得它们在特定任务下能够分类。将原始点云作为神经网络的输入,让网络学习捕…...

Ollama+DeepSeek本地大模型部署

1、Ollama 官网&#xff1a;https://ollama.com/ Ollama可以干什么&#xff1f; 可以快速在本地部署和管理各种大语言模型&#xff0c;操作命令和dokcer类似。 mac安装ollama&#xff1a; # 安装ollama brew install ollama# 启动ollama服务&#xff08;默认11434端口&#xf…...

docker安装Redis:docker离线安装Redis、docker在线安装Redis、Redis镜像下载、Redis配置、Redis命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull redis:7.4.0 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜像…...

HTML 标题

HTML 标题 引言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;而标题则是网页中不可或缺的元素。标题不仅能够帮助用户快速了解网页内容&#xff0c;还能够对搜索引擎优化&#xff08;SEO&#xff09;产生重要影响。本文将详细介绍HTML标题的用法…...

记录 | MaxKB创建本地AI智能问答系统

目录 前言一、重建MaxKBStep1 复制路径Step2 删除MaxKBStep3 创建数据存储文件夹Step4 重建 二、创建知识库Step1 新建知识库Step2 下载测试所用的txtStep3 上传本地文档Step4 选择模型补充智谱的API Key如何获取 Step5 查看是否成功 三、创建应用Step1 新建应用Step2 配置AI助…...

Linux 非阻塞IO

Linux 非阻塞IO 1. fcntl() 在Linux操作系统中&#xff0c;fcntl() 是一个用于操作文件描述符的系统调用。它提供了多种功能&#xff0c;包括控制文件描述符的属性、管理文件锁定、设置文件的非阻塞模式等。 本文只截取了用于IO模型的 fcntl() 部分内容&#xff0c; fcntl() …...

美国本科申请文书PS写作中的注意事项

在完成了introduction之后&#xff0c;便可进入到main body的写作之中。美国本科申请文书PS的写作不同于学术论文写作&#xff0c;要求你提出论点进行论证之类。PS更多的注重对你自己的经历或者motivation的介绍和描述。而这一描述过程只能通过对你自己的过往的经历的展现才能体…...

Qt文件操作

目录 一、文件操作相关类 1.QFile 2.QFileInfo 3.QTextStream 4.QDataStream 5.QDir 6.QFileSystemWatcher 7.QTemporaryFile 二、文件操作示例 1.文本文件操作 2.目录操作 3.二进制文件操作 一、文件操作相关类 1.QFile QFile类用于文件的创建、读写、复制、删除…...

赚钱的究极认识

1、赚钱的本质是提供了价值或者价值想象 价值&#xff1a; 比如小米手机靠什么&#xff1f;“性价比”&#xff0c;什么饥饿营销&#xff0c;创新&#xff0c;用户参与&#xff0c;生态供应链&#xff0c;品牌这些不能说不重要&#xff0c;但是加在一起都没有“性价比”这3字重…...

【项目】基于Qt开发的音乐播放软件

目录 项目介绍 项目概述 界面开发 界面分析 创建工程 主界面布局设计 窗口主框架设计 界面美化 主窗口设定 添加图片资源 head处理 播放控制区处理 自定义控件 BtForm 推荐页面 自定义CommonPage 自定义ListItemBox 自定义MusicSlider 自定义VolumeTool 音…...

week08_文本匹配任务

1、文本匹配任务概述 狭义&#xff1a; 给定一组文本&#xff0c;判断其是否语义相似 今天天气不错 match 今儿个天不错呀 √ 今天天气不错 match 你的代码有bug 以分值形式给出相似度 今天天气不错 match 今儿个天不错呀 0.9 今天天气不错 match…...

01-01 五元组

[外链图片转存中…(img-8JR8fhPZ-1737855365022)] 01-01 五元组 网络中的五元组&#xff08;5-Tuple&#xff09; 是用于唯一标识一个网络连接或数据流的五个关键参数组合。这五个参数共同定义了数据包的来源、目的地以及传输方式&#xff0c;是网络设备&#xff08;如防火墙…...

5.2 软件需求分析

文章目录 需求分析的意义软件需求的组成需求分析的5个方面需求分析方法 需求分析的意义 需求分析解决软件“做什么”的问题。由于开发人员比较熟悉计算机而不熟悉领域业务&#xff0c;用户比较熟悉领域业务而不熟悉计算机&#xff0c;双方需要通过交流&#xff0c;制定出完整、…...

OpenCV:在图像中添加噪声(瑞利、伽马、脉冲、泊松)

目录 简述 1. 瑞利噪声 2. 伽马噪声 3. 脉冲噪声 4. 泊松噪声 总结 相关阅读 OpenCV&#xff1a;在图像中添加高斯噪声、胡椒噪声-CSDN博客 OpenCV&#xff1a;高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV&#xff1a;图像处理中的低通滤波-CSDN博客 OpenCV&…...

进程池的制作(linux进程间通信,匿名管道... ...)

目录 一、进程间通信的理解 1.为什么进程间要通信 2.如何进行通信 二、匿名管道 1.管道的理解 2.匿名管道的使用 3.管道的五种特性 4.管道的四种通信情况 5.管道缓冲区容量 三、进程池 1.进程池的理解 2.进程池的制作 四、源码 1.ProcessPool.hpp 2.Task.hpp 3…...