Nginx 是一个高性能的 Web 服务器 和 反向代理服务器,广泛应用于处理静态内容、负载均衡、代理请求以及反向代理等场景。它不仅是一个Web服务器,还被广泛用作反向代理、负载均衡器、API 网关等多种用途。Nginx 以其高性能、低资源消耗和可扩展性而著称,尤其适合高并发的环境。
1. 反向代理
Nginx 可以作为 反向代理服务器,将客户端的请求转发到后端的服务器上。通过这种方式,可以隐藏真实的服务器,并提供负载均衡、缓存、SSL/TLS 协议等功能。
2. 负载均衡
Nginx 支持多种负载均衡算法,如:
3. 静态文件服务
Nginx 非常擅长提供静态内容服务(如 HTML、CSS、JS、图片等)。它使用异步事件驱动的架构,能够在高并发场景下提供高效的静态内容服务。
4. 反向代理缓存
Nginx 可以缓存后端服务器的响应,减少后端负载,并提升系统性能。通过配置缓存策略,Nginx 可以在缓存内容的有效期内,直接向客户端返回缓存的内容,而不需要每次都请求后端服务器。
5. SSL/TLS 加密
Nginx 支持 SSL/TLS 加密,提供 HTTPS 安全协议的支持。它可以处理 HTTPS 请求和解密,加快后端服务器的响应速度。
6. 请求限制
Nginx 支持对客户端请求进行限速、限制请求频率等操作,防止过多的请求对服务器造成负担。
7. 访问控制与身份验证
Nginx 可以通过配置 IP 白名单、黑名单、请求头限制等方式进行访问控制。同时,它也可以与外部身份验证系统(如 LDAP、HTTP 基本认证等)结合,控制对资源的访问。
Nginx 的配置文件通常位于 /etc/nginx/nginx.conf
,并且配置文件的语法比较直观,主要由以下几个部分组成:
1. 全局设置
全局设置位于配置文件的顶部,主要用于设置一些全局性参数,比如用户权限、进程数量、工作模式等。
user www-data;
worker_processes 4;
pid /run/nginx.pid;
2. HTTP 块
HTTP 块是最常见的配置块,用于定义 HTTP 服务相关的设置,如日志、代理、负载均衡、缓存等。
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
}
}
server
:一个虚拟主机配置块,代表一个独立的站点或服务。location
:指定 URL 路径匹配的规则,定义特定路径下的行为,如反向代理、文件路径等。3. Server 块
Server 块用于定义单个虚拟主机配置。每个 server
块可以监听不同的端口和地址,并且可以根据请求的域名来选择性地配置不同的规则。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
}
}
4. Location 块
Location 块用于根据请求的 URI 路径,指定请求的具体处理方式,可以定义路径转发、反向代理、静态文件处理等。
location /images/ {
root /var/www/html;
}
location /images/
:表示当请求路径以 /images/
开头时,将会匹配该块并执行相应的操作。5. Upstream 块(负载均衡)
upstream
用于定义一个后端服务器集群的负载均衡规则,可以为某个 server
配置一组可用的后端服务器。
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
listen 指定 Nginx 监听的端口和地址。
listen 80;
server_name 用于指定虚拟主机的域名或 IP 地址,通常与 listen
配合使用。
server_name example.com;
root 指定网站根目录,用于处理静态文件的请求。
root /usr/share/nginx/html;
index 定义默认访问的首页文件,如 index.html
或 index.php
。
index index.html index.htm;
proxy_pass 用于将客户端请求转发到后端服务器,常用于反向代理。
proxy_pass http://backend;
error_page 用于定义错误页面的路径,例如 404 错误页面。
error_page 404 /404.html;
access_log 和 error_log 用于设置访问日志和错误日志的文件路径。
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
工作进程数
根据 CPU 核心数调整 worker_processes
,可以提高并发性能。一般设置为 CPU 核心数的数量。
worker_processes auto;
缓存
Nginx 支持多种缓存机制,如代理缓存、静态文件缓存等。合理配置缓存可以减少对后端服务器的请求,提高性能。
Gzip 压缩
启用 Gzip 压缩,减少响应数据的大小,提升传输效率。
gzip on;
gzip_types text/plain text/css application/javascript;
TCP连接优化
使用 keepalive
可以减少 TCP 连接的建立与关闭,提升性能。
keepalive_timeout 65;
反向代理优化
对反向代理进行优化,减少与后端服务器的交互延迟,如配置代理缓存、调整 proxy_buffers
等。
负载均衡
Nginx 可配置为负载均衡器,将流量分发到多个后端服务器,增强系统的可用性和容错能力。
健康检查
Nginx 结合健康检查工具,可以确保只将请求转发给健康的后端服务器。
Failover(故障转移)
配置镜像服务器或后备服务器,确保在主服务器故障时,流量能够自动切换到备份服务器。
限流和限速
配置请求限流和限速策略,避免单一用户或恶意攻击占用大量资源,导致系统崩溃。
Nginx 是一个轻量级、高性能、可扩展的 Web 服务器和反向代理服务器,适用于高并发、负载均衡、反向代理、API 网关等场景。它的事件驱动架构和高效的资源管理使其在处理大量并发连接时,能够维持低的资源消耗。合理配置 Nginx,可以显著提升 Web 服务的性能、可靠性和安全性。
Nginx 配置文件通常位于 /etc/nginx/nginx.conf
,其中包含多种配置指令,定义了服务器的行为。以下是 Nginx 配置文件的主要结构和常见的配置示例,帮助你理解和配置 Nginx。
Nginx 配置文件分为几个部分:
全局配置位于配置文件的最上面,影响整个 Nginx 进程的行为,如工作进程数、用户权限等。
user nginx; # 设置运行 Nginx 的用户
worker_processes 4; # 设置工作进程数量,通常为 CPU 核心数
pid /var/run/nginx.pid; # 设置 Nginx 的进程 ID 文件路径
# 其他全局配置项
error_log /var/log/nginx/error.log warn; # 设置错误日志的路径和日志级别
events
配置块主要用于设置 Nginx 的事件模型,例如工作连接数等。
events {
worker_connections 1024; # 设置每个 worker 进程的最大连接数
use epoll; # 使用 epoll 模式(适用于 Linux)
}
http
配置块包含了大多数与 HTTP 服务相关的设置,如静态文件处理、反向代理、负载均衡等。
http {
include mime.types; # 加载 MIME 类型文件
default_type application/octet-stream; # 设置默认文件类型
access_log /var/log/nginx/access.log; # 设置访问日志路径
sendfile on; # 启用高效文件传输
tcp_nopush on; # 适用于高性能的传输控制
keepalive_timeout 65; # 设置客户端连接保持时间
gzip on; # 启用 Gzip 压缩
gzip_types text/plain text/css application/javascript; # 设置压缩的文件类型
# 启用反向代理
server {
listen 80; # 监听端口 80
server_name example.com; # 配置虚拟主机名
location / {
root /usr/share/nginx/html; # 设置静态文件路径
index index.html index.htm; # 配置默认主页
}
}
}
server
配置块用于定义虚拟主机的设置,可以根据域名、IP 地址等来匹配请求。
server {
listen 80; # 监听 80 端口
server_name www.example.com; # 设置域名
root /var/www/html; # 配置网站根目录
# 配置站点首页
location / {
index index.html;
}
# 错误页面设置
error_page 404 /404.html;
location = /404.html {
root /var/www/html;
}
# 反向代理设置
location /api/ {
proxy_pass http://backend-server; # 将请求转发到后端服务器
proxy_set_header Host $host; # 设置传递给后端的 Host 头
proxy_set_header X-Real-IP $remote_addr; # 转发客户端 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
location
配置块用于根据请求的 URI 来匹配请求,进行 URL 路径控制、代理等操作。
示例 1:静态文件服务
location /images/ {
root /var/www/html; # 设置静态文件路径
autoindex on; # 启用目录浏览
}
示例 2:反向代理
location /api/ {
proxy_pass http://backend-server; # 转发到后端服务器
proxy_set_header Host $host; # 保持原始 Host 头
proxy_set_header X-Real-IP $remote_addr; # 转发客户端 IP
}
示例 3:设置缓存
location /assets/ {
root /var/www/html;
expires 30d; # 设置缓存时间为 30 天
add_header Cache-Control public;
}
示例 4:错误页面配置
location /404.html {
root /usr/share/nginx/html;
}
在 http
块中,可以使用 upstream
配置来定义后端服务器集群,实现负载均衡。
http {
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers; # 将请求转发到负载均衡后端
}
}
}
启用 HTTPS 需要配置 SSL/TLS 证书。Nginx 可以通过以下方式启用 SSL 支持:
server {
listen 443 ssl; # 启用 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/TLS 协议
ssl_ciphers 'HIGH:!aNULL:!MD5'; # 配置安全的加密套件
location / {
root /var/www/html;
}
}
Nginx 支持配置访问日志和错误日志,可以指定日志文件的路径及格式:
http {
access_log /var/log/nginx/access.log; # 设置访问日志路径
error_log /var/log/nginx/error.log warn; # 设置错误日志路径和级别
}
Nginx 可以通过配置多项参数来优化性能:
worker_processes 4; # 设置工作进程数为 4
worker_connections 1024; # 每个工作进程的最大连接数
keepalive_timeout 65; # 客户端连接保持 65 秒
限制请求速率:防止恶意请求过多。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=5;
IP 白名单与黑名单:
location /admin/ {
allow 192.168.1.0/24; # 允许 IP 地址
deny all; # 拒绝所有其他 IP
}
Nginx 的配置文件结构清晰且灵活,可以实现多种功能,如反向代理、负载均衡、静态文件服务、安全控制等。通过调整不同的配置项,可以优化 Nginx 的性能和可靠性,并根据实际需求进行功能扩展。