# 应用场景

  1. 静态资源服务器
  2. 代理服务器
  3. 负载均衡服务器
  4. 流媒体转发服务器

# 静态资源服务器

# 网页服务

server{
    listen      80;  # 监听端口
    server_name localhost;  # 域名
    location /{
        index index.html index.htm index.php; # 入口文件
        root /usr/local/webserver/nginx/html; # 站点目录,绝对路径
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)${
        expires 30d;
    }
    location ~ .*\.(js|css)?${
    expires 15d;
    }
    access_log off;
}

# 配置 Gzip

gzip  on; # 打开或者关闭gzip压缩的功能
gzip_min_length 1024;  # 最小压缩长度, 被压缩的内容超过这个长度才会被压缩,否则直接输出
gzip_comp_level 2; #  压缩级别,分为1-9
# 列出来的内容类型才会被压缩,其他类型的内容不会被压缩,类型指的是MIME类型
gzip_types text/plain application/x-javascript text/css application/xml text/javascript  image/jpeg image/gif image/png;
gzip_vary on # 会在响应头增加vary:Accept-Encoding,代表已经进行服务端压缩
gzip_proxine  # 设置nginx 服务器是否对后端返回的结果进行gzip压缩,反向代理的时候有效
root /usr/local/test-img;# 存放静态资源的文件路径

# 配置 SSL

nginx -V
# 首先查看是否安装 https_ssl_module
# 如果出现 configure arguments: –with-http_ssl_module, 则已安装
# 准备申请好的SSL证书,丢到cert文件夹下
cd /usr/local/nginx
mkdir cert
server {
    listen       443 ssl; # 服务器端口使用443,开启ssl, 这里ssl就是上面安装的ssl模块
    server_name  www.gausszhou.top; # 域名,多个以空格分开
    # ssl证书地址
    ssl_certificate     /usr/local/nginx/cert/ssl.pem;  # pem文件的路径
    ssl_certificate_key  /usr/local/nginx/cert/ssl.key; # key文件的路径
    # ssl验证相关配置
    ssl_session_timeout  5m;    #缓存有效期
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    #安全链接可选的加密协议
    ssl_prefer_server_ciphers on;   #使用服务器端的首选算法
    ssl_session_cache shared:SSL:10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
    location / {
        root   html;
        index  index.html index.htm;
    }
}

# 配置防盗链

syntax: valid_referers none | blocked | server_names | string...;
default: -
context:server, location
valid_referers blocked server_names ~\.goole\. ~\.baidu\.;
if ($invalid_referer) {
    return 403; # 返回403
}
valid_referers blocked server_names ~\.goole\. ~\.baidu\.;
if ($invalid_referer) {
    rewrite ^/ http://127.0.0.1:7000/403.png; # 链接到403图片
}

实际配置

location ~ .*\.(jpg|jpeg|gif|png|js|css)$
  {
      expires      30d;
      access_log /dev/null;
      valid_referers *.gausszhou.top  localhost;
      if ($invalid_referer){
          return 403;
      }
  }

# 配置缓存

  • 强缓存:Expires,Cache-Control
  • 协商缓存:Etag,Last-Modified

强缓存:Expires,Cache-Control

location ~* \.(gif|jpg|jpeg|png|ico)$ {
    expires 1d; # s, m, h, d
    root /www/wwwroot/static.gausszhou.top;
}

协商缓存

location ~* \.(css|js|wasm)$ {
    add_header Cache-Control no-store;
    root /www/wwwroot/static.gausszhou.top;
}

# 配置 CORS

add_header "Access-Control-Allow-Origin"  *;
add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";

# 配置访问控制

{
    allow 192.168.0.100
    deny 192.168.0.101
}

# 配置重定向

举例 将 http 重定向到 https

server {
    listen       80;
    server_name  www.gausszhou.top;
    return 301 https://www.gausszhou.top;
}

# 代理服务器

代理分为正向代理跟反向代理;

  • 正向代理是为客户端做代理,代替客户端去访问服务器;
  • 反向代理是为服务器做代理,代替服务器接受客户端请求。

nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass`指令,只需要修改配置文件就可以实现反向代理。

# 反向代理

location / {
    add_header Access-Control-Allow-Origin *;
    # 处理跨域请求
    add_header Access-Control-Allow-Methods "OPTIONS";
    # 涉及预检请求,服务器需要允许该方法
    add_header Access-Control-Allow-Headers "Origin, Content-Type";
    # 请求头支持的传递字段
    proxy_pass http://localhost:3000;
    # 代理网路请求到本地3000端口
    # 重写主机名,防止后端真实的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能
    proxy_set_header Host  $host;
    proxy_set_header X-Forwarded-For  $remote_addr;
    # 重写服务器ip ,防止后端有防攻击策略的话,机器会被封掉
    proxy_add_x_forwarded_for: client ;
    # 保存请求端真实的IP
 }
# /etc/nginx/nginx.conf
server {
    listen 80;
    listen 443 ssl http2;
    server_name docs.gausszhou.top;
    location / {
        proxy_pass http://127.0.0.1:4999/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# 负载均衡服务器

负载均衡的作用

  1. 请求转发: 将客户端请求转发到不同的应用服务器上,减轻单个服务器压力,提高整体的并发量
  2. 故障移除: 通过心跳检测,判断服务器是否正常工作,将请求转发到正常运行的服务器,保证体验
  3. 恢复服务: 检测到服务器恢复工作,自动将其添加到请求处理队伍中

# 负载均衡的实现

  1. 自动轮询: 每个请求按照事件顺序逐一分配,如果服务器 down,自动剔除
  2. 配置权重:通过配置权重,指定访问比率,应对服务器性能不均的情况
  3. 哈希管理: 每个请求按照访问 ip 的 hash 结果分配到固定的应用服务器,应对会话管理

# 配置负载均衡

upstream 参数说明

  • down: 表示当前服务器不参与负载
  • backup: 备用机器:其他机器忙的时候,会请求 backup 机器
  • weight: 表示当前服务器的权重,权重越大,访问比例也大
  • max_fails:表示允许请求失败的次数
  • max_conns:限制最大的接收的连接数
  • fail_timeout: 经过 max_fails 次失败后,服务暂停的时间

前级代理

server {
    listen       9005;
    server_name  localhost;
    location / {
        proxy_pass http://clusters;
    }
 }

负载均衡

upstream clusters {
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
    server 127.0.0.1:9003;
    server 127.0.0.1:9004;
}

验证负载均衡是否起作用。

curl http://localhost:9005

# 调度算法讲解

轮询loop:按时间顺序逐一分配到不同的后端服务器

upstream clusters {
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
    server 127.0.0.1:9003;
    server 127.0.0.1:9004;
}

权重weight:默认为 1 weight 越大,匹配的机会越多

upstream clusters {
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
    server 127.0.0.1:9003 weight=2; # 访问比率:40%
    server 127.0.0.1:9004;
}

哈希ip_hash:每个请求按访问 ip 的 hash 结果分配,这样来自同一个 ip 的固定访问一个后端服务器,可以解决服务端的用户 session 问题

upstream clusters {
    ip_hash;
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
    server 127.0.0.1:9003 weight=2; # 访问比率:40%
    server 127.0.0.1:9004;
}

哈希url_hash:按照访问的 url 的 hash 结果来分配请求,是每个 url 定向到同一个后端服务器,可以解决缓存失效问题

upstream clusters {
    hash $request_uri;
    # $request_uri是nginx内部抛出的变量,指的是除了域名的部分
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
    server 127.0.0.1:9003 weight=2; # 访问比率:40%
    server 127.0.0.1:9004;
}

# 流媒体转发服务器

# 配置 RTMP 服务

vi /usr/lcoal/nginx/conf/nginx.conf
  rtmp_auto_push on;

  rtmp {
      server {
          listen 1935;

          application stream {
              live on;
          }

          application live {
              live on;
          }
      }
  }