Nginx
基本概念
Nginx
是一个轻量级的高性能HTTP
反向代理服务器,同时它也是一个通用类型的代理服务器,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS
等。
动静分离
基本概念
动静分离指的是将网站的动态内容(如需要通过服务器端语言生成的页面)和静态内容(如图片、CSS、JavaScript文件)分离,分别由不同的服务器或服务进行处理。通过动静分离,可以提高网站的性能、减少服务器的压力,并优化用户的访问体验。
动静分离的好处
- 提高性能:静态资源可以通过专门的服务器或CDN进行缓存,减少动态服务器的负担。
- 更好的缓存管理:静态资源不经常变化,可以长时间缓存,而动态内容则需要频繁更新。
- 分布式部署:静态资源可以放在专门的静态资源服务器或CDN上分布式部署,动态请求则由应用服务器处理。
- 更好的安全性:将静态资源与动态应用隔离,可以减少攻击面。
Nginx实现动静分离
Nginx在动静分离中的作用通常是作为反向代理和静态资源服务器。Nginx可以根据请求的URL路径或文件类型,将请求分别转发到不同的后端服务器(如应用服务器和静态资源服务器),或者直接由Nginx自身处理静态文件。
以下是一个基本的Nginx动静分离配置示例:
1 | server { |
- 静态资源处理:
- 通过
location /static/
指定所有以/static/
开头的URL路径的请求都由Nginx直接从/var/www/html
目录下读取对应的静态文件。 - 使用正则表达式匹配
jpg|jpeg|png|gif|ico|css|js
等静态文件类型,直接由Nginx处理。 - 设置缓存时间为30天,减少重复请求。
- 通过
- 动态请求处理:
- 其他未匹配的请求将被认为是动态内容请求,Nginx将其转发给后端应用服务器(如PHP、Python、Java等)。
- 通过
proxy_pass
指令,将请求转发到指定的后端服务器(如http://backend_server
)。
静态资源通常可以结合CDN(内容分发网络)使用,将静态资源分发到全球各地的缓存节点,进一步提升访问速度。
资源压缩
基本概念
建立在动静分离的基础之上,如果一个静态资源的Size
越小,那么自然传输速度会更快,同时也会更节省带宽,因此我们在部署项目时,也可以通过Nginx
对于静态资源实现压缩传输,一方面可以节省带宽资源,第二方面也可以加快响应速度并提升系统整体吞吐。
对于图片、视频类型的数据,会默认开启压缩机制,因此一般无需再次开启压缩。
缓存区
基本概念
Nginx的缓冲区用于优化请求和响应处理,以提高性能和资源利用效率。缓冲区的主要作用是暂时存储请求和响应的数据,以便更高效地处理它们。
主要目的就在于:用来解决两个连接之间速度不匹配造成的问题,有了缓冲后,Nginx
代理可暂存后端的响应,然后按需供给数据给客户端。
缓存机制
基本概念
Nginx的缓存机制用于提高性能,减少对后端服务器的负担,并加快用户的响应速度。优点如下:
- 减少了再次向后端或文件服务器请求资源的带宽消耗。
- 降低了下游服务器的访问压力,提升系统整体吞吐。
- 缩短了响应时间,提升了加载速度,打开页面的速度更快。
静态文件缓存
Nginx可以直接缓存静态文件(如图片、CSS、JavaScript等),以减少对后端服务器的请求。静态文件缓存通常通过Nginx的文件系统缓存来实现,不需要额外配置。
反向代理缓存
反向代理缓存用于缓存从后端服务器获取的动态内容。它可以减少后端服务器的负载,并提高响应速度。配置反向代理缓存时,Nginx会将响应数据缓存到指定的目录,以便后续请求直接从缓存中获取。
防止DDos攻击
什么是DDos攻击
DoS攻击(Denial of Service,拒绝服务攻击)是一种网络攻击方式,攻击者通过发送大量请求或消耗目标系统的资源,使其无法正常提供服务。这种攻击通常是单一来源的,即攻击者从一台计算机或设备向目标发起攻击,导致目标服务器过载或崩溃,无法处理正常用户的请求。
DDoS攻击(Distributed Denial of Service,分布式拒绝服务攻击)是DoS攻击的一种扩展形式。与DoS攻击不同,DDoS攻击是通过多个来源(通常是由僵尸网络组成的许多被攻陷的计算机)同时向目标发起攻击。这种攻击方式更具破坏性,因为目标系统需要应对来自多个地点的大量攻击流量,使得防御更加困难,导致系统崩溃或严重减速,影响正常用户的访问。
简单来说,DoS 是来自单一来源的攻击,而 DDoS 是来自多个来源的攻击,目的是通过大量的恶意流量使目标系统无法正常工作。
Nginx如何防范
限制请求速率
通过配置Nginx的limit_req
模块,可以限制每个IP地址的请求速率,防止单个IP地址发送过多请求导致服务器过载。
1
2
3
4
5
6
7
8
9
10http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
...
}
}
}
这个配置将每个IP地址的请求速率限制为每秒10个请求。
限制连接数
通过配置Nginx的limit_conn
模块,可以限制每个IP地址的并发连接数。
1
2
3
4
5
6
7
8
9
10http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10;
...
}
}
}
这个配置将每个IP地址的并发连接数限制为10个。
使用防火墙和IP黑名单
可以通过配置Nginx或结合操作系统的防火墙(如iptables),屏蔽已知的恶意IP地址。也可以使用Nginx的deny
指令:
1
2
3
4
5
6server {
location / {
deny 192.168.1.1;
...
}
}
这种方法适用于阻止少量已知的恶意IP。
负载均衡
使用Nginx作为负载均衡器,将流量分发到多个后端服务器。这样,即使受到DDoS攻击,攻击流量也可以在多台服务器之间分散,减轻单台服务器的负担。
1
2
3
4
5
6
7
8
9
10
11upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://backend;
...
}
}
缓存静态内容
通过缓存静态内容(如图片、CSS文件等),减少服务器对重复请求的处理负担,进而减轻DDoS攻击的影响。
1
2
3location /images/ {
expires 30d;
}
调整超时设置
调整Nginx的超时设置,例如client_body_timeout
和client_header_timeout
,可以使Nginx更快地关闭无效连接,防止攻击者通过保持大量连接消耗服务器资源。
跨域配置
自实现nginx模板
基本功能
1. epoll
- 解释:epoll是一种高效的I/O多路复用技术,在Linux系统中用于处理大量并发连接。它比传统的select/poll更高效,因为它只通知发生事件的文件描述符。
- Nginx实现:Nginx通过设置
events
块中的use epoll;
来启用epoll。
2. 获取用户真实IP
- 解释:在经过代理服务器或负载均衡器的情况下,客户端的真实IP可能会被隐藏。此功能确保Nginx能够正确识别客户端的真实IP地址。
- Nginx实现:使用
real_ip
模块配合set_real_ip_from
和real_ip_header
指令。
3. 压缩
- 解释:对HTTP响应进行压缩可以减少传输的数据量,提高加载速度。
- Nginx实现:通过
gzip
模块启用压缩,例如在http
或server
块中设置gzip on;
。
4. 缓存
- 解释:缓存可以存储经常访问的内容,减少对后端服务器的请求,提高响应速度。
- Nginx实现:使用
proxy_cache
模块,定义缓存区并在location
块中启用。
5. HTTP重定向HTTPS
- 解释:将HTTP请求自动重定向到HTTPS,增加安全性。
- Nginx实现:通过
listen
指令监听HTTP端口,并使用return 301 https://$host$request_uri;
来实现重定向。
6. 限流
- 解释:限制客户端的请求速率,防止资源滥用。
- Nginx实现:使用
limit_req
模块,可以通过limit_req_zone
和limit_req
指令实现。
7. 防DDoS攻击
- 解释:检测并阻止异常大量的流量,防止服务被恶意攻击。
- Nginx实现:结合
limit_conn
和limit_req
等指令,并可能需要额外的脚本或工具(如Nginx Plus的动态模块)。
8. 反向代理
- 解释:作为客户端和后端服务器之间的中间层,处理请求并转发给后端。
- Nginx实现:使用
proxy_pass
指令将请求转发到指定的后端服务器。
9. 负载均衡
- 解释:将客户端请求分配到多个后端服务器上,提高可用性和响应能力。
- Nginx实现:使用
upstream
块定义一组后端服务器,并通过proxy_pass
指令将请求分发到这些服务器。
10. 高并发保护
- 解释:保护后端服务器免受过多并发连接的影响。
- Nginx实现:使用
limit_conn
模块限制每个IP地址的连接数,或者使用proxy_max_temp_file_size
来限制上传文件的大小。
11. 证书调用链缺失和自签证书报 x509 问题
- 解释:这些问题通常出现在HTTPS配置中,比如证书链不完整或使用了自签名证书而浏览器不信任。
- Nginx实现:确保所有必要的证书文件都已正确安装,并且在Nginx配置文件中正确引用,例如使用
ssl_certificate
和ssl_certificate_key
指令。
知识补充
在 Nginx 中解决证书调用链缺失和自签证书 x509
问题可以通过以下步骤来完成:
1. 解决证书调用链缺失
配置完整的证书链
要确保 Nginx 服务器提供完整的证书链,需要将服务器证书和所有中级证书(如果有)一起配置在 nginx.conf
中。通常,这些证书会被合并成一个文件,然后在 Nginx 配置中指定。
合并证书链:
- 首先,将你的服务器证书和中级证书合并到一个文件中。假设你的服务器证书是
server.crt
,中级证书是intermediate.crt
,你可以将它们合并成一个fullchain.crt
文件:1
cat server.crt intermediate.crt > fullchain.crt
- 首先,将你的服务器证书和中级证书合并到一个文件中。假设你的服务器证书是
配置 Nginx:
- 编辑 Nginx 配置文件(通常位于
/etc/nginx/nginx.conf
或/etc/nginx/conf.d/default.conf
),并确保ssl_certificate
指向包含完整证书链的文件:1
2
3
4
5
6
7
8
9server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/fullchain.crt;
ssl_certificate_key /path/to/private.key;
# 其他 SSL 配置
} - 保存并重新加载 Nginx 配置:
1
2sudo nginx -t # 测试配置文件是否正确
sudo systemctl reload nginx # 重新加载配置
- 编辑 Nginx 配置文件(通常位于
验证配置:
- 使用工具如
openssl
或在线工具(如 SSL Labs 的 SSL Test)来验证证书链是否正确配置:1
openssl s_client -connect example.com:443 -showcerts
- 使用工具如
2. 解决自签证书 x509
问题
信任自签证书
自签证书在生产环境中不常用,但如果你在开发或测试环境中使用自签证书,可以按照以下步骤解决信任问题:
将自签证书添加到受信任的证书存储中:
- 在客户端(浏览器)中:
- 访问
https://example.com
,浏览器会提示证书不受信任。通常,你可以在浏览器中选择“继续”或“添加信任”,将证书添加到受信任证书列表中。
- 访问
- 在操作系统中:
- Linux:
- 将自签证书复制到受信任的证书目录(如
/usr/local/share/ca-certificates/
)。 - 更新证书存储:
1
2sudo cp selfsigned.crt /usr/local/share/ca-certificates/selfsigned.crt
sudo update-ca-certificates
- 将自签证书复制到受信任的证书目录(如
- Windows:
- 打开“证书管理器” (
certmgr.msc
),导入自签证书到“受信任的根证书颁发机构”中。
- 打开“证书管理器” (
- macOS:
- 使用“钥匙串访问”工具,将自签证书添加到“系统”钥匙串中的“受信任根证书”类别。
- Linux:
- 在客户端(浏览器)中:
检查证书有效性:
- 确保自签证书在有效期内。如果证书过期,需要重新生成自签证书。
匹配证书内容:
- 确保证书的主题名称(CN)与实际使用的主机名匹配。