一、Nginx功能简介
Nginx是一款开源的高性能HTTP和反向代理服务器,具有轻量级的设计、高并发能力、内存占用低以及配置简单等特点,并且支持热部署。以下是Nginx的主要功能:
- 静态内容服务:Nginx可以作为一个高性能的静态文件服务器,提供静态网页、图片、视频和其他静态内容的快速传输。
- 负载均衡:Nginx支持多种负载均衡算法,如轮询、最小连接数、IP哈希等,可以实现请求的均衡分发,提高后端服务器的处理能力。
反向代理:Nginx能够作为反向代理服务器,将客户端的请求转发给后端的应用服务器,隐藏真实的后端服务器,提升安全性和性能。 - 动态内容服务:Nginx可以与各种后端应用服务器集成,如PHP、Node.js、Python等,实现动态内容的处理和传递。
- SSL/TLS支持:Nginx支持SSL/TLS协议,可以提供安全的HTTPS服务,并支持常见的SSL功能,如密钥、证书的管理和配置。
- URL重写:Nginx提供强大的URL重写功能,可以根据需求对URL进行修改、重定向和映射,实现网站的美化和优化。
- 缓存加速:Nginx可以使用内存、硬盘或者SSD等作为缓存存储空间,能够缓存静态内容和动态内容,并提供缓存的控制和管理。
- Gzip压缩:Nginx支持Gzip压缩算法,可以在传输过程中对内容进行压缩,减少传输的数据量,提升网站的性能。
- 日志记录:Nginx可以将请求的访问日志和错误日志进行记录和保存,方便后续的分析和故障排查。
- 高并发支持:Nginx采用异步非阻塞事件模型,能够同时处理成千上万的并发连接,适用于高并发的场景,如Web网站、API服务等。
二、Nginx 配置文件 nginx.conf 结构
Nginx的配置文件结构清晰,采用嵌套块结构
,每个块由一对大括号{}
包围,并通过缩进来表示层次关系。以下是Nginx配置文件的主要结构详解:
1. 全局块
位置:配置文件开头至events块前。
功能:设置影响整个Nginx服务器的配置指令。
常见指令:
- user:设置运行用户。
- worker_processes:定义工作进程数。
- error_log:设置错误日志路径和级别。
- pid:指定PID文件路径。
2. events块
功能:影响Nginx服务器的网络连接。
常见指令:
- worker_connections:定义每个工作进程的最大连接数。
- use:定义使用的事件处理器类型。
3. http块
功能:包含绝大多数功能和模块配置,如代理、缓存、日志定义。
结构:可包含http全局块、多个server块。
常见指令:
- include:引入其他配置文件。
- default_type:设置默认MIME类型。
- log_format:定义日志格式。
- access_log:设置访问日志路径和格式。
4. server块
功能:定义虚拟主机的行为,如监听端口、服务器名称、文档根目录。
常见指令:
- listen:设置监听端口。
- server_name:设置服务器名称。
- root:设置文档根目录。
5. location块
功能:定义URL路径的行为,如路径匹配、文件类型、反向代理、缓存。
常见指令:
- root:设置请求的根文件系统路径。
- index:设置默认索引文件。
- proxy_pass:设置反向代理目标地址。
location 详细配置:Nginx location 配置:从入门到精通
6. 其他块和指令
- upstream块:定义后端服务器组,用于负载均衡。
- if指令:用于条件判断配置。
配置示例:
# Nginx全局配置
user nginx; # 运行Nginx的用户
worker_processes auto; # 根据CPU核心数自动选择工作进程数
error_log /var/log/nginx/error.log; # 错误日志文件的路径
pid /run/nginx.pid; # PID文件的路径
# 事件处理配置
events {
worker_connections 1024; # 每个工作进程可以处理的最大连接数
# 其他事件相关配置(如use指令等,根据需要配置)
}
# HTTP配置
http {
include /etc/nginx/mime.types; # 引入MIME类型文件
default_type application/octet-stream; # 默认的MIME类型
# 日志配置
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压缩配置
gzip on; # 开启gzip压缩
gzip_min_length 1k; # 最小压缩文件大小
gzip_comp_level 6; # 压缩级别(1-9)
# 虚拟主机配置
server {
listen 80; # 监听80端口
server_name example.com; # 服务器名称
# 访问根目录配置
root /var/www/example.com; # 网站根目录
index index.html index.htm; # 默认索引文件
# 反向代理配置(如果需要)
location /api/ {
proxy_pass http://backend_servers/; # 转发请求到后端服务器组
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地址
}
# 其他location配置(如静态文件服务、URL重写等)
# ...
# 错误页面配置(可选)
error_page 404 /404.html; # 404错误页面
# SSL配置(如果需要HTTPS支持)
# ...
}
# 其他server配置(如多个虚拟主机)
# ...
# 上游服务器配置(如果需要负载均衡)
upstream backend_servers {
server backend1.example.com; # 后端服务器1
server backend2.example.com; # 后端服务器2
# 可以添加更多后端服务器,并配置权重、持久化等参数
}
# 其他HTTP配置(如模块加载、变量定义等)
# ...
}
三、负载均衡配置
Nginx的负载均衡功能允许将传入的请求分发到一组后端服务器上,以优化性能和可用性。以下是负载均衡配置的基本步骤和要点:
1. 定义upstream块
在Nginx的配置文件中,使用upstream指令定义一个后端服务器组。例如:
upstream backend_servers {
server backend1.example.com weight=5;
server backend2.example.com weight=3;
server 192.168.1.1 backup;
}
这里定义了三个后端服务器,并分别设置了权重。权重决定了请求分发到各个服务器的比例。
2. 在server块中使用proxy_pass
在Nginx的server块中,使用proxy_pass指令将请求转发到之前定义的upstream块。例如:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
# 其他配置...
}
}
3. 负载均衡算法
Nginx支持多种负载均衡算法,包括:
- 轮询(round-robin):默认算法,按照服务器在配置文件中出现的顺序依次将请求转发到每台服务器。
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
- 权重(weight):根据配置的权重值,将请求更多地转发到权重较高的服务器。
upstream backend_servers {
server backend1.example.com weight=2;
server backend2.example.com; # 默认权重为1
server backend3.example.com weight=3;
}
- 最少连接(least_conn):将请求转发到当前连接数最少的服务器。
upstream backend_servers {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
- IP哈希(ip_hash):根据客户端IP的哈希值将请求转发到固定的服务器,确保来自同一IP的请求始终被转发到同一台服务器。
upstream backend_servers {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
可以在upstream块中使用相应的指令来指定负载均衡算法。
三、反向代理配置
Nginx 反向代理是一种将客户端的请求转发给后端服务器的方式,通过配置Nginx,可以实现负载均衡、缓存、HTTPS支持等功能,从而提高网站的性能和安全性。
- 基本配置结构
一个Nginx配置文件主要由多个server块组成,每个server块定义一个虚拟服务器。
每个server块内可以有多个location块,用于匹配不同的URL路径,并设置相应的代理规则。 - 基本配置指令
- listen: 指定Nginx监听的端口号,默认为80端口。
- server_name: 设置Nginx服务的域名或IP地址。
- location: 用于匹配特定的请求路径,并设置相应的代理规则。
- proxy_pass: 设置代理规则,将匹配到的请求转发到指定的后端服务器地址和端口。
- 反向代理配置示例
以下是一个简单的Nginx反向代理配置示例:
http {
upstream backend_servers {
server backend1.example.com;
server backend2.example.com;
# 可以添加更多后端服务器
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 其他location块配置...
}
# 其他server块配置...
}
在这个示例中:
- upstream块用于定义后端服务器组,可以包含多个后端服务器地址。
- server块定义了Nginx服务的监听端口和域名。
- location /块用于匹配所有请求,并将它们转发到后端服务器组。
- proxy_set_header指令用于设置请求头信息,以便后端服务器能够获取到客户端的真实信息。