Nginx 反向代理流程,以及缓冲区详解
Nginx 反向代理流程
-
客户端请求:
- 客户端(如浏览器)发送 HTTP 请求到 Nginx 服务器。
-
Nginx 接收请求:
- Nginx 监听特定的端口(通常是 80 或 443),接收到客户端的请求。
-
匹配 server 块:
- Nginx 根据请求中的
Host
头信息或其他条件(如 IP 地址或端口号)匹配相应的server
块。
- Nginx 根据请求中的
-
匹配 location 块:
- 在匹配到的
server
块中,Nginx 根据请求的 URI 匹配相应的location
块。
- 在匹配到的
-
处理指令:
- 在
location
块中,Nginx 执行各种指令,如proxy_pass
将请求转发到后端服务器。
- 在
-
与后端服务器通信:
- Nginx 将请求转发到指定的后端服务器。
- 后端服务器处理请求并返回响应。
-
响应客户端:
- Nginx 接收后端服务器的响应,并将其返回给客户端。
缓冲区的作用
- 减少 I/O 操作:通过在内存中缓存数据,减少对磁盘的读写操作,从而提高性能。
- 优化网络传输:通过一次性读取更多的数据,减少网络传输次数,提高效率。
- 处理大文件:对于大文件或大数据流,缓冲区可以帮助更高效地处理数据。
环境
- 两台后端应用服务器:
backend1
和backend2
- 使用 SSL/TLS 加密
- 使用 Nginx 作为反向代理和负载均衡器
- 使用 Nginx 缓存静态资源
- 使用合理的缓冲区配置优化性能
安装 Nginx
如果你还没有安装 Nginx,可以使用以下命令进行安装(以 Ubuntu 为例):
sudo apt-get update
sudo apt-get install nginx
生成 SSL 证书
为了启用 HTTPS,你需要一个有效的 SSL 证书。你可以使用 Let's Encrypt 免费获取证书,或者从其他 CA 获取。
sudo apt-get install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
Nginx 配置文件
编辑 Nginx 的配置文件,通常位于 /etc/nginx/nginx.conf
或 /etc/nginx/conf.d/
目录下的某个 .conf
文件。以下是一个完整的配置示例:
# 全局配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;events {worker_connections 768;
}http {# 日志格式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;error_log /var/log/nginx/error.log;# 上游服务器组upstream backend {server backend1:8080;server backend2:8080;# 负载均衡算法:轮询(默认)# least_conn; # 最少连接# ip_hash; # IP 哈希}# 主服务器块 (HTTP)server {listen 80;server_name example.com www.example.com;# 将 HTTP 请求重定向到 HTTPSreturn 301 https://$host$request_uri;}# 主服务器块 (HTTPS)server {listen 443 ssl http2;server_name example.com www.example.com;# SSL 证书和私钥路径ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; # 如果有 CA 捆绑包# 强制 HSTSadd_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;# 安全头add_header X-Frame-Options DENY;add_header X-Content-Type-Options nosniff;add_header X-XSS-Protection "1; mode=block";add_header Referrer-Policy "no-referrer-when-downgrade";# 缓冲区设置proxy_buffers 8 16k; # 设置代理缓冲区数量和每个缓冲区的大小proxy_buffer_size 32k; # 单个缓冲区的大小proxy_busy_buffers_size 64k; # 尝试释放的缓冲区最大总大小proxy_temp_file_write_size 64k; # 写入临时文件的最小数据量client_body_buffer_size 128k; # 客户端请求体缓冲区大小client_header_buffer_size 1k; # 客户端请求头缓冲区大小large_client_header_buffers 4 8k; # 大型客户端请求头缓冲区数量和大小# 默认 location 块location / {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_set_header X-Forwarded-Proto $scheme;# 缓存配置proxy_cache my_cache;proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;add_header X-Proxy-Cache $upstream_cache_status;# 缓冲区相关指令proxy_buffers 8 16k;proxy_buffer_size 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;}# 静态资源缓存location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {expires 30d;proxy_pass http://backend;proxy_cache my_cache;proxy_cache_valid 200 302 30d;proxy_cache_valid 404 1m;add_header X-Proxy-Cache $upstream_cache_status;# 缓冲区相关指令proxy_buffers 8 16k;proxy_buffer_size 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;}}# 缓存配置proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
}
详细解释
1. 全局配置
user www-data;
:指定运行 Nginx 的用户。worker_processes auto;
:根据 CPU 核心数自动设置工作进程数。events
块:设置每个工作进程的最大连接数。
2. 日志格式
log_format
:定义日志格式。access_log
和error_log
:指定访问日志和错误日志的位置。
3. 上游服务器组
upstream backend
:定义后端服务器组,包含两台后端服务器backend1
和backend2
。
4. 主服务器块 (HTTP)
listen 80;
:监听 80 端口。server_name example.com www.example.com;
:匹配域名。return 301 https://$host$request_uri;
:将所有 HTTP 请求重定向到 HTTPS。
5. 主服务器块 (HTTPS)
listen 443 ssl http2;
:监听 443 端口并启用 SSL 和 HTTP/2。ssl_certificate
和ssl_certificate_key
:指定 SSL 证书和私钥的路径。ssl_trusted_certificate
:如果需要 CA 捆绑包,指定其路径。add_header
:添加安全相关的 HTTP 头,如 HSTS、X-Frame-Options 等。
6. 缓冲区设置
proxy_buffers 8 16k;
:设置 8 个 16KB 的缓冲区,总共 128KB。proxy_buffer_size 32k;
:单个缓冲区的大小为 32KB。proxy_busy_buffers_size 64k;
:尝试释放的缓冲区最大总大小为 64KB。proxy_temp_file_write_size 64k;
:写入临时文件的最小数据量为 64KB。client_body_buffer_size 128k;
:客户端请求体的缓冲区大小为 128KB。client_header_buffer_size 1k;
:客户端请求头的缓冲区大小为 1KB。large_client_header_buffers 4 8k;
:大型客户端请求头的缓冲区数量和大小。
7. 默认 location 块
proxy_pass http://backend;
:将请求转发到后端服务器组。proxy_set_header
:设置转发请求时的头部信息。proxy_cache
和proxy_cache_valid
:配置缓存策略。
8. 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$
:匹配静态资源。expires 30d;
:设置静态资源的过期时间为 30 天。proxy_cache
和proxy_cache_valid
:配置缓存策略。
9. 缓存配置
proxy_cache_path
:定义缓存存储路径、层级、键区域大小、最大缓存大小和不活跃时间。
测试和应用配置
-
测试配置:
sudo nginx -t
-
重新加载 Nginx:
sudo systemctl reload nginx
或者
sudo service nginx reload