配置gzip
nginx中开启配置如下(可以作用于http,server, location块中):一般放在http下
# 开启压缩
gzip on;
#gzip开启阈值,超过1k才会使用gzip
gzip_min_length 1k;
# 压缩缓冲区大小,表示申请4个单位为16K的内存作为压缩结果的流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_buffers 4 16k;
# gzip支持http协议
gzip_http_version 1.0;
#压缩级别,越高压缩比越大,越消耗cpu
gzip_comp_level 3;
# 用来指定压缩的类型,"text/html"类型总是会被压缩
gzip_types text/plain application/javascript application/css text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/x-httpd-php image/jpeg image/gif image/png;
配置http跳转https
server {
# 监听端口
listen 80;
# 监听服务名
server_name xxx.com www.xxx.com 你的主机ip地址;
# 你的dist包地址,如果设置了跳转https,可以注释掉
# root /web/dist;
# 强制跳转https
return 301 https://www.$server_name$request_uri;
# 老版本的强制跳转
#rewrite ^(.*) https://$server_name$1 permanent;
# 解决vue刷新 404
location /{
try_files $uri $uri/ /index.html;
}
# 设置404跳转页面,可以不设置,在vue中进行拦截
error_page 404 /404.html;
location = /40x.html {
}
# 设置5xx跳转页面,可以不设置,在vue中进行拦截
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
配置https
普通配置
server {
# 监听端口
listen 443;
# 监听服务名
server_name xxx.com www.xxx.com;
# 开启ssl
ssl on;
# 你的dist包地址
root /web/dist;
# 访问首页
index index.html;
# 设置大文件上传最大为30M
client_max_body_size 30M;
# ssl 证书文件
ssl_certificate /etc/nginx/cert/4088128.pem;
# ssl 私钥文件
ssl_certificate_key /etc/nginx/cert/4088128.key;
# 设置缓存超时时间
ssl_session_timeout 5m;
# 配置共享会话缓存大小
ssl_session_cache shared:SSL:1m;
# ssl_protocols 和 ssl_ciphers 可以用来限制连接只包含 SSL/TLS 的加強版本和算法
# 由于这两个命令的默认值已经好几次发生了改变,因此不建议显性定义,除非有需要额外定义的值,如定义 D-H 算法:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
# #优先采取服务器算法,这里的具体配置可以看下面的增加安全性配置来设置
ssl_prefer_server_ciphers on;
# 跨域设置,具体信息可以看下方的跨域配置解释
add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE, HEAD" always;
add_header Access-Control-Max-Age 86400 always;
if ($request_method = 'OPTIONS') {
return 204;
}
location / {
# X-Forwarded-Host ???
proxy_set_header X-Forwarded-Host $host;
# 配置Nginx 请求转发,这个具体的解释可以看下方的请求转发
proxy_set_header X-Forwarded-Proto $scheme;
# 将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# X-Forwarded-For $proxy_add_x_forwarded_for 显示用户的真实的ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 服务器名称和端口一起通过代理服务器传递
proxy_set_header Host $http_host;
# 重定向url 一般也用不到
proxy_redirect off;
# 设置缓存控制为不缓存,具体看下方解释
add_header Cache-Control "no-cache, no-store";
expires off;
sendfile off;
# 设置访问主页
index index.html index.htm;
# 解决vue刷新 404
try_files $uri $uri/ /index.html;
}
# 设置接口当访问api的时候就表示访问的后端是接口地址
location /api/ {
# 配置后端服务端口
proxy_pass http://localhost:2019;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 图片服务器配置,配置完后,通过域名/images/访问
location ^~ /images/ {
# 设置图片服务器文件夹位置,我这里设置的是根目录下的images文件夹
alias /web/images/;
index index.htm index.html;
# 开启目录浏览,用于访问图片目录
autoindex on;
# 设置缓存时间为10天,我没用,用的话自己把#去掉就行
# expires 10d;
# add_header Cache-Control max-age=3600000;
}
# 设置图片缓存 30天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
# root /web/images/;
expires 30d;
}
}
缓存设置
- Cache-Control: 设置相对过期时间, max-age指明以秒为单位的缓存时间. 若对静态资源只缓存一次, 可以设置max-age的值为315360000000 (一万年).
比如对于提交的订单,为了防止浏览器回退重新提交,可以使用Cache-Control之no-store绝对禁止缓存,即便浏览器回退依然请求的是服务器,进而判断订单的状态给出相应的提示信息!
Http协议的cache-control的常见取值及其组合释义:
- no-cache: 数据内容不能被缓存, 每次请求都重新访问服务器, 若有max-age, 则缓存期间不访问服务器.
- no-store: 不仅不能缓存, 连暂存也不可以(即: 临时文件夹中不能暂存该资源).
- private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有max-age, 则缓存期间不访问服务器.
- public: 可以被任何缓存区缓存, 如: 浏览器、服务器、代理服务器等.
- max-age: 相对过期时间, 即以秒为单位的缓存时间.
- no-cache, private: 打开新窗口时候重新访问服务器, 若设置max-age, 则缓存期间不访问服务器.
- private, 正数的max-age: 后退时候不会访问服务器.
- no-cache, 正数的max-age: 后退时会访问服务器
- Expires: 设置以分钟为单位的绝对过期时间, 优先级比Cache-Control低, 同时设置Expires和Cache-Control则后者生效. 也就是说要注意一点: Cache-Control的优先级高于Expires
expires起到控制页面缓存的作用,合理配置expires可以减少很多服务器的请求, expires的配置可以在http段中或者server段中或者location段中. 比如控制图片等过期时间为30天, 可以配置如下:
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
root /var/www/img/;
expires 30d;
}
再比如:
location ~ \.(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$ {
root /var/www/upload/;
expires max;
}
- Last-Modified:
该资源的最后修改时间, 在浏览器下一次请求资源时, 浏览器将先发送一个请求到服务器上, 并附上If-Unmodified-Since头来说明浏览器所缓存资源的最后修改时间, 如果服务器发现没有修改, 则直接返回304(Not Modified)回应信息给浏览器(内容很少), 如果服务器对比时间发现修改了, 则照常返回所请求的资源.
跨域配置属性解释

增加安全性配置
加强 HTTPS 安全性, 如果是个人小站,一般也用不到
HTTPS 基础配置采取的默认加密算法是 SHA-1,这个算法非常脆弱,安全性在逐年降低,在 2014 年的时候, Google 官方博客就宣布在 Chrome 浏览器中逐渐降低 SHA-1 证书的安全指示,会从 2015 年起使用 SHA-2 签名的证书
为此,主流的 HTTPS 配置方案应该避免 SHA-1,可以使用 迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)方案。
首先在目录 /etc/ssl/certs 运行以下代码生成 dhparam.pem 文件:
openssl dhparam -out dhparam.pem 2048
然后加入 Nginx 配置
#优先采取服务器算法
ssl_prefer_server_ciphers on;
#使用DH文件
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#定义算法
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
如果服务器夠強大,可以使用更为复杂的 4096 位进行加密。
配置请求转发

参考资料
Nginx反向代理中使用proxy_redirect重定向url
Nginx反向代理中proxy_set_header参数说明