基本概念

Nginx是一个轻量级的高性能HTTP反向代理服务器,同时它也是一个通用类型的代理服务器,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS等。

动静分离

基本概念

动静分离指的是将网站的动态内容(如需要通过服务器端语言生成的页面)和静态内容(如图片、CSS、JavaScript文件)分离,分别由不同的服务器或服务进行处理。通过动静分离,可以提高网站的性能、减少服务器的压力,并优化用户的访问体验。

动静分离的好处

  1. 提高性能:静态资源可以通过专门的服务器或CDN进行缓存,减少动态服务器的负担。
  2. 更好的缓存管理:静态资源不经常变化,可以长时间缓存,而动态内容则需要频繁更新。
  3. 分布式部署:静态资源可以放在专门的静态资源服务器或CDN上分布式部署,动态请求则由应用服务器处理。
  4. 更好的安全性:将静态资源与动态应用隔离,可以减少攻击面。

Nginx实现动静分离

Nginx在动静分离中的作用通常是作为反向代理和静态资源服务器。Nginx可以根据请求的URL路径或文件类型,将请求分别转发到不同的后端服务器(如应用服务器和静态资源服务器),或者直接由Nginx自身处理静态文件。


以下是一个基本的Nginx动静分离配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name example.com;

# 静态资源配置
location /static/ {
root /var/www/html; # 静态文件存放路径
access_log off; # 关闭静态资源的访问日志记录
expires 30d; # 设置静态资源缓存时间为30天
}

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /var/www/html; # 静态文件存放路径
access_log off; # 关闭访问日志
expires 30d; # 设置缓存时间为30天
}

# 动态请求配置
location / {
proxy_pass http://backend_server; # 动态内容转发到应用服务器
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;
}
}
  1. 静态资源处理
    • 通过location /static/指定所有以/static/开头的URL路径的请求都由Nginx直接从/var/www/html目录下读取对应的静态文件。
    • 使用正则表达式匹配jpg|jpeg|png|gif|ico|css|js等静态文件类型,直接由Nginx处理。
    • 设置缓存时间为30天,减少重复请求。
  2. 动态请求处理
    • 其他未匹配的请求将被认为是动态内容请求,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
10
http {
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
10
http {
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
6
server {
location / {
deny 192.168.1.1;
...
}
}

这种方法适用于阻止少量已知的恶意IP。

负载均衡

使用Nginx作为负载均衡器,将流量分发到多个后端服务器。这样,即使受到DDoS攻击,攻击流量也可以在多台服务器之间分散,减轻单台服务器的负担。

1
2
3
4
5
6
7
8
9
10
11
upstream backend {
server backend1.example.com;
server backend2.example.com;
}

server {
location / {
proxy_pass http://backend;
...
}
}

缓存静态内容

通过缓存静态内容(如图片、CSS文件等),减少服务器对重复请求的处理负担,进而减轻DDoS攻击的影响。

1
2
3
location /images/ {
expires 30d;
}

调整超时设置

调整Nginx的超时设置,例如client_body_timeoutclient_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_fromreal_ip_header指令。

3. 压缩

  • 解释:对HTTP响应进行压缩可以减少传输的数据量,提高加载速度。
  • Nginx实现:通过gzip模块启用压缩,例如在httpserver块中设置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_zonelimit_req指令实现。

7. 防DDoS攻击

  • 解释:检测并阻止异常大量的流量,防止服务被恶意攻击。
  • Nginx实现:结合limit_connlimit_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_certificatessl_certificate_key指令。

知识补充

在 Nginx 中解决证书调用链缺失和自签证书 x509 问题可以通过以下步骤来完成:

1. 解决证书调用链缺失

配置完整的证书链

要确保 Nginx 服务器提供完整的证书链,需要将服务器证书和所有中级证书(如果有)一起配置在 nginx.conf 中。通常,这些证书会被合并成一个文件,然后在 Nginx 配置中指定。

  1. 合并证书链

    • 首先,将你的服务器证书和中级证书合并到一个文件中。假设你的服务器证书是 server.crt,中级证书是 intermediate.crt,你可以将它们合并成一个 fullchain.crt 文件:
      1
      cat server.crt intermediate.crt > fullchain.crt
  2. 配置 Nginx

    • 编辑 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf),并确保 ssl_certificate 指向包含完整证书链的文件:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      server {
      listen 443 ssl;
      server_name example.com;

      ssl_certificate /path/to/fullchain.crt;
      ssl_certificate_key /path/to/private.key;

      # 其他 SSL 配置
      }
    • 保存并重新加载 Nginx 配置:
      1
      2
      sudo nginx -t  # 测试配置文件是否正确
      sudo systemctl reload nginx # 重新加载配置
  3. 验证配置

    • 使用工具如 openssl 或在线工具(如 SSL Labs 的 SSL Test)来验证证书链是否正确配置:
      1
      openssl s_client -connect example.com:443 -showcerts

2. 解决自签证书 x509 问题

信任自签证书

自签证书在生产环境中不常用,但如果你在开发或测试环境中使用自签证书,可以按照以下步骤解决信任问题:

  1. 将自签证书添加到受信任的证书存储中

    • 在客户端(浏览器)中
      • 访问 https://example.com,浏览器会提示证书不受信任。通常,你可以在浏览器中选择“继续”或“添加信任”,将证书添加到受信任证书列表中。
    • 在操作系统中
      • Linux
        • 将自签证书复制到受信任的证书目录(如 /usr/local/share/ca-certificates/)。
        • 更新证书存储:
          1
          2
          sudo cp selfsigned.crt /usr/local/share/ca-certificates/selfsigned.crt
          sudo update-ca-certificates
      • Windows
        • 打开“证书管理器” (certmgr.msc),导入自签证书到“受信任的根证书颁发机构”中。
      • macOS
        • 使用“钥匙串访问”工具,将自签证书添加到“系统”钥匙串中的“受信任根证书”类别。
  2. 检查证书有效性

    • 确保自签证书在有效期内。如果证书过期,需要重新生成自签证书。
  3. 匹配证书内容

    • 确保证书的主题名称(CN)与实际使用的主机名匹配。