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个区域:
- 全局配置:用于全局的 Nginx 配置。
- HTTP 配置:用于配置 HTTP 服务和网络处理规则。
- Server 配置:配置虚拟主机、域名和处理规则。
- 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_log
和 error_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; # 保留客户端真实 IP
proxy_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_certificate 和 ssl_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 提供了多种负载均衡策略,常用的包括:
- 轮询(默认):按顺序依次将请求分发到后端服务器。
- 最少连接(least_conn):将请求分发给当前连接数最少的后端服务器。
- IP 哈希(ip_hash):根据客户端的 IP 地址的哈希值来决定请求发往哪个服务器。
后端服务器的权重
你可以为不同的后端服务器配置权重,权重越大,分配的请求数量越多。默认情况下,每个服务器的权重为 1。
upstream backend {
server backend1.example.com weight=3; # 权重为3,分配更多请求
server backend2.example.com weight=1; # 权重为1,分配较少请求
}
健康检查与故障转移
Nginx 本身不支持主动健康检查,但它支持 被动健康检查。
当某个服务器不可用时,Nginx 会自动跳过该服务器,继续将请求转发到其他健康的服务器。
可以通过设置 max_fails
和 fail_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; # 防止页面被嵌入 iframe
add_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; # 强制使用较新版本的 TLS
ssl_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、总结
安全优化要点
- 禁用 Nginx 版本信息;
- 限制请求头大小;
- 启用 HTTP 安全头防护;
- 配置 SSL/TLS 加密通信;
- 限制并发请求速率,防止 DDoS 攻击。
性能优化要点
- 合理配置工作进程和连接数;
- 启用缓存(静态文件缓存、代理缓存等);
- 启用 Gzip 压缩以减小传输数据;
- 调整客户端请求大小限制;
- 使用异步 I/O 和调整 TCP 配置。
通过合理的 安全 和 性能优化,可以提高 Nginx 的稳定性、安全性和响应速度,从而提升网站的整体用户体验。
7. Nginx 与 PHP 结合
Nginx 是一个高效的 Web 服务器,而 PHP 是一种广泛使用的动态脚本语言。Nginx 本身并不支持直接处理 PHP 文件,它依赖于外部的处理程序来执行 PHP 代码。最常见的方式是通过 FastCGI 与 PHP 结合。在这里,我们将介绍如何将 Nginx 与 PHP 结合使用,设置 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-gd
、php-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:
- 打开 Nginx 的配置文件,通常位于
/etc/nginx/sites-available/default
或/etc/nginx/nginx.conf
。 - 配置
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 Socket
fastcgi_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、总结
- 安装 PHP 和 PHP-FPM:首先需要在服务器上安装 PHP 和 PHP-FPM。
- 配置 PHP-FPM:确保 PHP-FPM 配置正确,特别是监听方式(Unix Socket 或 TCP)。
- 配置 Nginx:通过配置
fastcgi_pass
来将 PHP 请求转发给 PHP-FPM 进行处理。 - 重启服务:完成配置后,重启 Nginx 和 PHP-FPM 使配置生效。
- 测试 PHP 页面:通过创建
info.php
测试 PHP 是否能够正确工作。
8. Nginx 日志管理
Nginx 日志对于监控服务器状态、排查问题、分析访问流量等方面至关重要。Nginx 提供了详细的访问日志和错误日志,可以帮助我们跟踪服务器的工作状态和定位问题。以下是 Nginx 日志管理的详细内容。
8-1、Nginx 日志的基本概念
Nginx 有两种主要的日志类型:
- 访问日志(Access Logs):记录客户端请求的信息。
- 错误日志(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 {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 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 服务器的监控、问题排查、性能优化等至关重要。
通过合理配置访问日志和错误日志,结合日志分析工具,可以帮助管理员快速定位并解决问题。
- 访问日志:记录客户端的请求信息。
- 错误日志:记录服务器处理请求时出现的错误信息。
- 日志配置:通过
log_format
和error_log
配置来管理日志的格式和存储路径。 - 日志轮转:通过
logrotate
定期备份和清理日志文件。 - 日志分析:使用 GoAccess 或 AWStats 等工具分析 Nginx 日志。
- 排查问题:通过日志分析可以发现请求问题、性能瓶颈等,进而优化服务器配置。
掌握 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_cache
和 fastcgi_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_cache
和 fastcgi_cache
的区别
proxy_cache
和 fastcgi_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-data
或 nginx
)有相应的读取权限。
端口被占用
Nginx 启动时会尝试绑定指定的端口(如 80 或 443)。如果端口被其他程序占用,则会导致启动失败。
使用 netstat
或 ss
命令检查端口占用情况。
sudo netstat -tuln | grep :80
如果发现端口已经被占用,可以使用 kill
命令杀死占用端口的进程,或者修改 Nginx 配置文件中的端口。
10-2、Nginx 无法访问网站
防火墙设置
防火墙设置不当可能会导致 Nginx 不能正常访问,尤其是云服务器(如 AWS、阿里云、腾讯云等)的防火墙设置。
- 使用
ufw
、firewalld
或iptables
命令检查防火墙规则。 - 确保防火墙允许访问 HTTP(80)和 HTTPS(443)端口。
sudo ufw allow 80,443/tcp
配置错误
Nginx 配置文件中的错误会导致无法访问站点,例如,错误的 server_name
或错误的 proxy_pass
。
- 使用
nginx -t
检查配置文件。 - 检查
server
块中的server_name
是否正确。 - 确保
location
配置正确,且后端服务可访问。
后端服务问题
如果 Nginx 配置了反向代理,而后端服务不可用或崩溃,Nginx 也会无法提供服务。
- 检查后端服务是否运行,使用
ps
或systemctl
命令查看服务状态。
sudo systemctl status nginx
sudo systemctl status apache2 # 或其他 Web 服务
- 检查后端服务的端口是否正确,并且 Nginx 配置中的
proxy_pass
设置正确。
10-3、性能问题
Nginx 响应慢
当网站响应较慢时,可能是由于以下原因:
- Nginx 配置不当(如
worker_processes
或worker_connections
配置不合适)。 - 后端服务器性能瓶颈(数据库、应用服务器等)。
- 资源文件(如图片、JS、CSS)未缓存。
排查方法:
- 调整 Nginx 的
worker_processes
和worker_connections
参数。
worker_processes auto;
worker_connections 1024;
- 检查后端服务的性能瓶颈(CPU、内存、磁盘、网络)。
- 启用文件缓存、静态资源压缩等优化手段。
内存或 CPU 占用过高
如果 Nginx 进程的 CPU 或内存占用过高,可能是由于配置不当或恶意请求导致的。
排查方法:
- 使用
top
或htop
检查系统资源占用情况。 - 检查 Nginx 日志文件(如
/var/log/nginx/error.log
)中是否有大量的错误信息,可能会指示某些异常请求或攻击。
10-4、日志问题
日志文件过大
随着时间的推移,Nginx 的日志文件可能会变得非常大,占用大量磁盘空间。
排查方法:
- 定期轮换日志文件,使用
logrotate
工具。
sudo vi /etc/logrotate.d/nginx
配置示例:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 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_certificate
和ssl_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
配置中的root
或alias
是否正确。
502 Bad Gateway
- 原因:Nginx 作为反向代理时,无法与后端服务器通信。
- 排查方法:检查后端服务是否正常运行,端口配置是否正确。
504 Gateway Timeout
- 原因:Nginx 与后端服务器通信超时。
- 排查方法:增加
proxy_read_timeout
或检查后端服务的响应时间。
10-8、总结
排查 Nginx 的问题时,首先要确保配置文件语法正确,检查常见的权限、端口占用、防火墙等问题。对于性能问题,要分析 Nginx 和后端服务的资源消耗,并进行相应的优化。日志管理和 SSL 配置也是常见的故障源,通过合理的日志轮换和证书管理可以避免很多问题。
根据以上排查步骤,可以快速定位并解决 Nginx 常见的问题。