存档

文章标签 ‘nginx’

nginx限制某个IP同一时间段的访问次数

2015年8月3日 没有评论

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。

cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。

HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。

HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令

这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制。

1 HttpLimitReqModul 限制某一段时间内同一ip访问数实例
2 HttpLimitZoneModule 限制并发连接数实例
3 nginx白名单设置

HttpLimitReqModul 限制某一段时间内同一ip访问数实例
http{

#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为20个,
#1M能存储16000个状态,rete的值必须为整数,
#如果限制两秒钟一个请求,可以设置成30r/m

limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;

server{

location {

#限制每ip每秒不超过20个请求,漏桶数burst为5
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
#第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#第1秒25个请求时,5个请求放到第2秒执行,
#设置nodelay,25个请求将在第1秒执行。

limit_req zone=allips burst=5 nodelay;

}

}

}

HttpLimitZoneModule 限制并发连接数实例
limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域

http{

#定义一个名为one的limit_zone,大小10M内存来存储session,
#以$binary_remote_addr 为key
#nginx 1.18以后用limit_conn_zone替换了limit_conn
#且只能放在http作用域
limit_conn_zone one $binary_remote_addr 10m;

server{

location {

limit_conn one 20; #连接数限制

#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
limit_rate 500k;


}

}

}

nginx白名单设置
以上配置会对所有的ip都进行限制,有些时候我们不希望对搜索引擎的蜘蛛或者自己测试ip进行限制,
对于特定的白名单ip我们可以借助geo指令实现。
1.

http{
geo $limited{
default 1;
#google
64.233.160.0/19 0;
65.52.0.0/14 0;
66.102.0.0/20 0;
66.249.64.0/19 0;
72.14.192.0/18 0;
74.125.0.0/16 0;
209.85.128.0/17 0;
216.239.32.0/19 0;
#M$
64.4.0.0/18 0;
157.60.0.0/16 0;
157.54.0.0/15 0;
157.56.0.0/14 0;
207.46.0.0/16 0;
207.68.192.0/20 0;
207.68.128.0/18 0;
#yahoo
8.12.144.0/24 0;
66.196.64.0/18 0;
66.228.160.0/19 0;
67.195.0.0/16 0;
74.6.0.0/16 0;
68.142.192.0/18 0;
72.30.0.0/16 0;
209.191.64.0/18 0;
#My IPs
127.0.0.1/32 0;
123.456.0.0/28 0; #example for your server CIDR
}
geo指令定义了一个白名单$limited变量,默认值为1,如果客户端ip在上面的范围内,$limited的值为0

2.使用map指令映射搜索引擎客户端的ip为空串,如果不是搜索引擎就显示本身真是的ip,这样搜索引擎ip就不能存到limit_req_zone内存session中,所以不会限制搜索引擎的ip访问

map $limited $limit {
1 $binary_remote_addr;
0 “”;
}

3.设置limit_req_zone和limit_req
limit_req_zone $limit zone=foo:1m rate=10r/m;

limit_req zone=foo burst=5;

最后我们使用ab压php-fpm的方式,对上面的方法效果实际测试下

例1:限制只允许一分钟内只允许一个ip访问60次配置,也就是平均每秒1次
首先我们准备一个php脚本放在根目录下$document_root
test.php

nginx配置增加limit_req_zone 和 limit_req

http{

limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;

server{

location {

limit_req zone=allips;

}

}

}
ab -n 5 -c 1 http://www.weizhang.org/test.php

118.144.94.193 – - [22/Dec/2012:06:27:06 +0000] “GET /test.php HTTP/1.0″ 200 11000 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:06:27:06 +0000] “GET /test.php HTTP/1.0″ 503 537 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:06:27:07 +0000] “GET /test.php HTTP/1.0″ 503 537 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:06:27:07 +0000] “GET /test.php HTTP/1.0″ 503 537 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:06:27:07 +0000] “GET /test.php HTTP/1.0″ 503 537 “-” “ApacheBench/2.3″

未设置brust和nodelay可以看到该配置只允许每秒访问1次,超出的请求返回503错误

