---
title: nginx常用配置
permalink: /pages/4fab39/
categories: 
  - 前端
tags: 
  - 前端
titleTag: 原创
date: 2023-09-01 09:58:20
author: 
  name: 华总
  link: https://xiaoying.org.cn/
---



## 配置HTTPS

```nginx
server {
        listen       443 ssl;
        server_name  xiaoying.org.cn;
        root         /usr/local/dist; #前端打包文件位置

       #域名证书文件名称
        ssl_certificate /etc/nginx/fullchain.cer;
       #域名证书私钥文件名称
        ssl_certificate_key /etc/nginx/xiaoying.org.cn.key;
  
        #请按照以下协议配置
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        #请按照以下套件配置，配置加密套件，写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;

        location ^~ /api/ {   #后端接口前缀
        proxy_set_header Host $host;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_pass http://127.0.0.1:8080;  #后端接口地址
    }

        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
  }
```

## 开启gzip压缩静态文件

### 配置 GZip 压缩

gzip 可以在 http, server, location 中和配置，这里配置到 http 下是全局配置，

```nginx
events {
    worker_connections 1024;
}

http{
   gzip on;   # 开启 gzip，Default: off
   gzip_min_length 1k; # gzip 压缩文件体积的最小值
   gzip_comp_level 6; # 压缩级别： 1-9，6是推荐的压缩级别，Default: 1
  
   # 压缩文件类型
   gzip_types application/atom+xml application/geo+json application/javascript application/x-javascript application/json application/ld+json application/manifest+json application/rdf+xml application/rss+xml application/xhtml+xml application/xml font/eot font/otf font/ttf image/svg+xml text/css text/javascript text/plain text/xml image/jpeg image/gif image/png;
  
  # 当客户端的 Accept-Encoding-capabilities 头发生变化时，告诉代理缓存 gzip 和常规版本的资源
   gzip_vary on; 
  
  /**服务器开启对静态文件（ CSS, JS, HTML, SVG, ICS, and JSON）的压缩。但是，要使此部分与之相关，需要在 gzip_types 设置 MIME 类型，，仅仅设置 gzip_static 为 on 是不会自动压缩静态文件的。**/
   gzip_static on;
  
 /** 设置用于压缩响应的 number 和 size 的缓冲区。默认情况下，缓冲区大小等于一个内存页。根据平台的不同，它也可以是4K或8K。**/
   gzip_buffers 32 4k;
  
  # IE6 以下的浏览器禁用 gzip 压缩
   gzip_disable "MSIE [1-6]\.";
  
  server {
    ...
      location / {
      ...
    }
  }
}
```

### 适合 GZip 压缩的资源类型

实际上，gzip 主要用于对文本类型的资源进行压缩，例如常用见的文本资源：

- HTML 文件：text/html（nginx 服务器默认就会压缩）、application/xhtml+xml
- CSS 文件：text/css
- JS 文件：application/x-javascript、application/javascript、text/javascript
- JSON 文件（或者API请求结果）：application/json、application/geo+json、application/ld+json application/manifest+json、application/x-web-app-manifest+json
- XML 文件：application/xml、application/atom+xml、application/rdf+xml、application/rss+xml
- SVG 文件：image/svg+xml;

除了常用的文本文件，gzip 也支持压缩以下 MIME 类型的文件：

- application/vnd.ms-fontobject
- application/wasm
- font/eot
- font/otf
- font/ttf
- image/bmp
- text/cache-manifest
- text/calendar
- text/markdown
- text/plain
- text/vcard
- text/vnd.rim.location.xloc
- text/vtt
- text/x-component
- text/x-cross-domain-policy

GZip 对基于文本的内容的资源压缩效果最好，在压缩较大文件时往往可实现高达 70-90% 的压缩率，而如果对已经通过替代算法压缩过的资源（例如，大多数图片格式）运行 gzip，则效果甚微，甚至毫无效果。

## HTTP重定向到HTTPS

```nginx
server {
        listen       80;
        server_name  xiaoying.org.cn;
        rewrite ^(.*)$  https://$host$1 permanent; 
        # return 301 https://$host$request_uri; 		
 }
```

## 配置缓存时间及防止用户直接访问目录或文件

ETag 可以由服务器生成，例如使用文件的内容的哈希值或其他算法生成唯一标识。客户端在后续请求中可以通过 If-None-Match 头部将之前收到的 ETag 发送回服务器。如果资源未发生变化，服务器可以返回 304 Not Modified 的响应，告知客户端可以使用本地缓存。如果资源发生变化，服务器将返回新的资源和更新的 ETag。

