nginx配置记录

190 阅读5分钟

配置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;
    }



}

缓存设置

  1. 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: 后退时会访问服务器
  1. 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;
      }
  1. 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 配置 HTTPS 服务器

Nginx反向代理中使用proxy_redirect重定向url

Nginx配置X-Forwarded-Proto

Nginx反向代理中proxy_set_header参数说明

Nginx下关于缓存控制字段cache-control的配置说明 - 运维小结

Nginx 入门教程