求教关于SEnginx的使用和科普知识

华兹格 发布于 2013/08/05 16:03
阅读 1K+
收藏 3

开源界出现了好产品,自然要一探究竟!还请 SEnginx的作者@InfoHunter 给我普及一下关于 SEnginx的知识:)

(1)HTTP Session模块,这个和我们开发常用的session概念是否一样?我在开发jsp-servlet的时候,会用到session,作为服务器和客户端维护关系的功能。SEnginx这里实用的session也是这个概念吗?Session API开发模块对我们java程序员来说如何使用?
(2)配置负载均衡,经常使用类似于Nginx作为第一层,后端配合Tomcat使用(原谅我是Java程序员,只问自己熟悉的)。Nginx负责处理静态资源,只有需要动态调用的时候才实用Tomcat,这个功能在SEnginx是如何做的?有没有配置示例?
(3)Robot Mitigation,是我最感兴趣的模块了,为了保护自己网络资源或者防止DDoS等网络威胁。那通过这一功能,我能解决:一个用户在一段时间内、连续访问同一类资源,而且间隔时间很短,我能武断的使用这个模块对此人的后续访问进行屏蔽吗?加入黑名单设置解禁时间为1小时。

另外,还想请您能写一些关于SEnginx在实际项目中的使用示例和解决方案。

再次感谢!



以下是问题补充:

@单人旅行:有关于senginx 的 naxsi的使用说明吗? (2013/12/18 16:37)
加载中
0
InfoHunter
InfoHunter

1) SEnginx中的session的作用是标识一条HTTP "连接"。标识一条TCP或UDP连接的方法是记录源|目的IP地址和端口号,这个方法对于HTTP协议而言并不适用。因为客户端浏览器的两次GET请求可能会使用两条不同的TCP连接,但对于HTTP协议而言这两次请求都属于一条连接。从这个角度而言,SEnginx的HTTP session与你所说的session在本质上是一致的。但是Session API本质上只是SEnginx中的一些函数,最初的目的就是给SEnginx本身的模块使用,用于存储一些“跨”HTTP请求的数据,你下面提到的Robot Mitigation,就是基于session API实现的。因此SEnginx的session模块并没有考虑过给web应用程序提供支持,所以如果你是想在web应用程序中标识出客户端和服务器之间的会话,我建议还是使用java框架提供的session支持,这样会简单很多。如果你是想给SEnginx开发某种安全模块,则可以使用SEnginx的session API.

2) 这个和标准的nginx一样,需要用location区分不同的请求,然后在不同的location中将请求发到不同的地方

举个例子:


server {
    # other directives
    # ... ...
    location /some_uri {
        root /opt/tomcat/webapps/;
        index index.html;
    }
		
    location /some_uri/rest {
        proxy_pass http://localhost:12345;
    }
}

假设你的动态内容的路径是以/some_uri/rest开头的,并且tomcat监听的是本地的12345端口,你就可以用上面的例子实现静动分离(静态走第一个location,rest API)。当然你也可以使用正则表达式对url进行精确过滤,但是那样的话会导致正则引擎的调用,性能稍差

3)这个分成两种情况,一个是用户直接使用某种无法解析javascript或者无法运行flash文件的工具狂get你的资源,这样的话你可以使用robot mitigation模块,效果就是请求根本不会到达真实web服务器(实际上是这种请求在SEnginx处根本不会被处理),并且此客户端会被加入到黑名单中阻断一段时间。但是如果攻击者的工具能运行javascript代码,那就不行。这个时候你只能使用nginx自己的限速模块来限制单个客户端的访问频率,nginx的rate_limit使用方法可以参考nginx的文档,我们后续也可以针对这块展开讨论。DDoS这种简单粗暴的攻击手段确实很令人头疼

例子的话我手头不多,给你一个我前段弄过的一个例子,这个网站开启了robot mitigation,然后实现了根据地理位置进行语言分发,以及反向代理,当然大部分都是原始nginx的配置

user  nobody;
worker_processes  1;

error_log  logs/error.log  notice;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    geoip_country /usr/local/nginx/GeoIP.dat;
    geoip_city /usr/local/nginx/GeoLiteCity.dat;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      ' - [$geoip_city, $geoip_city_country_name]';


    sendfile       on;
    tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    upstream backend {
        server 127.0.0.1:8086;
    }

    server {
        listen       80;
        server_name  somehost.com;

        access_log  logs/access.www.log  main;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        session_timeout 600;
        session on;

        location / {
            if ($geoip_country_code = CN) {
                rewrite ^/$ /cn break;
            }
            
            if ($geoip_country_code != CN) {
                rewrite ^/$ /en break;
            }
            
            robot_mitigation on;
            robot_mitigation_mode js;
            
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass   http://backend;
        }
    }
}



0
渔泯小镇
渔泯小镇
坐等解答。
0
InfoHunter
InfoHunter
有啥其他问题可以随时交流,包括你的一些需求都可以随时和我们说,我们需要了解用户的想法,这样可以帮助我们更好的完善SEnginx ,多谢~
InfoHunter
InfoHunter
回复 @hanzhankang : 多谢多谢
华兹格
华兹格
回复 @红薯 : 哈哈。。。谢谢提醒,给忘了。。失误失误。。
红薯
红薯
回复 @hanzhankang : 必须设置最佳答案啊:)
华兹格
华兹格
多谢,回答的好细致!我也准备试用一下,再次感谢!
0
benney
benney
也想有类似java框架的session管理功能,你们近期有考虑类似功能的实现吗?
返回顶部
顶部