http{

limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;

server{

location {

limit_req zone=allips burst=1 nodelay;

}

}

}
ab -n 5 -c 1 http://www.weizhang.org/test.php

118.144.94.193 – - [22/Dec/2012:07:01:00 +0000] “GET /test.php HTTP/1.0″ 200 11000 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:07:01:00 +0000] “GET /test.php HTTP/1.0″ 200 11000 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:07:01:01 +0000] “GET /test.php HTTP/1.0″ 503 537 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:07:01:01 +0000] “GET /test.php HTTP/1.0″ 503 537 “-” “ApacheBench/2.3″
118.144.94.193 – - [22/Dec/2012:07:01:01 +0000] “GET /test.php HTTP/1.0″ 503 537 “-” “ApacheBench/2.3″

设置brust=1和nodelay后允许第1秒处理两个请求。

Nginx配置性能优化及参数说明(转)

2015年8月2日 没有评论

大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了。而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能很好地工作了。然而,如果你真的想挤压出Nginx的性能,你必须更深入一些。在本指南中,我将解释Nginx的那些设置可以微调,以优化处理大量客户端时的性能。需要注意一点,这不是一个全面的微调指南。这是一个简单的预览——那些可以通过微调来提高性能设置的概述。你的情况可能不同。

基本的 (优化过的)配置

我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置。你应该能够在服务器的/etc/nginx目录中找到nginx.conf。首先,我们将谈论一些全局设置,然后按文件中的模块挨个来,谈一下哪些设置能够让你在大量客户端访问时拥有良好的性能,为什么它们会提高性能。本文的结尾有一个完整的配置文件。

高层的配置

nginx.conf文件中,Nginx中有少数的几个高级配置在模块部分之上。

  1. user www-data;
  2. pid /var/run/nginx.pid;
  3. worker_processes auto; 
  4. worker_rlimit_nofile 100000; 

user和pid应该按默认设置 – 我们不会更改这些内容,因为更改与否没有什么不同。

worker_processes 定义了nginx对外提供web服务时的worker进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。

worker_rlimit_nofile 更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。

Events模块

events模块中包含nginx中所有处理连接的设置。

  1. events {
  2. worker_connections 2048; 
  3. multi_accept on;
  4. use epoll; 
  5. }

worker_connections 设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。

记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。

multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。

use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。

(值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)

HTTP 模块

HTTP模块控制着nginx http处理的所有核心特性。因为这里只有很少的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http模块中,甚至你不会特别的注意到这段设置。

  1. http {
  2. server_tokens off;
  3. sendfile on;
  4. tcp_nopush on;
  5. tcp_nodelay on;
  6. }

server_tokens  并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。

sendfile 可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。

tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。

tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送–当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。

  1. access_log off;
  2. error_log /var/log/nginx/error.log crit;

access_log 设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快(aka,YOLO)

error_log 告诉nginx只能记录严重的错误:

  1. keepalive_timeout 10;
  2. client_header_timeout 10;
  3. client_body_timeout 10;
  4. reset_timedout_connection on;
  5. send_timeout 10;

keepalive_timeout  给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长。

client_header_timeout 和client_body_timeout 设置请求头和请求体(各自)的超时时间。我们也可以把这个设置低些。

reset_timeout_connection 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。

send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。

  1. limit_conn_zone $binary_remote_addr zone=addr:5m;
  2. limit_conn addr 100;

limit_conn_zone 设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。

limit_conn 为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接。

  1. include /etc/nginx/mime.types;
  2. default_type text/html;
  3. charset UTF-8;

include 只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。

default_type 设置文件使用的默认的MIME-type。

charset 设置我们的头文件中的默认的字符集

  1. gzip on;
  2. gzip_disable ”msie6″;
  3. # gzip_static on;
  4. gzip_proxied any;
  5. gzip_min_length 1000;
  6. gzip_comp_level 4;
  7. gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。

gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。

gzip_static 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。

gzip_proxied 允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。

gzip_min_length 设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。

gzip_comp_level 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。

