软件技术学习笔记

个人博客,记录软件技术与程序员的点点滴滴。

Nginx Log前端上报的错误

使用Nginx搭建前端静态资源服务时,有时想在服务端收集一些前端的严重错误。如果不想搭建或引用其它服务来处理上报的错误日志,可以将简要的错误信息放到HTTP Header中,然后使用Nginx的 $http_xxx 变量打印到 access_log 中。在没有新增其它Nginx模块时,Nginx是无法直接访问HTTP Body中的内容,但是Header中内容可以直接访问。

Nginx配置:

log_format  reportError escape=none  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '"$http_fe_href" "$http_fe_error"';

server {
    location = /api/reportError {
        # Methods Limit
        limit_except POST {
          deny all;
        }

        expires epoch;

        ### Log the error
        access_log  /var/log/nginx/access.log  reportError;
        return 200;
    }
}
继续阅读→

Nginx同时开启IPv4与IPv6

Vultr VPS支持IPv6地址,于是想让Nginx也提供HTTPS IPv6服务。

  1. 准备:VPS添加IPv6地址,重启服务器。

  2. 更新自己的DNS域名解析:添加AAAA地址记录到新添加的IPv6地址。

  3. Nginx新增IPv6地址Listen,并重启Nginx:

    # HTTP
    listen 80 default_server;
    listen [::]:80 default_server;
    
    # HTTPS
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    
  4. ip6tables添加80与443端口。在/etc/iptables/rules.v6文件中添加:

    # Nginx HTTPS
    -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
    
  5. 更新Vultr防火墙,见https://my.vultr.com/firewall/,在防火墙规则的Inbound IPv6 Rules中放行80与443端口。

继续阅读→

Nginx中配置Cache-Control

Nginx默认配置只给文件生成ETag,没有添加Cache-Control相关的控制,造成Chrome浏览器默认当作永久缓存(除了在地址栏输入URL跳转时,才重新使用ETag校验)。

单页面应用网站的静态资源长期缓存策略:

  1. 主页index.html每次使用ETag校验。
  2. 其余资源(CSS/JS/Images等),根据其内容取HASH值提供唯一的URL路径。

但是,静态Blog网站一般都是很多个页面,且一篇Blog需确保URL地址不变,所以,需要使用不同的缓存控制策略。

继续阅读→