技术解析

我他么傻逼了, tengine/nginx 到底怎么配置,蛤?求纠错
0
2021-05-25 10:46:49
idczone

目前使用是正常的,但是我已经搞不清楚 location 到底是干啥的了
limit_req 写在外面,使用完全没有问题,所有页面都能限制
禁止指定 UA 及 UA 为空的访问的 if 却不能写外面,只能 /和 php 各写一个,如果只写 /那就只能首页限制,其他页面照样访问
nginx -t 没有报错
但是逻辑有没有问题?判断顺序对吗

server {
        listen       80;
        server_name www.tntsec.com;

    #设置只是用 https        
    #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    #记录日志,限制缓存为 1M
    access_log  /var/log/nginx/log/tntsec.log  main buffer=1m;
    #主目录
    root   /var/www/html/tntsec;
    #index
    index  index.php index.html index.htm;

    #系统负载控制
    sysguard on;
     sysguard_load load=10 action=/highloa国外服务器d.html;

    #限制并发,白名单
    limit_req_whitelist geo_var_name=white_ip geo_var_value=1;
    #限制并发
    limit_req zone=one burst=5 forbid_action=/nocc.html;
    limit_req zone=two forbid_action=/nocc.html;
    limit_req zone=three burst=5 forbid_action=/nocc.html; 

    #屏蔽指定 IP
    #deny 1.1.1.1;


    #伪静态
    if (!-e $request_filename) {
                 rewrite ^(.*)$ /index.php$1 last;
                         }


    location  / {
    #禁止指定 UA 及 UA 为空的访问
    if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {
    access_log off;
         return 403;            
    }

    #判断是不是使用代理访问,使用 CDN 请勿开启
    #if ($http_x_real_ip != $http_x_forwarded_for){
    #                access_log off;
    #                return 403;
    #            }

    #禁止非 GET|HEAD|POST 方式的抓取
    if ($request_method !~ ^(GET|HEAD|POST)$) {
    access_log off;
        return 403;
    }
    }

    location ~ .*\.(css|js|ico|png)(.*) {
                  expires 30d;
                 }
    #       error_page  404              /404.html;
    #       error_page 500 502 503 504 =    /500.html;




    location ~ ^/admin/ {
          deny all;
    }

    location ~ /(usr/uploads|usr/plugins/CommentToMail/cache|usr/plugins/Sitemap/sitemap|usr/plugins/CommentToMail/log)/.*\.(php|php5)?$
    {
    deny all;
    }

    location ~ .*\.php(\/.*)*$ {
    #fastcgi_pass 127.0.0.1:9000;
    #location ~ [^/]\.php(/|$) {
    if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {
    access_log off;
        return 403;
    }
    if ($request_method !~ ^(GET|HEAD|POST)$) {
    access_log off;
        return 403;
        }

            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            fastcgi_pass unix:/dev/shm/fpm-cgi.sock;
            #fastcgi_index index.php;
            fastcgi_param PATH_INFO $fastcgi_path_info; 
            fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/:/proc/";
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            }
    }

求姿势

有时间来伸手为什么不去看看 error log ?
还有,所有 if!e 都应该用 try_files 代替
认真读完文档,自己写一个出来不难
网上拼拼凑凑的模板真是害死人

还有限制 UA 没有任何卵用
对付搜索引擎用 robots
如果对方不遵守 robots ,又凭什么会怪怪写 UA 呢?

已经警告过你了,不要随便用 if 。
nginx 的 conf 不是程序,是申明性的配置文件,不是从上到下一句句执行的,不要把它当成是程序一样去理解。完全是两回事。
(特别是这种两个 if 混在一起的情况。多个 if 甚至可能直接造成 SIGSEGV

看博客是牛逼人物啊。为什么不问问神奇海螺呢?

既然 useragent 是一样的,可以先判断完后设置一个变量值,再判断变量值也行,不用写两遍。

这个可以有,这个是 typecho 官方文档里的写法,并没有在意,现在改成了
try_files $uri $uri/ /index.php;
限制 UA 这个其实本意是为了限制空 UA ,防不会加载 UA 的低级 CC

判断 UA 和进制其他方式访问的两个 if 能写到一起吗?

神奇海螺也不知道呢

这个好像没啥,用变量赋值感觉跟直接赋值一样,从效率上看都是加载同样的东西

你以为百度的都是对的吗::doge

不太清楚。用 if 是属于「非正常逻辑」,需要多试试多调教才行。

试了才知道,我不认为 V2EX 里都是对的,文档里对每个选项都讲得太过详细,百度的互相转载。但是真像就在里面

if 不是正常逻辑吗,判断是不是空 ua ,是就返回 403.判断是不是不常见的请求方式,是就是 403 ,其他 200

我可以向你保证,百度搜索的结果里是找不到真相的。真相只存在于源代码里,最接近真相的是官方英文文档,(伪官方)中文文档严重滞后。你嫌官方文档详细,我还嫌不够呢。连某个指令在哪个 phase 执行都不说。 V2EX 不全对,但质量绝对比百度高得多。
如果你觉得 if 就是普通的条件判断,那说明你 Nginx 不及格。 if 是 rewrite 模块内的指令,不是 Nginx 配置的语法结构。如果 if 和其他模块的配置配合,而你又不明白其内在机制的话,会有非常……呃……奇妙的效果。个人认为,学习 Nginx ,应该从 if is evil 开始 https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
你先看了这篇再说: http://www.aosabook.org/en/nginx.html

看着这么乱的代码排版,这么多的超长 if ,真是看不下去。

如果想要写简单的 WAF 逻辑的话,还是上 ngx_lua 吧。 Nginx 自己的 if 真心不靠谱。

mark

千万别用 if ,心中的痛

if 语句慎用。。

听说你被扒皮了

啊?啥

听说被扒皮了

啥扒皮。。

数据地带为您的网站提供全球顶级IDC资源