Nginx作为静态资源web服务
标签:Nginx

Nginx作为静态资源web服务

1. 静态资源

非服务器动态运行生成的文件

类型 种类
浏览器端渲染 HTML,CSS,JS
图片 JPEG,GIF,PNG
视频 FLV,MPEG
文件 TXT,等任意下载文件

CDN(内容分发网络)

Nginx作为CDN,先将静态资源存储从资源存储中心获取一份放在自己这里,用户以后可以直接去它那个获取静态资源。

2. 文件读取

基本语法:

Syntax: sendfile on|off;
Default:sendfile off;
Context:http,server,location,if in location

tcp-nopush:

Syntax:tcp_nopush on|off;
Default:tcp_nopush off;
Context:http,server,location

相当于把许多文件收集在一起后,一次性发出去,提高网络包的传输效率,对于大文件传输,建议开启。需要在sendfile开启的情况下,才能使用。

tcp_nodelay:

Syntax:tcp_nodelay on|off;
Default:tcp_nodelay on;
Context:http,server,location

keepalive连接下,提高网络包的传输实时性,在实时性要求高的环境下使用。

压缩:

Syntax:gzip on|off;
Default:gzip off;
Context:http,server,location,if in location

压缩传输

在Nginx服务端进行压缩,在客户端浏览器进行解压,减小了文件大小,提高了传输效率。

压缩比:

Syntax:gzip_comp_level level;
Dafault:gzip_comp_level 1;
Context:http,server,location

压缩比越大,压缩出来的文件越小,但压缩也会消耗服务器的性能,要综合考虑。

压缩版本:

Syntax:gzip_http_version 1.0|1.1
Default:gzip_http_version 1.1;
Context:http,server,location

现在主流的是1.1版本

扩展Nginx压缩模块

http_gzip_static_module 预读gzip功能

http_gunzip_module 应用支持gunzip的压缩方式,较少用到

测试:

[root@localhost conf.d]# cat static_server.conf 
server {
    listen       80;
    server_name 192.168.91.136;
    
    sendfile on;
    #charset koi8-r;
    access_log  /var/log/nginx/static_access.log  main;
    
    location ~ .*\.(jpg|gif|png)$ {
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        root  /opt/app/code/images;
    }

    location ~ .*\.(txt|xml)$ {
        gzip on;
        gzip_http_version 1.0;
        gzip_comp_level 1;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        root  /opt/app/code/doc;
    }

    location ~ ^/download {
        gzip_static on; # 下载压缩,之前要先用gzip命令对文件进行压缩,后面就可以直接通过浏览器输入文件地址进行下载了
        tcp_nopush on;
        root /opt/app/code;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504 404  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

:cry: 但是不知道为什么我的这个gzip开启压缩后,却还是175kb,查看

3. 浏览器缓存

3.1 缓存原理

第一次访问的时候,浏览器没有缓存,直接去请求服务器,最后响应并呈现给用户

第二次访问的时候,浏览器中已经有缓存了,会进行对内容的校验,看内容是否过期,如果过期在从web服务器获取,否者直接将缓存返回给用户得以呈现。

校验过期机制

校验过程

3.2 缓存设置

语法:

添加Cache-Control、Expires头

Syntax:expires [modified]time;
		expires epoch|max|off;
Default:expires off;
Context:http,server,location,if in location

测试:

location ~ .*\.(htm|html)$ {
	#expires 24h;
	root /opt/app/code;
}

在上述语法,即不开启缓存设置时,访问:

上面是第一次访问后得到的200 ok

上面是第二次访问,返回得到的304 Not Modified

如果去掉expires前面的注释:

location ~ .*\.(htm|html)$ {
	expires 24h;
	root /opt/app/code;
}

上面虽然也是304,但response返回了Cache-Control和expires头信息

虽然有这两个,但浏览器仍然会按照自己的Cache-Control来每次都重新去获取,这样可以保证和服务器端一致。

5. 跨站访问

当浏览器访问 www.a.com的时候会间接的访问www.b.com,浏览器一般会禁止这样的访问,处于安全考虑,容易出现CSRF跨站脚本攻击

跨站请求伪造,当用户访问A的时候,不小心点到了B,B返回一些带有恶意的response,再去请求A,由于A刚刚验证过用户,登录信息还未过期,这个时候B让用户去做一些非法的事。

语法:

Syntax: add_header name value [always];
Default:——
Context:http,server,location,if in location

具体配置语法:

location ~ .*\.(htm|html)$ {
	add_header Access-Control-Allow-Origin https://www.liuyaois.me;
	add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
	root /opt/app/code;
}

6.防盗链

目的:防止资源被盗用

主要要区别那些是非正常的用户请求

http_refer防盗链模块

	valid_referers none blocked 192.168.91.136;
	if ($invalid_referer){
		return 403;
	}

http_referer_module

  • 6 min read

CONTRIBUTORS


  • 6 min read