```nginx
location ~* \.(js|css|jpg|jpeg|png|gif|bmp|swf)$ {
    etag on;
  
   # max-age=86400 表示资源可以被缓存的最大时间为86400秒，即一天
   add_header Cache-Control "public, max-age=86400";
}

location ~ /\.
{
  # 防止直接通过浏览器输入URL访问敏感文件或目录。
   deny all;
}
```

## 配置防盗链

### **使用纯 `if` 的场景**

- 简单的单次条件判断（如检查文件是否存在）。
- 临时调试配置。

```nginx
server{
    listen       443 ssl;
    server_name minio.xiaoying.org.cn;

    #域名证书文件名称
    ssl_certificate /etc/nginx/fullchain.cer;
    #域名证书私钥文件名称
    ssl_certificate_key /etc/nginx/xiaoying.org.cn.key;

    #请按照以下协议配置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #请按照以下套件配置，配置加密套件，写法遵循 openssl 标准。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;

    location /images {
      alias /images;
      valid_referers none *.xiaoying.org.cn xiaoying.org.cn *.github.com github.com localhost 127.0.0.1;
      if ( $invalid_referer ) {
           return 403;
      }
      
      # 添加这一行让浏览器访问时直接下载文件
      add_header Content-Disposition 'attachment';
   }
}
```

这段配置是 Nginx 服务器针对图片资源的访问控制设置

1. 路径匹配与资源映射

``` nginx
location /images {
  alias /images;
}
```

这个配置的作用是，当客户端请求以/images开头的路径时，Nginx 会到服务器的/images目录下寻找对应的资源。举个例子，如果客户端请求的是`http://example.com/images/test.jpg`，那么 Nginx 就会去服务器的`/images/test.jpg`位置查找该文件。

2. 防盗链设置

```nginx
valid_referers none *.xiaoying.org.cn xiaoying.org.cn *.github.com github.com localhost 127.0.0.1;
  if ( $invalid_referer ) {
  return 403;
}
```
这部分配置实现了防盗链功能。Nginx 会对 HTTP 请求头中的 Referer 字段进行检查，只有当 Referer 字段为空（也就是none的情况），或者来源于`xiaoying.org. cn`等这些白名单域名及其子域名，又或者是本地访问（像localhost、127.0.0.1）时，才会允许访问图片资源。要是 Referer 字段不符合这些规则，就会返回 403 禁止访问的错误。

3. 强制下载设置


``` nginx
add_header Content-Disposition 'attachment';
```

这行配置的效果是，当用户访问图片资源时，浏览器不会直接在页面中显示图片，而是会弹出下载对话框，让用户选择将图片保存到本地。

### **使用 `map` + `if` 的场景**

- 复杂的条件判断（如多域名、多 IP 段）。
- 同一变量需要在多个地方复用判断结果。
- 高并发场景下对性能敏感的配置。

```nginx
http {
    # 其他http块配置...
    
    # 正确位置：在http块中，所有server块之前
    map $http_referer $allow {
        default 0;
        "" 1;  # 允许无 Referer
        "~*^https?://([^/]+\.)?xiaoying\.org\.cn(/.*)?$" 1;
        "~*^https?://([^/]+\.)?github\.com(/.*)?$" 1;
        "~*^https?://(localhost|127\.0\.0\.1)(/.*)?$" 1;
    }

   server{
        listen       443 ssl;
        server_name minio.xiaoying.org.cn;
    
        #域名证书文件名称
        ssl_certificate /etc/nginx/fullchain.cer;
        #域名证书私钥文件名称
        ssl_certificate_key /etc/nginx/xiaoying.org.cn.key;
      
        #请按照以下协议配置
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        #请按照以下套件配置，配置加密套件，写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
      
        location /images {
           alias /images;
           access_log off;  # 关闭访问日志，减轻服务器负担
         
          if ($allow = 0) {
            return 403;
          }
        
         # 可以根据文件类型选择性地设置Content-Disposition
         if ($request_filename ~* \.(jpg|jpeg|png|gif|webp)$) {
            add_header Content-Disposition 'attachment';
         }
       }  
   }
}
```

### 配置说明

- `~*` 表示不区分大小写，`([^/]+\.)?` 匹配二级/三级域名，`(/.*)?$` 匹配后面的路径。
- `map`指令在 Nginx 启动时就会被编译，它会为每个请求的`$http_referer`变量计算对应的`$allow`值。
- `$allow`变量在整个 Nginx 配置中都可以使用，所以你能在任何`server`或`location`块里引用它。
- 把复杂的正则表达式判断放在`map`中，只在启动时执行一次，这样可以避免在每个请求处理时都进行正则匹配，从而提升性能。
