Nginx核心功能
Nginx是一个高性能的HTTP和反向代理服务器,以其高并发、低内存消耗和模块化设计而闻名。功能分类主要作用典型应用场景HTTP服务器提供静态文件服务网站托管、文件下载反向代理转发请求到后端服务器应用服务器代理、API网关负载均衡分发流量到多台服务器高并发系统、分布式部署缓存服务缓存静态或动态内容加速网站访问、减轻后端压力SSL/TLS提供HTTPS加密安全传输、加密通信限流控制限制访问频率防爬虫
·
一、Nginx核心功能概述
Nginx是一个高性能的HTTP和反向代理服务器,以其高并发、低内存消耗和模块化设计而闻名。它的核心功能可以分为以下几个主要方面:
| 功能分类 | 主要作用 | 典型应用场景 |
|---|---|---|
| HTTP服务器 | 提供静态文件服务 | 网站托管、文件下载 |
| 反向代理 | 转发请求到后端服务器 | 应用服务器代理、API网关 |
| 负载均衡 | 分发流量到多台服务器 | 高并发系统、分布式部署 |
| 缓存服务 | 缓存静态或动态内容 | 加速网站访问、减轻后端压力 |
| SSL/TLS | 提供HTTPS加密 | 安全传输、加密通信 |
| 限流控制 | 限制访问频率 | 防爬虫、防DDoS |
| 访问控制 | 基于IP、用户的权限控制 | 权限管理、安全防护 |
二、HTTP服务器功能
2.1 静态文件服务
Nginx最基础的功能是作为HTTP服务器,提供静态文件服务。它能够高效地处理静态资源(HTML、CSS、JavaScript、图片等)的请求。
nginx
# 基本静态文件服务配置
server {
listen 80;
server_name example.com;
# 网站根目录
root /var/www/example.com/html;
# 默认首页文件
index index.html index.htm;
# 处理根路径请求
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存优化
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
access_log off;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
配置说明:
-
root:指定网站根目录 -
index:定义默认首页文件 -
try_files:按顺序查找文件,找不到则返回404 -
expires:设置浏览器缓存时间 -
deny all:禁止访问以点开头的文件(如.git、.htaccess等)
2.2 目录列表功能
在某些场景下(如文件下载站),可能需要启用目录列表功能。
nginx
location /downloads/ {
alias /var/www/files/;
autoindex on; # 开启目录列表
autoindex_exact_size off; # 显示文件大小(非精确)
autoindex_localtime on; # 显示本地时间
charset utf-8; # 字符集设置
# 访问控制
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
}
2.3 文件上传
通过配置client_max_body_size可以控制允许上传的文件大小。
nginx
server {
# 设置最大上传文件大小为100M
client_max_body_size 100M;
# 设置临时文件目录
client_body_temp_path /tmp/nginx_temp;
location /upload/ {
# 限制上传速度(每秒100KB)
limit_rate 100k;
# 处理文件上传
proxy_pass http://backend;
proxy_set_header X-Original-URI $request_uri;
}
}
三、反向代理功能
3.1 反向代理原理
反向代理(Reverse Proxy)是指代理服务器接收客户端的请求,然后将请求转发给内部网络上的后端服务器,并将从后端服务器得到的结果返回给客户端。
text
客户端 → Nginx(反向代理) → 后端服务器 客户端 ← Nginx(反向代理) ← 后端服务器
3.2 基本反向代理配置
nginx
server {
listen 80;
server_name api.example.com;
location / {
# 将请求转发到后端应用服务器
proxy_pass http://localhost:3000;
# 传递原始请求信息
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_set_header X-Forwarded-Proto $scheme;
# 超时设置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 缓冲区设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
}
}
3.3 代理WebSocket
WebSocket协议需要特殊的代理配置以支持长连接:
nginx
location /ws/ {
proxy_pass http://backend-websocket;
proxy_http_version 1.1;
# WebSocket必需的头信息
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 延长超时时间
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
# 其他标准代理设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
3.4 代理缓存
Nginx可以缓存后端服务器的响应,减少后端负载并加快响应速度。
nginx
# 定义缓存区域
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
max_size=1g inactive=60m use_temp_path=off;
server {
location / {
# 启用缓存
proxy_cache my_cache;
# 定义缓存键
proxy_cache_key "$scheme$request_method$host$request_uri";
# 缓存有效期
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;
# 跳过缓存的条件
proxy_cache_bypass $http_pragma;
proxy_cache_bypass $http_authorization;
# 添加缓存状态头
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}
四、负载均衡功能
4.1 负载均衡算法
Nginx支持多种负载均衡算法:
| 算法 | 描述 | 适用场景 |
|---|---|---|
| 轮询(默认) | 按顺序分配请求 | 服务器配置相近 |
| 加权轮询 | 根据权重分配请求 | 服务器性能不同 |
| IP哈希 | 根据客户端IP分配 | 需要会话保持 |
| 最少连接 | 分配给活跃连接最少的服务器 | 请求处理时间差异大 |
| 随机 | 随机选择服务器 | 简单的负载均衡 |
| 一致性哈希 | 根据指定变量哈希 | 分布式缓存 |
4.2 基本负载均衡配置
nginx
# 定义上游服务器组
upstream backend {
# 默认轮询算法
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com backup;
# 健康检查
keepalive 32;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
4.3 不同负载均衡算法示例
nginx
# IP哈希(会话保持)
upstream backend_ip_hash {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
# 最少连接
upstream backend_least_conn {
least_conn;
server backend1.example.com weight=2;
server backend2.example.com;
server backend3.example.com;
}
# 一致性哈希
upstream backend_hash {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
# 随机(带两个备用服务器)
upstream backend_random {
random two least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com weight=2;
server backend4.example.com;
}更多推荐
所有评论(0)