源自:www.nginx8.cn
下图对比了poll select epoll和kqueue的性能。select和poll是一个级别的,epoll和kqueue是一个级别的,相差不多。epoll用在linux上,kqueue用在bsd上,不能物理上共存。如果你的服务器cpu较好,linux内核新,可考虑用epoll.
Basically what this says is that FreeBSD's kqueue out-performs Linux's epoll by a bit.
select() and poll() are anachronisms.
As an aside, libevent rocks and I use it all the time for writing portable network code. It allows you to use the best available I/O multiplexing functionality on a given platform without having to write seperate code for all of them via a fairly coder-friendly API, and has a nice little async DNS library with it to boot.
Macro的某个机器(centos5.3,e7300)的nginx从默认的没有use设置改为use epoll后实际情况 load average: 0.14, 0.21, 0.26,负载似乎减少了0.1,可能并发请求量不大,暂时没看出有多大效果 :
Active connections: 2548 server accepts handled requests 35279765 35279765 59264847 Reading: 13 Writing: 16 Waiting: 2519
freebsd里的kqueue和linux 2.6下的epoll
两个东西极其相似,写好了一个之后,移到别外一个平台下,只要稍作修改就可以了,原理是一样,个人认为,从功能角度来盾kqueue比epoll灵活得多。在写kqueue的时候,内核帮你考虑好了不少东西。但是从效率来看,从我作的压力测试来看epoll比kqueue强。看看我的实验结果吧
客户端: linux ,P3,256M ,pthread多线程程序,开1万个线程,可是实际运行结果是,在linux2.4上只能打开4000多个线程的时候就报资源不足,郁闷了好久,不知道是什么资源,最大打开文件数是够了,内存也够(通过设置16k的栈空间)。后来把客户端移到linux2.6内核下,很快开出1万个线程来了。
epoll服务器端:P3,256M,在一万个并发线程下,面不改色,有条不紊地处理着数据,并发数能达到8000个连接。
kqueue 服务器端:结果比较失望,在只能一条队列的情况下,并发数只能到2000,然后在客户端的读取数据时就会出现"connect reset by peer"的错误。后来改用了两条队列,一条用来接收新连接,一条用来处理原有的连接。在这种情况下,并发数也只能到3000,然后又会陆陆续续出现连接的错误。
Nginx优化use参数epoll,kqueue,rtsig,eventport,poll和select的区别
参考:http://wiki.nginx.org/NginxOptimizations
Event ModelsNginx supports the following methods of treating the connections, which can be assigned by the use directive:
select - standard method. Compiled by default, if the current platform does not have a more effective method. You can enable or disable this module by using configuration parameters --with-select_module and --without-select_module.
poll - standard method. Compiled by default, if the current platform does not have a more effective method. You can enable or disable this module by using configuration parameters --with-poll_module and --without-poll_module.
kqueue - the effective method, used on FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 and MacOS X. With dual-processor machines running MacOS X using kqueue can lead to kernel panic.
epoll - the effective method, used on Linux 2.6+. In some distrubutions, like SuSE 8.2, there are patches for supporting epoll by kernel version 2.4.
rtsig - real time signals, the executable used on Linux 2.2.19+. By default no more than 1024 POSIX realtime (queued) signals can be outstanding in the entire system. This is insufficient for highly loaded servers; it's therefore necessary to increase the queue size by using the kernel parameter /proc/sys/kernel/rtsig-max However, starting with Linux 2.6.6-mm2, this parameter is no longer available, and for each process there is a separate queue of signals, the size of which is assigned by RLIMIT_SIGPENDING. When the queue becomes overcrowded, nginx discards it and begins processing connections using the poll method until the situation normalizes.
/dev/poll - the effective method, used on Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ and Tru64 UNIX 5.1A+.
eventport - the effective method, utilized in Solaris 10. To avoid kernel panic, it is necessary to install this security patch.
user www www;
worker_processes 4;
##开启4个进程,经我测试2足够,如果你服务器cpu资源很多,那么就分配为cpu的1倍或2倍
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid var/nginx.pid;
worker_rlimit_nofile 51200;
##指一个nginx进程打开的最大文件描述符个数,理论值应该和(ulimit -n )结果数值和nginx进程数值相除的结果一致,但实际中不可能有这样均匀,所以最好和ulimit -n 的值一致。
events {
use epoll;
##使用epoll的I/O模型
worker_connections 4096;
##每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes * worker_connections
}
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_max_size 512;
server_names_hash_bucket_size 128;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 1;
##keepalive超时时间
client_header_timeout 10;
client_body_timeout 10;
send_timeout 30;
client_header_buffer_size 4k;
##客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得
# open_file_cache max=51200 inactive=20s;
##这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存
# open_file_cache_valid 30s;
##这个是指多长时间检查一次缓存的有效信息
# open_file_cache_min_uses 1;
##open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
large_client_header_buffers 4 4k;
client_body_temp_path /dev/shm/nginx_temp/client_body 1 2;
######
##一般情况下压缩后的html、css、js、php、jhtml等文件,大小能降至原来的25%,也就是说,原本一个100k的html,压缩后只剩下25k。这无疑能节省很多带宽,也能降低服务器的负载。
######
gzip on; //打开gzip压缩
gzip_min_length 1024;
##设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取,默认值是0,不管页面多大都压缩,建议设置成1024,小于1k可能会越压越大
gzip_buffers 4 8k;
##设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
gzip_http_version 1.1;
##识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。注:现在除了类似于百度的蜘蛛之类的东西不支持自解压,99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。
gzip_comp_level 5;
##gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
##记录日志的格式,这里的main是自定义的,目的是在后边的vhosts/* 中用到
access_log "logs/access.log" main;
##规定记录日志的文件,格式为main格式(上边定义的)
include vhosts/*; //vhosts/目录下就是我们的虚拟主机配置文件了
}
在 Nginx 0.6.35 的版本中,配置多个 server 虚拟主机,必须要在配置文档中 http { 里头加上 server_names_hash_bucket_size 64; 这么一句
http {
server_names_hash_bucket_size 64;
include mime.types;
default_type application/octet-stream;
………….省略
}
不然不但 nginx 启动不了,而且 nginx -t 测试配置文档的时候会提示
could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
2009/02/20 13:54:27 [emerg] 11372#0: the configuration file /opt/nginx/conf/nginx.conf test failed
下面是在中文wiki上摘抄的一段说明
保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果 hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
#! /bin/bash
datedir=`date +%Y%m%d`
/bin/mkdir /home/logs/$datedir >/dev/null 2>&1
/bin/mv /home/logs/*.log /home/logs/$datedir
#/bin/kill -HUP `cat /var/run/nginx.pid`
有时候有这样的需求,当两个或多个域名都可以访问同一个站点,但是我们想当访问B域名时,使其自动跳转至A域名。其实nginx很容易实现这样的功能:
(以下资料来源于互联网)
nginx中进行301重定向(301 redirect)是非常容易的。比方说要将www.caipanzi.com永久性重定向至caipanzi.com,有两种方法
1.方法A
server {
server_name caipanzi.com www.caipanzi.com;
if ($host != 'caipanzi.com' ) {
rewrite ^/(.*)$ http://caipanzi.com/$1 permanent;
proxy_set_header Host "caipanzi.com";
}
}
2.方法B(为带www的域名单独设一条server规则)
server {
server_name www.caipanzi.com;
rewrite ^(.*) http://caipanzi.com$1 permanent;
}
一、Nginx安装
安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块。
Nginx安装方法:
./configure --user=username --group=groupname --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
二、生成证书
$ cd /usr/local/nginx/conf
$ openssl genrsa -des3 -out server.key 1024
$ openssl req -new -key server.key -out server.csr
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt三、修改Nginx配置:
server
{
listen 443;
server_name test.sina.com.cn;
ssl on;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
}
之前用Apache的时候,只需要设置
ErrorDocument 404 /404.php
就可以在 404.php 中根据不同的 REQUEST_URI 跳转到不同的页面去,让从搜索引擎过来的失效URL可以跳转到新的地址去
nginx 设置是这样的:
error_page 404 /404.php;
另外也可以通过rewrite规则实现
在 rewrite rule 的最后增加
if (!-e $request_filename) {
rewrite ^(.*)$ /404.php last;
}
关于*.php 文件的跳转请看这里。
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 main1 '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"'; //此日志格式为,ip不仅记录代理的ip还记录远程客户端真实IP。
location /NginxStatus {
stub_status on;
access_log on;
# auth_basic "NginxStatus";
# auth_basic_user_file conf/htpasswd; //查看时需要验证
}
注: 以上代码可以加在虚拟主机中的配置文件中
访问:http://域名/NginxStatus/
出处:http://shunz.net/2008/07/nginx_rewrite.html
Nginx以其良好的并发性能,目前正在逐渐取代Apache成为大家的Web server首选,但是Nginx目前的中文资料很少,需要大家努力贡献。
下面我介绍一下Nginx的Rewrite模块设置及Wordpress和Discuz的示例。Nginx的Rewrite规则比Apache的简单灵活多了,从下面介绍可见一斑。
首先,Nginx可以用if进行条件匹配,语法规则类似C,举例如下:
if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;}1、正则表达式匹配,其中:
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
2、文件及目录匹配,其中:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
如:
if (!-f $request_filename) {proxy_pass http://127.0.0.1;}其次,Nginx的Rewrite规则与Apache几乎完全一致,所不同的是最后的flag标记,举例如下:
rewrite ^/feed/$ http://feed.shunz.net last;
flag标记有:
last 相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则
break 与last类似
redirect 返回302临时重定向
permanent 返回301永久重定向
Wordpress的重定向规则:
if (!-e $request_filename) {rewrite ^/(index|atom|rsd)\.xml$ http://feed.shunz.net last;rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;rewrite ^ /index.php last;}
1 首先需要安装apache,可以使用yum install 安装
2 生成密码文件,创建用户
htpasswd -c /usr/local/nginx/conf/htpasswd test // 添加test用户,第一次添加时需要加-c参数,第二次添加时不需要-c参数
3 在nginx的配置文件中添加
location / {
root /data/www/wwwroot/count;
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
解决方法:打开nginx主配置文件nginx.conf,找到http{}段,添加
client_max_body_size 20m;
vim /usr/local/nginx/sbin/log.conf //写入以下内容
rotate 48
nocompress
/home/logs/access.log {
sharedscripts
create 0644 www www
postrotate
/bin/kill -USR1 `cat /usr/local/nginx/var/nginx.pid`
LDATE=`date +%Y%m%d%H --date="-1 hour"`
/bin/mv /home/logs/access.log.1 /home/logs/${LDATE}-access_log
endscript
}
不說廢話了 直接上傳了,第一章是介紹Nignx 和Nginx和其他web server性能對比的個人認為實用性不強就不上傳了,第13章是HTTP模塊 因為太大了 就不傳了,其實說白了,大家把前幾章搞懂了 就已經不錯了,如果有朋友需要第一章和第十三章的朋友可以留下email或者向我索取,我的email:
[email protected]
首先建立下面的配置文件放在nginx的conf目录下面,命名为deny.ip
cat deny.ip
deny 192.168.1.11;
deny 192.168.1.123;
deny 10.0.1.0/24;
在nginx的配置文件nginx.conf中加入:include deny.ip;
重启一下nginx的服务:/usr/local/nginx/sbin/nginx reload 就可以生效了。
deny.ip 的格式中也可以用deny all;
如果你想实现这样的应用,除了几个IP外,其他全部拒绝,
那需要你在deny.ip 中这样写
allow 1.1.1.1;
allow 1.1.1.2;
deny all;
- «
- 1
- ...
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- ...
- 63
- »