day5:nginx代理-动静分离
一、正向代理与反向代理
什么是代理?
首先,让我们了解一下“代理”这个概念。代理就像是一个中间人,它代表着另一方执行任务。在计算机网络中,代理服务器就充当着客户端(你的电脑)和目标服务器(例如网站)之间的“中间人”。
1. 正向代理
定义:
正向代理(Forward Proxy)是一种代理服务器,客户端通过它向外部服务器发送请求。简单来说,它就是你去找一个代理人,所有的请求都由代理人帮你去做。
工作原理:
你(客户端)发送请求给正向代理服务器。
正向代理服务器代替你向目标服务器发送请求。
目标服务器不知道你是谁,只知道请求是通过代理服务器来的。
最后,正向代理服务器把目标服务器的响应内容返回给你。
实际生活中的例子:
假设你住在一个小区,里面有很多小朋友。小朋友们都想看国外的视频,但视频服务被小区的网络封锁了。于是你找到一个外面的“代理人”,让他代表你向外面的视频服务请求视频。你自己不直接和外面的视频服务沟通,而是通过这个代理人。
应用场景:
访问受限制的网站:例如在学校或公司,你的网络访问受到限制,可以通过正向代理访问被封锁的网站。
隐藏真实 IP 地址:例如你不想让别人知道你上网的地点或身份,通过正向代理可以隐藏你的真实信息。
提高匿名性:正向代理还可以提高匿名性,保护你的隐私。
2. 反向代理
定义:
反向代理(Reverse Proxy)是一种代理服务器,客户端的请求首先发送到反向代理服务器,反向代理再将请求转发给内部的目标服务器。和正向代理相反,反向代理隐藏的是后端服务器的真实信息。
工作原理:
你(客户端)向反向代理发送请求。
反向代理决定把请求转发给哪个真实的服务器(后端服务器)。
反向代理把后端服务器的响应返回给你。
实际生活中的例子:
想象你到了一家大型超市,门口有一个接待员。接待员会先了解你需要购买什么,然后带你去相应的货架。你不知道货架的位置,也不知道哪个货架上有你需要的商品。接待员(反向代理)帮你找到商品,并把它交给你。
应用场景:
负载均衡:例如有多台服务器来处理大量的用户请求,反向代理会根据不同的规则把请求分发到不同的服务器,保证负载均衡,提高性能。
提高安全性:反向代理可以隐藏真实服务器的 IP 地址,这样外部的用户就无法直接访问到内部的服务器,增强了安全性。
缓存:反向代理可以缓存常用的请求内容,减少后端服务器的负担,提高响应速度。
正向代理与反向代理的区别
特点 正向代理 反向代理 代理对象 客户端通过代理访问外部服务器。 客户端通过代理访问内部服务器。 目的 主要是帮助客户端访问外部的服务。 主要是帮助服务器管理外部的请求,保护内部服务器。 谁知道代理 目标服务器不知道客户端的真实地址。 客户端不知道后端服务器的真实地址。 常见应用 访问控制、绕过网络限制、匿名访问等。 负载均衡、安全保护、缓存、SSL 加速等。
总结
正向代理:是客户端使用代理服务器访问外部资源,隐藏客户端的信息和请求。
反向代理:是客户端通过代理服务器访问内部资源,隐藏后端服务器的信息,常用于负载均衡和安全防护。
正向代理:就像你委托朋友去商店买东西,商店并不知道你是谁,只知道你的朋友来买。
反向代理:就像你去超市,门口有接待员帮你决定哪个货架上有你需要的商品,超市不直接知道你是什么人。
正向代理: 帮助你绕过限制,访问你想去的地方。
反向代理: 帮助网站管理访问,保证服务更快、更安全。
二、nginx代理配置
Nginx 是一款高性能的 Web 服务器和反向代理服务器,常被用于负载均衡、反向代理、静态文件服务等场景。它的配置简单且功能强大,是目前最受欢迎的反向代理工具之一。
概述及其原理
Nginx 代理的原理:
反向代理:
客户端发出的请求先到达 Nginx 服务器,Nginx 根据配置规则将请求转发到真实的后端服务器(如应用服务器、数据库服务器等)。
客户端通常无法直接访问后端服务器,所有请求和响应都通过 Nginx 代理进行处理。
通过这种方式,Nginx 可以隐藏后端服务器的真实 IP,提供负载均衡、缓存等功能。
正向代理:
虽然 Nginx 的主流用途是反向代理,但它也可以配置为正向代理,用于让客户端访问被限制的资源。
环境搭建
安装 Nginx:
在 Linux 上可以通过包管理器(如yum
或apt
)来安装 Nginx。
CentOS/RHEL 系统:
sudo yum install nginx
Ubuntu/Debian 系统:
sudo apt update sudo apt install nginx
启动 Nginx:
sudo systemctl start nginx
检查 Nginx 是否安装成功:
在浏览器中访问http://localhost
或http://服务器IP
,如果看到 Nginx 的欢迎页面,说明安装成功。设置开机自启:
sudo systemctl enable nginx
基本配置及其语法
Nginx 配置文件通常位于
/etc/nginx/nginx.conf
或/etc/nginx/conf.d/
目录下。配置文件的基本语法包括:
主配置块: 定义 Nginx 运行的基本信息,如工作进程数、日志路径等。
user nginx; # 定义 Nginx 运行的用户 worker_processes 1; # 定义工作进程数 error_log /var/log/nginx/error.log; # 错误日志文件 pid /var/run/nginx.pid; # Nginx 进程 ID 文件
http 块: 包含了与 HTTP 服务相关的配置。
http {include 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; # 访问日志文件 }
server 块: 每个
server
块用于定义一个虚拟主机配置。server {listen 80; # 监听 80 端口server_name localhost; # 域名location / { # 根路径配置root /usr/share/nginx/html;index index.html index.htm;} }
location 块: 用于定义具体 URL 路径的配置。
location /images/ {root /data; # 为 /images 路径提供文件服务,根目录为 /data }
Nginx 反向代理配置
在 Nginx 中配置反向代理非常简单。最基本的配置如下:
server {listen 80; # 监听 80 端口server_name example.com; # 绑定域名location / { # location /user/ { 假如是这样就表示 example.com/user/就会反向代理到下面地址 # 这种表示/user开头proxy_pass http://backend_server; # 将请求转发到 backend_serverproxy_set_header Host $host; # 保留原始请求头proxy_set_header X-Real-IP $remote_addr; # 获取真实的客户端 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发 IP 信息,这个会发到被反向代理的服务器,方便查看proxy_set_header X-Forwarded-Proto $scheme; # 转发协议信息} }
这里,Nginx 会把客户端对
example.com
的请求转发到后端的backend_server
上,通常这是一个其他 Web 服务器或应用服务器的地址。Nginx 负载均衡配置
如果你有多个后端服务器,可以配置负载均衡,将请求分发到多个后端服务器上:
http {upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend; # 将请求转发到 upstream 定义的服务器}} }
这样,Nginx 会将请求均匀地分发到
backend1.example.com
、backend2.example.com
和backend3.example.com
上。
Nginx性能优化配置
下面是一个详细的 Nginx 性能优化配置文件,其中包含了每个配置项的说明和注释。这样你可以方便地理解每一项配置的作用。
# Nginx 性能优化配置文件# 设定 worker 进程的数量。通常设置为 CPU 核心数,`auto` 会自动设置为 CPU 核心数量。 worker_processes auto; # 自动选择工作进程数为 CPU 核心数# 配置每个工作进程最大连接数。这个值可以根据服务器的负载和并发情况进行调整。 worker_connections 1024; # 每个工作进程最大连接数# 使用 epoll 模型(Linux 系统专用),它是事件驱动模型,适用于高并发的场景。 events {use epoll; # 使用 epoll 模型(仅适用于 Linux)worker_connections 1024; # 每个 worker 进程最大支持的连接数 }http {# 启用 Gzip 压缩,减小数据传输量,提高传输速度。gzip on; # 启用 Gzip 压缩gzip_comp_level 6; # 设置压缩级别,范围 1-9,9 是最高压缩比,但会消耗更多 CPUgzip_types text/plain text/css application/javascript application/json image/svg+xml; # 启用对这些类型文件的压缩gzip_vary on; # 允许根据客户端请求的压缩gzip_min_length 1000; # 文件大小大于 1000 字节才进行压缩# 配置 TCP 参数优化tcp_nopush on; # 启用 TCP_NOPUSH,减少网络包的发送数量tcp_nodelay on; # 启用 Nagle 算法,减少延迟# 配置 HTTP 连接的保持时间(Keep-Alive)keepalive_timeout 65; # 客户端和服务器之间保持连接的超时时间(秒)# 配置访问日志格式,减少日志记录对性能的影响access_log /var/log/nginx/access.log main; # 配置默认的访问日志路径# 配置日志格式(可以选择简化或禁用日志)log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"'; # 记录更多细节的日志格式# 静态文件缓存配置,减少不必要的重复请求location /images/ {root /var/www/html; # 设置文件根目录expires 30d; # 缓存静态文件 30 天add_header Cache-Control "public"; # 启用公共缓存}# 反向代理缓存配置,缓存请求并减少后端服务器的压力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_valid 200 1h; # 200 状态码的响应缓存 1 小时proxy_cache_use_stale error timeout updating; # 错误或超时时使用过期缓存proxy_pass http://backend; # 请求转发到后端服务器}}# 配置限制请求速率,防止恶意流量或 DDoS 攻击limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; # 每秒 1 个请求server {location / {limit_req zone=mylimit burst=5; # 每秒最大 1 个请求,最多允许 5 个请求突发}}# 配置连接数限制,每个 IP 地址的连接数限制limit_conn_zone $binary_remote_addr zone=addr:10m; # 限制每个 IP 的连接数server {location / {limit_conn addr 10; # 每个 IP 最多 10 个并发连接}}# 配置反向代理负载均衡(轮询方式)upstream backend {server backend1.example.com; # 后端服务器 1server backend2.example.com; # 后端服务器 2server backend3.example.com; # 后端服务器 3}server {location / {proxy_pass http://backend; # 代理请求到负载均衡池}}# 配置 SSL 加速,优化 TLS 设置server {listen 443 ssl; # 启用 SSLssl_certificate /etc/ssl/certs/server.crt; # SSL 证书路径ssl_certificate_key /etc/ssl/private/server.key; # SSL 密钥路径# 启用 SSL 会话缓存ssl_session_cache shared:SSL:10m; # 使用 10MB 的共享会话缓存ssl_session_timeout 1d; # 设置会话超时时间为 1 天# 启用更安全的协议ssl_protocols TLSv1.2 TLSv1.3; # 启用更安全的协议版本# 配置加密套件ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...'; # 设置加密套件ssl_prefer_server_ciphers on; # 优先使用服务器端的加密套件} }
配置说明:
worker_processes 和 worker_connections:这两个参数决定了 Nginx 能处理的最大连接数。
worker_processes
通常设置为 CPU 核心数,而worker_connections
决定了每个进程能处理的最大连接数。Gzip 压缩:开启 Gzip 压缩可以大大减少客户端和服务器之间传输的文件大小,提高带宽利用率。
TCP 参数:通过
tcp_nopush
和tcp_nodelay
优化 TCP 连接,减少数据包传输的延迟。Keep-Alive:可以减少每次请求时创建连接的开销,允许多个请求复用同一个连接。
缓存:通过缓存静态资源和代理缓存来减少服务器负载,提高响应速度。
请求限制:对过多的请求进行限制,防止恶意攻击(如 DDoS 攻击)。
负载均衡:配置反向代理负载均衡,将请求分发到多个后端服务器上,提高服务器的处理能力。
SSL 配置:优化 SSL/TLS 配置,确保安全和性能之间的平衡。
这些配置有助于提高 Nginx 的性能,减少资源消耗,保证高并发时的稳定性。你可以根据实际需求对这些配置进行调整。
获取真实 IP 地址
当客户端通过 Nginx 访问后端服务器时,Nginx 默认会把自己的 IP 地址作为请求头
X-Forwarded-For
传递给后端服务器。如果你想要获取客户端的真实 IP 地址,需要确保代理设置正确。在
proxy_set_header
配置中,我们已经传递了客户端的真实 IP 地址:proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
后端服务器获取客户端真实 IP 地址:
在后端服务器的日志中,可以通过读取
X-Real-IP
或X-Forwarded-For
请求头来获取客户端的真实 IP 地址。如果你使用的是 PHP,你可以通过以下代码获取真实 IP:
$client_ip = $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'];
如果你使用的是 Nginx 后端日志记录,可以配置日志格式为:
log_format main '$proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
这样,
X-Forwarded-For
中会包含客户端的真实 IP。
总结
环境搭建: 使用包管理工具安装 Nginx,启动服务后,确保可以访问
localhost
。基本配置: 配置 Nginx 的监听端口、日志格式、虚拟主机等基本设置。
反向代理配置: 使用
proxy_pass
配置将请求转发到后端服务器。负载均衡: 使用
upstream
块进行负载均衡配置,多个后端服务器的流量均衡分发。获取真实 IP: 配置
proxy_set_header
确保后端服务器获取到真实客户端的 IP 地址。希望这些内容能帮助你理解 Nginx 代理配置的基础!如果有任何疑问,随时告诉我!