设置缓存请求过期时间

web 开发中我们常常要用的 nginx 作为高性能的http和反代web服务器,有些时候我们需要对网站程序配置统一的默认缓存配置,这个时候我们就可以通过配置 nginx 设置缓存请求过期时间来实现。

设置nginx配置cache-control参数

浏览器如果在过期时间内发现新的文件,则不会使用缓存的数据,而是直接向 nginx 服务器请求新的数据。

  1. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html)$ {
  2. #禁止缓存,每次都从服务器请求
  3. #add_header Cache-Control no-store;
  4. #设置过期时间60秒,60秒过后向服务器重新请求数据
  5. #add_header Cache-Control max-age=60;
  6. }

配置完以上 nginx 配置后如果不生效,可以重新启动

设置nginx配置expires参数

使用 expires 参数优先级比 cache-control 参数要低,一旦配置 expires 则自动设置 cache-control 头标

  1. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html)?$ {
  2. #设置缓存过期时间两分钟
  3. expires 2m;
  4. # access_log off;
  5. }

语法:expires [time|epoch|max|off]
默认值:off

time:

  • 2s-两秒
  • 2m-两分钟
  • 2h-两小时
  • 2d-两天

使用 time 可以为正负数,负数表示 no-cache 正数或零表示 max-age=time

epoch:

不设置失效时间

需要注意的是,这两种缓存方式只能在用户不对浏览器强制刷新的情况下生效,如果用户通过url来进行访问,是可以访问到缓存的。

常用屏蔽规则配置

目前大部分网站大多使用了 nginx 作为 web 服务器 nginx 虽然非常强大,但默认情况下并不能阻挡恶意访问,我们可以通过一些常用的 nginx 规则配置来做一些简单常规的安全处理。

防止某些类型文件被下载

如果网站数据库导出到站点根目录进行备份,很有可能也会被别人下载,从而导致数据丢失的风险,以上规则可以防止一些常规文件被下载,可根据实际情况调整。

  1. location ~ \.(zip|rar|sql|bak|gz|7z)$ {
  2. return 444;
  3. }

屏蔽非常见蜘蛛爬虫配置

如果我们经常分析网站日志就会发现,一些奇怪的UA总是频繁的来访问网站,而这些UA对网站收录毫无意义,反而增加服务器压力,可以直接将其屏蔽掉禁止访问

  1. if ($http_user_agent ~* (SemrushBot|python|MJ12bot|AhrefsBot|AhrefsBot|hubspot|opensiteexplorer|leiki|webmeup)) {
  2. return 444;
  3. }
  4. # 如:User-Agent:Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)


禁止某个目录执行脚本配置

我们可以通过以上配置禁止目录内有效脚本执行,比如网站上传目录,通常存放的都是静态文件,如果因程序验证不严谨被上传木马程序,导致网站被黑,以上规则请根据自身情况改为您自己的目录,需要禁止的脚本后缀也可以自行添加。

  1. #uploads|runtime|templets 这些目录禁止执行PHP
  2. location ~* ^/(uploads|runtime|templets)/.*.(php|php5|php7)$ {
  3. return 444;
  4. }

注意:一定要放在 location ~ .php$ 之前否则不生效

屏蔽指定ip或ip段配置

如果网站被恶意灌水或cc攻击,可从网站日志中分析特征ip,将其ip或ip段进行屏蔽,通过配置以上配置我们可以过滤恶意的国外ip。

  1. #屏蔽192.168.1.1这个IP
  2. deny 192.168.1.1;
  3. #屏蔽192.168.2.* 这个段
  4. deny 192.168.2.0/24;
  5. #屏蔽所有
  6. deny all;
  7. #允许192.168.0.1这个IP
  8. allow 192.168.0.1;

配置规则注意事项

如无特殊注明,以上的命令均添加到 server 段内,修改 nginx 配置之前务必做好备份,修改完毕后需要重载一次 nginx 否则不会生效。

使用Lua作为脚本扩展模块

借助于 lua-nginx-module 我们可以将 lua 作为 nginx 的扩展脚本模块实现更高级的功能

安装luajit和lua-nginx-module

https://blog.csdn.net/zhaoydzhaoyd/article/details/107916968

直接输出content

  • content_by_lua
    1. location /lua1 {
    2. default_type 'text/html';
    3. content_by_lua "ngx.say('hello my lua1')";
    4. charset utf-8;
    5. }

文件方式处理输出content

  • content_by_lua_file ```nginx

location /lua { default_type ‘text/html’; content_by_lua_file conf/lua/hello.lua; #相对于nginx安装目录 charset utf-8; }

  1. <a name="SSjPf"></a>
  2. ### 异步记录日志例子
  3. - log_by_lua_file
  4. ```nginx
  5. location ~ {
  6. log_by_lua_file conf/lua/log.lua; #相对于nginx安装目录
  7. }
  • log.lua ```nginx local method = ngx.var.request_method; local headers = ngx.req.get_headers();

function writefile(filename, info) local wfile=io.open(filename, “a+”) assert(wfile) wfile:write(info) wfile:close() end

local log_text =”method:”..method..”\r\n”;

for k, v in pairs(headers) do log_text=log_text..k .. “:” .. v..”\r\n”; end

writefile(“/www/server/nginx/conf/lua/lua_test.log”,log_text); ```

nginx模块指令

日志处理器
  • log_by_lua
  • log_by_lua_file

    设置nginx变量,可以实现复杂的复制逻辑
  • set_by_lua

  • set_by_lua_file

    请求访问阶段处理,用于访问控制
  • access_by_lua

  • access_by_lua_file

    内容处理器,接收请求处理并输出响应
  • content_by_lua

  • content_by_lua_file

    lua api

  • ngx.var nginx变量

  • ngx.req.get_headers 获取请求头
  • ngx.req.get_uri_args 获取URL请求参数
  • ngx.redirect 重定向
  • ngx.print 输出响应内容体
  • ngx.say 同ngx.print,但是会在最后输出一个换行符
  • ngx.header 输出响应头

参考文档
https://www.runoob.com/lua/lua-tutorial.html
https://www.kancloud.cn/qq13867685/openresty-api-cn/159139