标签 Nginx 下的文章

Nginx负载均衡+监控状态检测

Nginx负载均衡+监控状态检测

想用Nginx或者Tengine替代LVS,即能做七层的负载均衡,又能做监控状态检测,一旦发现后面的realserver挂了就自动剔除,恢复后自动加入服务池里,可以用Tengine的ngx_http_upstream_check_module模块。该模块在Tengine-1.4.0版本以前没有默认开启,它可以在配置编译选项的时候开启:./configure --with-http_upstream_check_module。

Nginx.conf 配置

http {
    upstream fire_server{
    ip_hash;
    server 192.168.1.1:80;
    server 192.168.1.2:80;

    check interval=3000 rise=2 fall=5 timeout=1000 type=http ;
    check_http_send "GET /status.html HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx ;
    }

    server {
        listen       80;
        server_name  localhost default;

        location / {
            proxy_pass http://fire_server;
            access_log logs/fire_server_access.log main;
            error_log logs/error.log debug;
        }

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

- 阅读剩余部分 -

Nginx反向代理和php解析配置

Nginx纯反向代理配置

upstream  firefoxbug{
        ip_hash; 
        server 10.161.171.87:80;
        server 10.160.55.81;
        server 10.160.55.93;
}

server {
    server_name         www.firefoxbug.net firefoxbug.net;
    listen              80;
    gzip                on;


    error_log           /home/logs/www_firefoxbug_net_error.log error;
    access_log          /home/logs/www_firefoxbug_net_access.log;

    ## Bypass For All
    location / {
        proxy_redirect      off;
        proxy_pass          http://firefoxbug; 
        proxy_set_header Host   $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

- 阅读剩余部分 -

Nginx反代内容替换

Nginx做反向代理的时候因为流量都是从Nginx过,所以有时候会有需求修改页面,替换个元素,标签,logo等等。这个功能可以用ngx_http_subs_filter_module来解决。

具体的安装过程和普通的三方模块一样

- 阅读剩余部分 -

Nginx Cache中$request_filename

对于Nginx的$request_filename变量指的就是请求的资源路径。在原先OpenCDN节点端配置里面是这样的。

location ~ .*\.(png|html|htm|ico|jpg|jpeg|bmp|gif|js|css)$ {
        ## 忽略浏览器的缓存
        proxy_ignore_headers Cache-Control;
        proxy_ignore_headers Expires;

        proxy_cache cache_one;
        proxy_cache_valid 200 304 1h;

        proxy_cache_key $host$uri$is_args$args;
        expires 1h;
        ## 此处为host锁定,可定制有无
        proxy_set_header        Host    $host;

        add_header OpenCDN-Cache "$upstream_cache_status";

       if (!-f $request_filename) {
                proxy_pass http://ocdn_www.firefoxbug.net;
                break;
        }
}

- 阅读剩余部分 -

Nginx源码分析核心模块加载

装载请注明出处:http://www.firefoxbug.com/?p=2053

之前一篇Nginx源码分析模块加载大概描述了Nginx官方定义的6个核心模块,本文再详细介绍这几类模块的加载。这些核心模块都属于宏NGX_CORE_MODULE,对应的模块上下文配置结构体是 ngx_core_module_t。

typedef struct {
    ngx_str_t             name;                                         //模块名,即ngx_core_module_ctx结构体对象的
    void               *(*create_conf)(ngx_cycle_t *cycle);             //解析配置项,nginx框架会调用create_conf方法
    char               *(*init_conf)(ngx_cycle_t *cycle, void *conf);   //解析配置项完成后,nginx框架会调用init_conf方法
} ngx_core_module_t;

NGX_CORE_MODULE这6类核心模块都用ngx_core_module_t接口定义上下文。

- 阅读剩余部分 -

Nginx源码分析模块指令加载

上文写到了Nginx配置文件读取以及解析,本文介绍模块的指令加载。还是以前文的nginx_move_domain_cache为例

server {
        listen 80;
        server_name www.firefoxbug.net;
        gzip on;
 
        location /mv_cache{
                mv_cache;
        }
        ....
}

上面有一模块mv_cache,这个模块里面的指令是mv_cache,参数是0个。再比如server_name也是一个指令,参数是一个"www.firefoxbug.net"。调用前文的ngx_conf_parse读取配置文件,然后调用handler函数进行解析,对于普通的处理(普通指令),会调用ngx_conf_handler,这里再回顾下模块的指令数组定义结构

- 阅读剩余部分 -

Nginx源码分析模块加载

转载请注明出处:http://www.firefoxbug.com/?p=2030

前文说了Nginx里万物皆模块,今天描述下模块的加载,因为模块的加载是一个递归的过程,所以比较难以理解。

模块类型


Nginx官方定义了6种核心模块,定义宏声明是NGX_CORE_MODULE,分别是ngx_core_module,ngx_http_module,ngx_events_module,ngx_mail_module,ngx_errlog_module,ngx_openssl_module。这6种核心模块又可以定义自己全新的模块,比如ngx_events_module重新定义events类型为NGX_EVENT_MODULE,ngx_http_module定义http模块类型NGX_HTTP_MODULE。在上文叙述的ngx_command_s第二个字段就是指定这些模块类型。

- 阅读剩余部分 -

Nginx源码分析模块化

断断续续读了近半个多月Nginx的源码,感觉还是比较吃力,因为Nginx模块化的设计带来的是复杂的结构体以及回调函数,逻辑比较复杂。到现在也不知道改怎么写好Nginx源码分析这类博客,但是只能硬着头皮去写,希望写的过程中能出现各种疑问从而解决。目前还没完整地读完源码,按照Nginx执行顺序写还力不从心,所以先从如何编写三方模块开始。

在之前一篇文章写了一个Nginx删除域名Cache的三方模块 http://www.firefoxbug.com/?p=1985,Nginx源码分析就从这个模块进行分析。至于什么是模块?我们从Nginx的配置文件出发来解释。

- 阅读剩余部分 -

Nginx动态加载模块

参考 http://tengine.taobao.org/document/dso.html

Tengine支持了动态加载模块,个人感觉这使得Nginx这个优秀的设计更加完美,在开发三方模块的时候大大提高了效率。下面举例子如何加载一个三方的模块,加载前面的站点cache一键清除模块(http://www.firefoxbug.com/?p=1985)。

/usr/local/nginx/sbin/dso_tool模块已经把编译成动态库的参数都写好了,只需要调用这个工具就行,参数是源码路径,包含要configure文件。

/usr/local/nginx/sbin/dso_tool -a=/home/nginx_move_domain_cache
或者
/usr/local/nginx/sbin/dso_tool --add-module=/home/node/Tengine/nginx_move_domain_cache

这样会自动生成 ngx_http__module.so 动态库并且dso_tool工具会将其copy到/usr/local/nginx/modules,下面就是配置Nginx。
events {
        use epoll;
        worker_connections  51200;
}

dso {
        load ngx_http_move_domain_cache_module.so;
}

http {
      ....
}

这样就能动态的加载 .so 模块,dso也是一个main级的配置。

Nginx添加访客地理位置到日志(GeoIP模块)

之前项目里用Nginx吐出access日志,然后用awstats来统计分析,结果对于访客地理位置比较头痛,于是自己写了几个程序查找(纯真库和GeoIP查找的方法不一样),今天看Nginx源码时候发现了可以利用--with-http_geoip_module这个模块,然后指定变量到日志。具体会有瓶颈,下面看怎么实现。

GeoIP库安装

- 阅读剩余部分 -

Nginx一键清除域名下Cache

装载请注明出处:http://www.firefoxbug.com/?p=1985
在前面一篇文章 http://www.firefoxbug.com/?p=1861 已经介绍如何把站点缓存分域名存放。相比之前的purge一个个URL刷新,按照域名存放对于站点Cache一键刷新是很方便的。本文会介绍如何通过开发一个Nginx三方模块,一键刷新某个域名站点下缓存。 注意:在使用下面模块之前必须根据前文,站点Cache已经按照目录存储,目录在 /home/cache/下。比如 www.firefoxbug.net 的 Cache 是 /home/cache/www.firefoxbug.net/ ,通过模块能一键清除此目录cache。

- 阅读剩余部分 -

Nginx Cache按域名存放

From http://blog.meiu.cn/nginx-proxy_cache.html

在Nginx或者Tengine默认的cache都是按照一定的hash算法出来的,如果需要擦除某个域名下的全站cache,用purge只能通过遍历所有的url在实现,效率肯定是很低的。那么如果把cache按照域名存放那么清空起来就很快了。

修改 src/http/ngx_http_file_cache.c

在文件头声明函数部分加

- 阅读剩余部分 -

Nginx cache 命中率

location  / {
    proxy_redirect          off;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout   180;
    proxy_send_timeout      180;
    proxy_read_timeout      180;
    proxy_buffer_size       128k;
    proxy_buffers           4 128k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_cache cache;
    proxy_cache_valid 200 304 1h;
    proxy_cache_valid 404 1m;
    proxy_cache_key $uri$is_args$args;
    add_header  Nginx-Cache "$upstream_cache_status";
    proxy_pass http://backend;
}

- 阅读剩余部分 -

Nginx 全站缓存

location / {
        proxy_cache cache_one;
        proxy_cache_valid  200 304 1d; #Cache for 1Days
        proxy_cache_key $host$uri$is_args$args;
        proxy_redirect      off;
        proxy_pass          http://1.1.1.1;
        proxy_set_header Host   $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_ignore_headers Cache-Control;
        proxy_hide_header Cache-Control;
        proxy_ignore_headers Expires;
        proxy_hide_header Expires;
        proxy_hide_header Set-Cookie;
        proxy_ignore_headers Set-Cookie;
}

- 阅读剩余部分 -

Nginx 变量设置

Nginx 设置变量

set $variable "value"; set指令对于域有要求,必须在 server 域内,要想设置全局变量可以用 map 实现。

map "value" $variable{
default "value";
}

这样就可以引用 $variable 变量了。

Nginx 日志格式可以自己定义,你想加个什么字符串之类的,比如在  access 日志前面加个 access 字符

串标记:

log_format access 'access $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';

那么产生的日志前面就会加了“access”字符串,当然也可以加Nginx自定义的变量,比如 $host。

自建CDN防御DDoS(1):知己知彼,建设持久防线

from http://www.infoq.com/cn/articles/anti-ddos-cdn-1


背景介绍


客服系统的主要业务是提供基于网页的实时动态的文字聊天,主要应用在各类网络商品销售、网站在线客服等领域,总用户数58万,同时在线活跃的用户约12万/天。

这些应用领域通常行业之间的竞争比较激烈,其中包括在线下无法名正言顺的灰色+暴利产业,导致竞争对手之间经常发动DDoS恶意攻击。但营销网站往往是单面加速,加上推广时效性很强,很难被彻底打击,于是一些自作聪明的黑客通过攻击网站的在线客服系统,导致网站无法跟访客沟通,不能交易,从而达到恶意攻击的目的。因此客服系统这个原本有助于网站营销的工具反而成了被攻击的主要对象,虽然伤得委屈,但也不得不面对挑战。

我们遭遇的DDoS攻击类型包括:延缓性的CC攻击和致命的大流量攻击。下面将对两种攻击方式的攻击特点、防御思路和我们用过的一些防御方案进行简单的介绍。

- 阅读剩余部分 -

nginx与squid 反向代理的区别

反向代理从传输上可以区分为同步模式和异步模式,apache的mod_proxy和squid都属于同步模式,nginx和lighttpd属于异步模式

同步模式是用户发起请求,请求立即被转到后端的服务器,于是在浏览器和后端服务器之间就建立了一个连接,在请求完成前这个连接是一直存在的。

而异步模式时,用户发起的请求会发送到nginx,nginx接收到所有的数据后在转发到后端的服务器,后端服务器处理完成后把数据返回给nginx,nginx在返回给用户。

由此可见如果用户发起的请求的数据比较大,或者用户端的网速比较慢,同步模式时后端服务器的连接数相对于异步模式会比较多,压力也比较大。

Nginx的cache比较适合处理大文件的,而squid的cache比较适合小文件的cache