文章目录
Nginx基本功能与代理定义
Nginx是一款高性能的HTTP服务器和反向代理服务器。代理服务器(Proxy Server)在客户端和目标服务器之间充当中介,其主要作用包括负载均衡、缓存、内容过滤和安全增强等。
- 反向代理:代理服务器代表目标服务器接受客户端请求,并将请求转发给目标服务器,再将响应返回给客户端。
- 正向代理:代理服务器代表客户端发送请求,获取目标服务器的响应并返回给客户端。
Nginx反向代理
工作原理
在反向代理模式中,Nginx接收客户端的HTTP请求,将这些请求转发给内部服务器集群处理,然后将服务器的响应发送回客户端。反向代理通常用于隐藏服务器集群的实际地址、实现负载均衡、提高性能和增强安全性。
应用场景
示例配置
http {upstream backend {server backend1.example.com;server backend2.example.com;}server {listen 80;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;}}
}
Nginx正向代理
工作原理
在正向代理模式中,客户端将请求发送给代理服务器,代理服务器再代表客户端向目标服务器发出请求,并将目标服务器的响应返回给客户端。正向代理通常用于访问控制、网络加速和隐私保护。
应用场景
- 访问控制:限制用户访问特定网站或服务。
- 内容过滤:过滤掉不合规或恶意内容。
- 隐私保护:隐藏客户端的真实IP,提高匿名性。
示例配置
events {worker_connections 1024;
}http {server {listen 8888;location / {proxy_pass http://$http_host$request_uri;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}
反向代理与正向代理的区别
- 代理对象:反向代理代理的是服务器,正向代理代理的是客户端。
- 应用目的:
- 配置差异:反向代理需要配置后端服务器池(upstream),正向代理直接将请求转发至目标服务器。
Nginx负载均衡算法
Nginx提供多种负载均衡算法来分配请求到后端服务器,常用的算法包括:
-
轮询(Round Robin):默认算法,将请求依次分配给每个后端服务器。
upstream backend {server backend1.example.com;server backend2.example.com; }
-
最少连接数(Least Connections):将请求分配给当前活动连接数最少的服务器。
upstream backend {least_conn;server backend1.example.com;server backend2.example.com; }
-
IP哈希(IP Hash):根据客户端IP地址的哈希值将请求分配给特定服务器,适用于会话保持。
upstream backend {ip_hash;server backend1.example.com;server backend2.example.com; }
-
权重(Weight):根据服务器的权重分配请求,权重越高,分配的请求越多。
upstream backend {server backend1.example.com weight=3;server backend2.example.com weight=1; }
Nginx缓存策略
缓存可以显著提高性能和减少后端服务器的负载。Nginx的缓存策略包括静态内容缓存和代理缓存。
静态内容缓存
Nginx可以直接缓存静态内容,如图片、CSS文件等。
location /static/ {root /var/www/html;expires 30d;add_header Cache-Control "public";
}
代理缓存
http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;server {location / {proxy_cache my_cache;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_cache_valid 200 302 10m;proxy_cache_valid 404 1m;add_header X-Cache-Status $upstream_cache_status;}}
}
缓存优化策略
Nginx高级安全设置
提高Nginx的安全性可以保护服务器免受各种网络攻击。以下是一些常用的安全设置:
-
限制请求速率:防止DDoS攻击和暴力破解。
http {limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;server {location / {limit_req zone=mylimit burst=20 nodelay;}} }
-
SSL/TLS配置:启用HTTPS,提高传输安全性。
server {listen 443 ssl;server_name example.com;ssl_certificate /etc/nginx/ssl/nginx.crt;ssl_certificate_key /etc/nginx/ssl/nginx.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";location / {proxy_pass http://backend;} }
-
防止主机头攻击:只允许特定的主机头。
server {server_name example.com;if ($host !~* ^(example\.com)$ ) {return 444;}location / {proxy_pass http://backend;} }
-
HTTP安全头:添加HTTP安全头以防止各种Web攻击。
server {add_header X-Content-Type-Options nosniff;add_header X-XSS-Protection "1; mode=block";add_header X-Frame-Options SAMEORIGIN;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;location / {proxy_pass http://backend;} }
动态内容缓存策略
Nginx的动态内容缓存可以显著提升网站性能和响应速度。动态内容缓存指的是缓存动态生成的网页内容,以减少对后端服务器的请求次数。
动态内容缓存配置
http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;server {location / {proxy_cache my_cache;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_cache_valid 200 302 10m;proxy_cache_valid 404 1m;add_header X-Cache-Status $upstream_cache_status;}}
}
动态内容缓存优化
-
proxy_cache_key "$scheme$request_method$host$request_uri";
-
缓存清理策略:定期清理过期和不再需要的缓存,保持缓存空间的有效利用。
find /data/nginx/cache -type f -mtime +7 -delete
-
避免缓存特定内容:对于用户特定数据(如购物车信息)不进行缓存。
location /cart {proxy_no_cache 1;proxy_pass http://backend; }
-
location /api {proxy_cache_valid 200 1m;proxy_pass http://backend; }location /static {proxy_cache_valid 200 30m;proxy_pass http://backend; }