Nginx 配置
Nginx 是全部服务的入口,非常重要,请仔细阅读。这里不仅会涉及到业务相关的配置,也会涉及到安全方面的配置。在结尾还有有一些 Nginx 配置参数的说明,帮助理解配置项。
nginx.conf
配置样例
以下配置每行都是有用的,请详细对照配置文件,不要随意修改。可能目前尚不完善,后续会持续完善此配置。
重要
- 记得修改
server_name
的值,一般是访问的域名,支持正则和通配符。 - 注意
sendfile
、tcp_nopush
、tcp_nopush
、client_header_buffer_size
、large_client_header_buffers
的配置。
user root; # Linux不指定用户名可能会导致403 无法访问本地文件
worker_processes 1; # Nginx进程数,一般设置和 cpu 核数一样
events {
worker_connections 1024; # 单个后台进程的最大并发数
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time';
# 开启高效的文件传输模式
sendfile on;
# 提升网络包的传输效率
tcp_nopush on;
# 提高网络包传输的实时性
tcp_nodelay on;
keepalive_timeout 65;
# 客户端请求头的缓冲区大小
client_header_buffer_size 32k;
# 客户端请求头的最大缓冲区数量和大小
large_client_header_buffers 4 32k;
# 静态资源文件压缩配置
gzip on; # 开启Gzip
gzip_static on; # 开启静态文件压缩,使用预压缩好的 gz 文件
gzip_min_length 1k; # 不压缩临界值,大于1K的才压缩
gzip_http_version 1.1;
gzip_comp_level 8; # 压缩级别 1~9 按需选择
gzip_types text/plain application/json application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; # 进行压缩的文件类型
gzip_vary on; # 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_proxied expired no-cache no-store private auth; # Nginx做为反向代理的时候启用,详见下面表格
gzip_disable "MSIE [1-6]\."; # 由于IE6及以下版本浏览器兼容不好,则屏蔽IE6及以下浏览器的压缩
brotli on; # 开启 br 压缩
brotli_static on; # 开启静态文件压缩,使用预压缩好的 br 文件
brotli_comp_level 8; # 压缩级别 1~11 按需选择,从 9 开始 CPU 使用率飙升,可根据服务器性能动态调整
brotli_min_length 1k; # 不压缩临界值,大于1K的才压缩
brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml; # 进行压缩的文件类型
# 错误界面拦截参数 开启
fastcgi_intercept_errors on;
server {
listen 80;
server_name www.server_name.com;
location / {
rewrite ^(.*)$ https://www.server_name.com$1 permanent; #将该域名下的http请求重定向为https
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# https的设置
server {
listen 443 ssl;
server_name www.server_name.top;
# SSL证书的设置
ssl on;
ssl_certificate cert/server_name.top.pem;
ssl_certificate_key cert/server_name.top.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305; #使用此加密套件。
ssl_protocols TLSv1.2 TLSv1.3; # 使用该协议进行配置。
ssl_prefer_server_ciphers off; # 仅使用 TLSv1.2 TLSv1.3 设置未 off
# 表示使nginx阻止HTTP应答代码为400或者更高的应答。
proxy_intercept_errors on;
# 只通过 HTTPS 访问该站点
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# 禁用客户端的 MIME 类型嗅探行为
add_header X-Content-Type-Options nosniff;
# 当检测到跨站脚本攻击 (XSS (en-US)) 时,浏览器将停止加载页面
add_header X-XSS-Protection "1;mode=block";
# 允许站点管理者控制用户代理能够为指定的页面加载哪些资源,默认增加ipt服务连接,腾讯视频资源查看后续配置
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' http: https: data: blob: ws://127.0.0.1:8687 ";
# 前端静态文件部署配置
location /basic-paper-cloud {
root /usr/website; # 站点目录。
index index.html;
try_files $uri $uri/ /basic-paper-cloud/index.html;
# 静态资源缓存 8 小时
expires 8h;
}
# WebCall客户端前端静态文件部署配置,如果为部署WebCall可以忽略
location /webcall-cloud {
root /usr/website;
index index.html;
try_files $uri $uri/ /webcall-cloud/index.html;
# 静态资源缓存 8 小时
expires 8h;
}
# 针对需要不缓存的 index.html 文件的 location 块
location ~* /(basic-paper-cloud|webcall-cloud)/index.html$ {
root /usr/website;
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Expires 0;
}
# 服务地址代理,注意:这里比较特殊,结尾必须有 /
location /basic-paper-cloud/api/ {
# 这里的端口号一定是 basic-paper-gateway 的端口号,注意:这里比较特殊,结尾必须有 /
proxy_pass http://localhost:8000/;
include proxy.conf; # 引入扩展配置文件
}
# 文件映射地址
location /files {
# 这里的端口号一定是 basic-paper-gateway 的端口号
proxy_pass http://localhost:8000/basic-paper-file/files;
include proxy.conf; # 引入扩展配置文件
# 注意这里不用配置缓存时间,因为 server 有自己的规则进行缓存
}
}
}
proxy.conf
通用配置
在 nginx.conf
同目录下创建 proxy.conf
并加入以下内容
# Websocket需要下面三行
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
#后端的Web服务器可以通过X-Real-IP获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
#如果后台没有配置证书可以使用如下配置,进行简化配置
proxy_set_header X-Forwarded-Proto $scheme;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数,
#如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器 ,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_bo dy_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了 。
#无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
client_body_buffer_size 128k;
#后端服务器连接的超时时间_发起握手等候响应超时时间
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 90;
#后端服务器数据回传时间(代理发送超时)
#后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_send_timeout 90;
#连接成功后,后端服务器响应时间(代理接收超时)
#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也 可以说是后端服务器处理请求的时间)
proxy_read_timeout 90;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
#设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中 包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个 缓冲区的大小,不过可以将其设置为更小
proxy_buffer_size 4k;
#proxy_buffers缓冲区,网页平均在32k以下的设置
#设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页 大小,根据操作系统的不同可能是4k或者8k
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞 太长
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
配置文件详解
gzip压缩配置参数详解
gzip
启用或禁用gzip压缩
Syntax: gzip on | off; Default: gzip off; Context: http, server, location, if in location
gzip_buffers
设置用于压缩响应的缓冲区的数量和大小
Syntax: gzip_buffers number size; Default: gzip_buffers 32 4k|16 8k; Context: http, server, location
gzip_comp_level
设置压缩级别,取值范围:1~9
Syntax: gzip_comp_level level; Default: gzip_comp_level 1; Context: http, server, location
gzip_disable
正则处理User-Agent
禁用压缩
Syntax: gzip_disable regex ...; Default: — Context: http, server, location
gzip_http_version
设置压缩响应所需的请求的最低 HTTP 版本
Syntax: gzip_http_version 1.0 | 1.1; Default: gzip_http_version 1.1; Context: http, server, location
gzip_min_length
设置将被压缩的响应的最小长度。长度仅由Content-Length
响应头字段确定
Syntax: gzip_min_length length; Default: gzip_min_length 20; Context: http, server, location
gzip_proxied
Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; Default: gzip_proxied off; Context: http, server, location
Nginx作为反向代理的时候启用,根据某些请求和应答来决定是否在对代理请求的应答启用gzip压缩,是否压缩取决于请求头中的 Via
字段,指令中可以同时指定多个不同的参数,意义如下:
参数 | 描述 |
---|---|
off | 禁用所有代理请求的压缩,忽略其他参数 |
expired | 如果header中包含Expires 头信息,则启用压缩 |
no-cache | 如果header中包含Cache-Control:no-cache 头信息,则启用压缩 |
no-store | 如果header中包含Cache-Control:no-store 头信息,则启用压缩 |
private | 如果header中包含Cache-Control:private 头信息,则启用压缩 |
no_last_modified | 如果header中不包含Last_Modified 头信息,则启用压缩 |
no_etag | 如果header中不包含ETag 头信息,则启用压缩 |
auth | 如果header中包含Authorization 头信息,则启用压缩 |
any | 为所有代理请求启用压缩 |
gzip_types
进行压缩的文件类型
Syntax: gzip_types mime-type ...; Default: gzip_types text/html; Context: http, server, location
gzip_vary
如果指令 gzip、gzip_static 或 gunzip 处于活动状态,则启用或禁用插入Vary: Accept-Encoding
响应头字段。
Syntax: gzip_vary on | off; Default: gzip_vary off; Context: http, server, location
Brotli压缩配置参数详解
brotli_static
启用或禁用检查是否存在带扩展名的预压缩文件.br
。使用该always
值,在所有情况下都使用预压缩文件,而不检查客户端是否支持它。
- syntax:
brotli_static on|off|always
- default:
off
- context:
http
,server
,location
brotli
启用或禁用响应的即时压缩。
- syntax:
brotli on|off
- default:
off
- context:
http
,server
,location
,if
brotli_types
需要压缩的 MIME 类型。
- syntax:
brotli_types <mime_type> [..]
- default:
text/html
- context:
http
,server
,location
brotli_buffers
这个参数已经 弃用
,不需要配置
brotli_comp_level
设置即时压缩 Brotli 质量(压缩)level
。0
可接受的值在从到 的范围内11
。推荐配置 8
,因为设置 9
CPU 使用率飙升,性能好的机器可以考虑加满。
- syntax:
brotli_comp_level <level>
- default:
6
- context:
http
,server
,location
brotli_window
设置 Brotli 窗口size
。可接受的值为1k
, 2k
, 4k
, 8k
, 16k
, 32k
, 64k
, 128k
, 256k
, 512k
, 1m
, 2m
, 4m
, 8m
, 16m
。应该就是 TCP 的 Window Size,想要进一步了解可以查询相关资料。
- syntax:
brotli_window <size>
- default:
512k
- context:
http
,server
,location
brotli_min_length
设置将被压缩的响应的最小值。长度仅由Content-Length
响应标头字段确定。
- syntax:
brotli_min_length <length>
- default:
20
- context:
http
,server
,location
安全策略配置
Strict-Transport-Security
HTTP Strict-Transport-Security(通常简称为 HSTS)响应标头用来通知浏览器应该只通过 HTTPS 访问该站点,并且以后使用 HTTP 访问该站点的所有尝试都应自动重定向到 HTTPS。 资料:MDN Strict-Transport-Security
仅 https 需要配置
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
Content-Security-Policy
HTTP 响应头 Content-Security-Policy 允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(Cross-Site Script) 资料:MDN Content-Security-Policy
仅 https 需要配置,下面的配置是仅允许访问 https,详细配置请看资料,可以实现更多访问限制的配置。
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' http: https: data: blob: ";
网页访问ipt服务
在座席使用本地ipt服务作为话机时,增加网页连接本地ipt服务的websocket的许可
ws://127.0.0.1:8687
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' http: https: data: blob: ws://127.0.0.1:8687 ";
网页访问腾讯视频
在系统使用腾讯视频时,增加访问腾讯视频相关网址的许可
wss://qcloud.rtc.qq.com
wss://bk.rtc.qq.com
> https://pingtas.qq.com
add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' http: https: data: blob: wss://qcloud.rtc.qq.com wss://bk.rtc.qq.com https://pingtas.qq.com ";
第三方业务
如果业务中需要调用第三方业务系统,也同样需要在Content-Security-Policy中进行相应添加
X-Content-Type-Options
HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。 资料:MDN X-Content-Type-Options
add_header X-Content-Type-Options nosniff;
X-XSS-Protection
HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 (XSS (en-US)) 时,浏览器将停止加载页面。若网站设置了良好的 Content-Security-Policy 来禁用内联 JavaScript ('unsafe-inline'),现代浏览器不太需要这些保护,但其仍然可以为尚不支持 CSP 的旧版浏览器的用户提供保护。 资料:MDN X-XSS-Protection
add_header X-XSS-Protection "1;mode=block";