gzip_type 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。

  1. # cache informations about file descriptors, frequently accessed files
  2. # can boost performance, but you need to test those values
  3. open_file_cache max=100000 inactive=20s;
  4. open_file_cache_valid 30s;
  5. open_file_cache_min_uses 2;
  6. open_file_cache_errors on;
  7. ##
  8. # Virtual Host Configs
  9. # aka our settings for specific servers
  10. ##
  11. include /etc/nginx/conf.d/*.conf;
  12. include /etc/nginx/sites-enabled/*;

open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。

open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。

open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。

open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。

一个完整的配置

  1. user www-data;
  2. pid /var/run/nginx.pid;
  3. worker_processes auto;
  4. worker_rlimit_nofile 100000;
  5. events {
  6. worker_connections 2048;
  7. multi_accept on;
  8. use epoll;
  9. }
  10. http {
  11. server_tokens off;
  12. sendfile on;
  13. tcp_nopush on;
  14. tcp_nodelay on;
  15. access_log off;
  16. error_log /var/log/nginx/error.log crit;
  17. keepalive_timeout 10;
  18. client_header_timeout 10;
  19. client_body_timeout 10;
  20. reset_timedout_connection on;
  21. send_timeout 10;
  22. limit_conn_zone $binary_remote_addr zone=addr:5m;
  23. limit_conn addr 100;
  24. include /etc/nginx/mime.types;
  25. default_type text/html;
  26. charset UTF-8;
  27. gzip on;
  28. gzip_disable ”msie6″;
  29. gzip_proxied any;
  30. gzip_min_length 1000;
  31. gzip_comp_level 6;
  32. gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  33. open_file_cache max=100000 inactive=20s;
  34. open_file_cache_valid 30s;
  35. open_file_cache_min_uses 2;
  36. open_file_cache_errors on;
  37. include /etc/nginx/conf.d/*.conf;
  38. include /etc/nginx/sites-enabled/*;
  39. }

编辑完配置后,确认重启nginx使设置生效。

  1. sudo service nginx restart
分类: 软件使用 标签: , ,

大型BBS架构squid+nginx(测试过上几万人无优)

2015年7月20日 没有评论

写在前面,所有软件都需要跑在linux及相关操作系统下,千万不要用windows去跑。不然死的很难看。

设计这个架构基于Linux系统下squid、nginx和lvs等技术,从架构上对bbs进行全面优化和保护,其有如下几个特点:

1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。

2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。

3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。

如图所示:

这个架构的特点和一些流程的说明:

1、主域名和图片域名分离

域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。

2、使用LVS作为前端、二级代理和数据库的访问入口

使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第二,LVS的配置相对简单而且稳定,一般去调整的几率比较低,也减少了因人为等因素而出现故障;第 三,LVS可以处理任何端口的负载均衡,所以它基本可以做所有服务的负载均衡和容错。在这个架构中,除了处理http的80端口之外,LVS也处理了数据库mysql的3306端口,在数据库这个应用中是采用的双机热备策略。

3、使用nginx+squid作为最前端的缓存组合

在这个架构中,是最能体现app_nginx_squid_nginx架构的优势的。在这个架构中的bbs运行在缓存上,用户每发布一张帖子,都需要使用purge指令清除该帖子的缓存,如果是squid在最前端,那么每次发布一张帖子,都需要在所有的squid中调用purge指令,这样在机器比较多的时候,purge将成为一个巨大的压力。

所以在这里将nginx放在最前端并使用手工url_hash的方式分流,将经常需要purge的帖子页面和列表页面按一个url对应一台squid的策略,分布到各台squid上,并提供了一台或一组backup的squid,个别squid出现异常时将自动使用backup的机器继续提供一段时间的服务直到其正常。在这样的架构下,purge就不再是关键问题,因为一个url只会对应到一台机器上,所以purge的时候,后端app_server找到 对应的机器就可以了。

可以看到在前端中还有一台nginx(purge)的机器,这台机器是专用于purge的,只要发送purge指令和需要清除的url到这台机器,就可以 找到相应的服务器并清除缓存了。另外,purge时还需要清理backup机器上的缓存,所以无论前端机器增加到多少,purge指令只会在2台机器上执 行,如果backup机器使用到2-3台,purge指令就会在3-4台机器上执行,仍然在可接受范围之内。

使用nginx作为前端,另有的好处:

1.使用nginx的日志统计点击量非常方便
2.nginx也可作为缓存,一般可以直接负责favicon.ico和logo等固定的小图片
3.基于nginx的中层代理

nginx中层代理的优势,在:

nginx和squid配合搭建的web服务器前端系统

这篇文章中有解释——

在这个架构中,假如后端的app_server上把帖子页和列表页直接生成了静态页面,那么使用中层代理再做一次url_hash,将可以解决后端 app_server的硬盘容量的压力,但是如果使用到url_hash的话,那做容错就相对麻烦了。所以建议不要采用生成静态页的方式,后端的压力一般 不会非常的大,所以没有必要生成静态页。假如前端squid的命中率实在太低下,造成大量穿透,可以考虑使用二级代理暂顶。

5、基于LVS的数据库双机热备

在这个架构中,因为大量的并发和访问量都由前端的缓存处理掉了,所以后端的mysql主要压力来自于数据的写入,所以压力并不是非常大,并且负载比较稳定,一般不会随着访问量上升而提高过快,估计目前一台64位的机器,加满内存并使用高速的硬盘,前端负载数亿访问量时数据库都不会出现性能问题。在数据库 这方面应主要考虑故障恢复,因为数据库崩溃的话,按照一般使用备份恢复的做法,耗时很长而且难免丢失数据,是很棘手的问题。使用双机热备的方案,出现故障时首先可由一台时刻同步着的备用数据库即刻充当主数据库,然后卸下的数据库可以有充分的时间对其进行维修,所以是个很安全有效的办法。

当然,数据库的优化还是要细心做的还有很多,不细说,有时间建议参考:

mysql性能的检查和调优方法,如细心地调一遍,性能会好更多。

6、图片的服务器

图片的服务器我们在此架构中没有特别详细的介绍,我们在访问压力很大的大型的bbs系统下,图片常常会出现容灾现象——图片数量严重超过了单台前端服务器容纳能力,导致前端服务器命中率急速下降。变的处理容灾问题也是非常棘手的,往后有机会我们会有更详细的介绍。

7、简单的点击量统计办法

1.使用js的script标签访问另一(台)组服务器的空文件,然后定期向数据库更新。
2.在前端的nginx上直接开启日志功能,按需要统计点击量的链接规则进行记录,然后定期更新数据库。

分类: 解决方案 标签: ,

nginx访问域名自动加端口和nginx访问域名rewrite跳转

2014年12月31日 没有评论

需求:nginx规则,所有对OA.vps12.info的访问,redirect到uc.vps12.com
写法:
server
{
listen 80;
server_name uc.vps12.com;
index index.htm index.php;
root /export/home/www
if ($host = “oa.vps12.info”){
rewrite ^/(.*)$ http://uc.vps12.com/$1 permanent;
}
}

如何自动加端口呢?有时我们需要这样的需求:
server {
listen 80;
server_name bbs.vps12.com;
rewrite “^/(.*)$” http://bbs.vps12.com:8066/$1 break;
}

【符号注释】
^ 匹配字符串的开始
/ 匹配域名的分隔符
. 匹配除换行符以外的任意字符
* 重复零次或更多次
(.*) 匹配任意字符
.* 匹配任意文本
$ 匹配字符串的结束

分类: 解决方案 标签: ,

Nginx出现413 Request Entity Too Large错误解决方法

2013年12月16日 没有评论

今天使用Wordpress的flash版文件上传功能的时候,总是提示接口错误,很是郁闷。换小文件发现没有问题,所以问题肯定出现在文件大小上,找了半天没有发现wordpress有限制上传文件大小的地方。

切换到传统文件上传界面,重新上传一个大文件,这回出来错误提示了,413 Request Entity Too Large,google了一下,发现是Nginx的错误提示。

解决方法:

打开nginx主配置文件nginx.conf,找到http{}段,添加

client_max_body_size 20m;

Centos下 vi /usr/local/nginx/conf/nginx.conf

重启NGINX
kill -HUP `cat /usr/local/nginx/nginx.pid `
恢复正常

nginx列出目录及对目录进行密码保护

2013年7月1日 没有评论

1、如何让nginx列目录
在对应的网站配置段中,加入:

1
2
3
4
5
6
7
location /_files
{
    root /home/wwwroot;
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
}

解释一下:
root是指当前的网站根文件夹,例子中列出的根目录其实是/home/wwwroot/_files目录,如果不填则沿用上层的root配置;
autoindex是是否对该location匹配的目录在找不到索引文件(index.html、index.php等)时,列出目录,默认为off;
autoindex_exact_size是是否输出准确的大小,如果on则输出byte单位的大小,off则用GB、MB、KB来近似表示,默认为on;
autoindex_localtime是否以服务器时间输出文件时间,off则用GMT时间输出,默认为off。
参考:http://wiki.nginx.org/HttpAutoindexModule
2、对目录进行密码保护:
在对应目录的location中加入:

1
2
3
4
5
location /phpmyadmin
{
    auth_basic "Creke Server Auth";
    auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}

其中auth_basic是验证时显示的标题,auth_basic_user_file是对应的用户名密码,一行一个,与apache的“.htpasswd”一样。
参考:http://wiki.nginx.org/HttpAuthBasicModule
最后,给出一个使用perl生成htpasswd中认证用户名密码的脚本,方便生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
echo "====================================="
echo "# A tool like htpasswd for Nginx    #"
echo "#-----------------------------------#"
echo "# MOD BY Creke                      #"
echo "====================================="
 
#set UserName
 
username=""
read -p "Please input UserName:" username
if [ "$username" = "" ]; then
echo "Error:UserName can't be NULL!"
exit 1
fi
echo "==========================="
echo "UserName was: $username"
echo "==========================="
 
#set password
 
unpassword=""
read -p "Please input the Password:" unpassword
if [ "$unpassword" = "" ]; then
echo "Error:Password can't be NULL!"
exit 1
fi
echo "==========================="
echo "Password was: $unpassword"
echo "==========================="
password=$(perl -e 'print crypt($ARGV[0], "pwdsalt")' $unpassword)
 
echo "$username:$password"

nginx.conf配置文件详解

2013年4月1日 没有评论

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

以下是配置文件 nginx.conf 中文注释说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#使用哪个用户启动 nginx 前面是用户,后面是用户组
user www www;
 
#nginx工作的进程数量
worker_processes 2;
 
# [ debug | info | notice | warn | error | crit ] 日志的位置
error_log /var/htdocs/logs/nginx_error.log crit;
error_log /dev/null;
 
#进程号保存文件
pid /usr/local/nginx/nginx.pid;
 
#每个进程可以打开的最大文件字节数
worker_rlimit_nofile 51200;
 
events
{
# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
use epoll; #使用epoll(linux2.6的高性能方式)
worker_connections 51200; #每个进程最大连接数(最大连接=连接数x进程数)
}
 
http
{
#文件扩展名与文件类型映射表
include mime.types;
 
#默认文件类型
default_type application/octet-stream;
 
#日志文件格式
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
 
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
 
#默认编码
charset utf-8;
 
server_names_hash_bucket_size 128;
#开启高效文件传输模式
sendfile on;
#以下两个选项用于防止网络阻塞
 
tcp_nopush on;
tcp_nodelay on;
 
#长链接超时时间
keepalive_timeout 300;
 
#fastcgi连接超时时间,下面的看字面意思都能理解个大概了,就不解释了.
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_temp_path /dev/shm;
 
#打开gzip压缩
gzip on;
#最小压缩文件大小
gzip_min_length 1k;
#压缩缓冲区
gzip_buffers 4 8k;
#压缩版本(默认1.1,前端为squid2.5使用1.0)
gzip_http_version 1.1;
#压缩类型,默认就已经包含text/html 所以下面就不用再写了,当然写上去的话,也不会有问题,但是会有一个warn
gzip_types text/plain application/x-javascript text/css text/html text/javascript application/xml;
#错误页面
error_page 404 http://yhjhappy234.blog.163.com/;
error_page 403 http://yhjhappy234.blog.163.com/;
#上传文件大小限制
client_max_body_size 2m;
#设定请求缓
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
#设定负载均衡的服务器列表
#如果在同一台机器上,单独起4组独立的php-cgi进程(每组8个子进程),性能应该不如1组php-cgi进程(32个子进程),因为1组进程,eaccelerator的PHP二进制文件缓存是共享的,1组进程命中率较高。
#不过好处是,碰到某组的页面假死的话,其他端口就可以接管了,实测下来似乎发生502错误的概率降低了很多,或者说我这样配置以后还没有遇到
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
#本机上的Squid开启3128端口
server 192.168.101.26:8080 weight=5;
server 192.168.101.27:8080 weight=1;
server 192.168.101.202:8080 weight=1;
}
#下面开始虚拟主机的配置
server
{
listen 80;
server_name www.kedou.com;
index index.jsp;
root /usr/local/tomcat/webapps/ROOT;
if (-d $request_filename)
{
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}
#设定本虚拟主机的访问日志
access_log logs/www.kedou.com.access.log main;
 
location ~ .*\.php?$
{
include fcgi.conf;
fastcgi_pass 192.168.101.202:8080
fastcgi_index index.jsp;
}
#如果访问 /img/*, /js/*, /css/* 资源,则直接取本地文件,不通过squid
#如果这些文件较多,不推荐这种方式,因为通过squid的缓存效果更好
location ~ ^/(img|js|css)/ {
root /var/htdocs/kedou;
expires 24h;
}
 
#对 "/" 启用负载均衡
location / {
proxy_pass http://127.0.0.1;
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;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
 
proxy_temp_file_write_size 64k;
}
 
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
}
}

修改Nginx版本头信息(可选),编辑src/http/ngx_http_header_filter_module.c:

1
# vi +48 src/http/ngx_http_header_filter_module.c

找到下面两行:

1
2
static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

将其修改为:

1
2
static char ngx_http_server_string[] = "Server: Ninja Web Server" CRLF;
static char ngx_http_server_full_string[] = "Server: Ninja Web Server" CRLF;

保存并关闭文件。现在可以开始编译服务器了,将下面的配置代码添加到nginx.conf中,禁止在所有自动产生的错误页面中显示Nginx版本号:

1
server_tokens off

Nginx防盗链节省你的宽带

2012年6月25日 没有评论

根据网友文章,自己实践,介绍3种Nginx防盗链的方法,节省你的宽带
一:一般的防盗链如下:
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.ingnix.com ;
if ($invalid_referer) {
rewrite ^/ http://www.ingnix.com/retrun.html;
#return 404;
}
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行: 表示对www.ingnix.com这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到http://www.ingnix.com/retrun.html页面,当然直接返回404也是可以的。

ps: 以上有人说第二行的 none  要去掉。我本人试过none去掉也可以正常。具体还要大家多测试一下。
二:针对图片目录防止盗链
location /images/ {
alias /data/images/;
valid_referers none blocked server_names *.xok.la xok.la ;
if ($invalid_referer) {return 403;}
}
三:使用第三方模块ngx_http_accesskey_module实现Nginx防盗链
实现方法如下:

实现方法如下:
1. 下载NginxHttpAccessKeyModule模块文件:Nginx-accesskey-2.0.3.tar.gz
2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。编辑此文件:替换其中的”$HTTP_ACCESSKEY_MODULE”为”ngx_http_accesskey_module”;
3. 用一下参数重新编译nginx:
./configure --add-module=path/to/nginx-accesskey
4. 修改nginx的conf文件,添加以下几行:
location /download {
accesskey             on;
accesskey_hashmethod  md5;
accesskey_arg         "key";
accesskey_signature   "mypass$remote_addr";
}

其中:
accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。

访问测试脚本download.php:
<?
$ipkey= md5("mypass".$_SERVER['REMOTE_ADDR']);
$output_add_key="<a href=http://www.inginx.com/download/G3200507120520LM.rar?key=".$ipkey.">download_add_key</a><br />";
$output_org_url="<a href=http://www.inginx.com/download/G3200507120520LM.rar>download_org_path</a><br />";
echo $output_add_key;
echo $output_org_url;
?>

访问第一个download_add_key链接可以正常下载,第二个链接download_org_path会返回403 Forbidden错误。

参考:
NginxHttpAccessKeyModule