UNPKG

create-base-teek-theme

Version:

``` npm create base-teek-theme@latest my-first-blog ```

286 lines (221 loc) 10.1 kB
--- 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`中,只在启动时执行一次,这样可以避免在每个请求处理时都进行正则匹配,从而提升性能。