我的nginx锅炉片

我在日常工作中经常会用到的nginx配置片段。

Imagem de capa

很多情况下,我们不需要了解事物的详情,只要知道这样做有效就够了,这种情况下我们就会用到boilerplate,中文俗称『锅炉片』。所谓锅炉片,其实就是一大段代码,你也不用管为什么这样,你只需要在用到的时候拷来拷去就行了。当然,如果你愿意钻研,非要琢磨清楚这一大段代码当中到底包含了什么意思,你也可以学到不少东西,不过不求甚解的话,也没有人指责你。

gzip 压缩

        gzip on;
        gzip_min_length 1k;
        gzip_buffers 16 64k;
        gzip_http_version 1.1;
        gzip_comp_level 5;
        gzip_proxied any;
        gzip_types text/plain application/x-javascript application/javascript application/octet-stream text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/svg image/svg+xml;
        gzip_vary on;

好吧,别问我为什么,我也不知道为什么,但总之这样有效。

gzip虽然好,但是如果开了gzip之后,content_length会消失,导致用户在下载文件时看不到下载百分比,所以如果需要的话,可以把相关的content typegzip去掉以支持百分比,例如可以把上面的application/octet-stream去掉,以便用户在下载二进制文件例如exe以及apk时可以看到百分比。

另外这里的gzip是动态压缩,也就是说在内容生成的同时进行压缩,还有另外一个开关gzip_static,用来对静态文件进行压缩,但需要事先压缩,没有具体研究过。

expire header

        location ~* \.(css|js|gif|ico|jpg|png|svg|woff|ttf|eot|woff2)$ {
            expires 365d;
        }

这段代码相对好理解,给那些图片等文件加上一个一年的有效期。但有一点要注意:一定要把root /opt/html;放在location /外面,你要放在里面,你就等着404吧。

跨域

    location /somewhere/ {
        if ($request_method = OPTIONS) {
            add_header Access-Control-Allow-Origin "$http_origin";
            add_header Access-Control-Allow-Credentials "true";
            add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
            add_header Access-Control-Allow-Headers "sitessubid,Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since";
            add_header Content-Length 0;
            add_header Content-Type text/plain;
            return 200;
        }
        if ($request_method = POST) {
            add_header Access-Control-Allow-Origin "$http_origin";
            add_header Access-Control-Allow-Credentials "true";
        }
    }

OPTIONS请求加一堆乱七八糟的头部,给POST或者GET再加两个头部,然后就可以跨域了,具体原因不解释,安全责任自负

反向代理

location ~ \.(csv|json|jhtml|jsp|action|ac)$ {
     expires -1;
     proxy_pass http://application;
     proxy_set_header Host $host:$server_port;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

注意:proxy_set_header一定要加上$server_port,否则如果你的web服务器不用80端口的话,会出现Tomcat在重定向时自动定向到80端口的错误,我在这上面浪费了将近8个小时的时间才定位到这个错误。