Bootstrap

Nginx常用技巧

静态服务

server {
  listen       80;
  server_name  static.sherlocked93.club;
  # 防止中文文件名乱码
  charset utf-8;    

  location /download {
    # 静态资源目录
    alias	          /usr/share/nginx/html/static;  
    # 开启静态资源列目录
    autoindex               on;    
    # on(默认)显示文件的确切大小,单位是byte;off显示文件大概大小,单位:KB、MB、GB
    autoindex_exact_size    off;   
    # off(默认)时显示的文件时间为GMT时间;on显示的文件时间为服务器时间
    autoindex_localtime     off;   
  }
}

图片防盗链

server {
  listen       80;        
  server_name  *.sherlocked93.club;
  
  # 图片防盗链
  location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
    # 只允许本机 IP 外链引用
    valid_referers none blocked server_names ~\.google\. ~\.baidu\. *.qq.com;  
    if ($invalid_referer){
      return 403;
    }
  }
}

什么是referer请求头?

  1. referer请求头包含了当前请求页面的来源地址,即表示当前页面是通过这个来源页面里的链接进入的。

  2. 服务端一般使用referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

利用referer防止盗链?

假设当一个 HTTP 请求头的 referer字段中包含一些不正确(期望)的值

那么可以使用nginxngx_http_referer_module 模块,禁止这个请求访问站点

也就是常说的nginx防盗链,不过需要注意的是,referer请求头是可以伪造的,因此这个模块并不能 100%的阻止这类请求。

防盗链功能主要由模块中的 valid_referers 指令与 $invalid_referer 变量配合使用。

请求过滤

# 非指定请求全返回 403
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
  return 403;
}

location / {
  # IP访问限制(只允许IP是 192.168.0.2 机器访问)
  allow 192.168.0.2;
  deny all;
  
  root   html;
  index  index.html index.htm;
}

配置图片、字体等静态文件缓存

  1. hash值的静态文件:缓存可以设置长一些,先设置强制缓存,在设置协商缓存;

  2. 没有hash值的静态文件:建议不设置强制缓存,仅通过协商缓存判断是否需要使用缓存

    强制缓存:浏览器不与服务端协商直接取浏览器缓存

    协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源

# 图片缓存时间设置
location ~ .*\.(css|js|jpg|png|gif|swf|woff|woff2|eot|svg|ttf|otf|mp3|m4a|aac|txt)$ {
	expires 10d;
}

# 如果不希望缓存
expires -1;

单页面项目 history 路由配置

server {
  listen       80;
  server_name  fe.sherlocked93.club;
  
  location / {
    # 前端页面文件夹
    root       /usr/share/nginx/html/dist;  
    index      index.html index.htm;
    try_files  $uri $uri/ /index.html @rewrites;  
    
    # 首页一般没有强制缓存
    expires -1;                          
    add_header Cache-Control no-cache;
  }
  
  # 接口转发,如果需要的话
  #location ~ ^/api {
  #  proxy_pass http://be.sherlocked93.club;
  #}
  
  location @rewrites {
    rewrite ^(.+)$ /index.html break;
  }
}

HTTP 请求转发到 HTTPS

# 两种方式:1、return 301;2、使用 rewrite
server {
    listen      80;
    server_name www.sherlocked93.club;

    # 单域名重定向
    if ($host = 'www.sherlocked93.club'){
        return 301 https://www.sherlocked93.club$request_uri;
    }
    # 全局非 https 协议时重定向
    if ($scheme != 'https') {
        return 301 https://$server_name$request_uri;
    }

    # 或者全部重定向
    return 301 https://$server_name$request_uri;

    # 以上配置选择自己需要的即可,不用全部加
}

泛域名路径分离

配置一些二级或者三级域名,希望通过Nginx自动指向对应目录,比如:

  1. test1.doc.sherlocked93.club 自动指向 /usr/share/nginx/html/doc/test1 服务器地址;
  2. test2.doc.sherlocked93.club 自动指向 /usr/share/nginx/html/doc/test2 服务器地址;
server {
    listen       80;
    server_name  ~^([\w-]+)\.doc\.sherlocked93\.club$;
    root /usr/share/nginx/html/doc/$1;
}

泛域名转发

把二级或者三级域名链接重写到我们希望的路径,让后端就可以根据路由解析不同的规则:

  1. test1.serv.sherlocked93.club/api?name=a 自动转发到 127.0.0.1:8080/test1/api?name=a
  2. test2.serv.sherlocked93.club/api?name=a 自动转发到 127.0.0.1:8080/test2/api?name=a
server {
    listen       80;
    server_name ~^([\w-]+)\.serv\.sherlocked93\.club$;

    location / {
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-NginX-Proxy true;
        proxy_pass              http://127.0.0.1:8080/$1$request_uri;
    }
}

最佳实践

  1. 为了使Nginx配置更易于维护,建议为每个服务创建一个单独的配置文件,存储在 /etc/nginx/conf.d 目录,根据需求可以创建任意多个独立的配置文件。
  2. 独立的配置文件,建议遵循以下命名约定 <服务>.conf,比如域名是 sherlocked93.club,那么你的配置文件的应该是这样的 /etc/nginx/conf.d/sherlocked93.club.conf,如果部署多个服务,也可以在文件名中加上Nginx转发的端口号,比如 sherlocked93.club.8080.conf,如果是二级域名,建议也都加上 fe.sherlocked93.club.conf
  3. 常用的、复用频率比较高的配置可以放到 /etc/nginx/snippets 文件夹,在Nginx的配置文件中需要用到的位置 include 进去,以功能来命名,并在每个 snippet 配置文件的开头注释标明主要功能和引入位置,方便管理。比如之前的 gzipcors 等常用配置,我都设置了 snippet。
  4. Nginx日志相关目录,内以 域名.type.log 命名(比如 be.sherlocked93.club.access.logbe.sherlocked93.club.error.log )位于 /var/log/nginx/ 目录中,为每个独立的服务配置不同的访问权限和错误日志文件,这样查找错误时,会更加方便快捷

参考地址:

  1. Nginx 从入门到实践,万字详解!
  2. 如何为Nginx 配置防盗链功能?
;