1.1下载模块:
memc-nginx-module
下载地址: https://github.com/agentzh/memc-nginx-module/downloads
srcache-nginx-module
下载地址: https://github.com/agentzh/srcache-nginx-module/downloads
ngx_http_upstream_keepalive
下载地址: http://mdounin.ru/hg/ngx_http_upstream_keepalive/
解压在Nginx安装目录的同级目录下。
接着添加google-perftools-module模块,用来优化高并发时的内存管理性能
先安装 libunwind
# wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.0.1.tar.gz
# CFLAGS=-fPIC ./configure --prefix=/usr
# make CFLAGS=-fPIC
# make CFLAGS=-fPIC install
再安装 google-perftools
#wget http://google-perftools.googlecode.com/files/google-perftools-1.9.1.tar.gz
# ./configure --prefix=/usr --enable-frame-pointers (32位可以不添加--enable-frame-pointers)
# make && make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# /sbin/ldconfig
1.2安装编译:
1.2.1.进入Nginx安装目录。先去掉Nginx的Debug功能,编辑auto/cc/gcc,找到
# debug
CFLAGS="$CFLAGS -g"
然后注释掉CFLAGS行,如下
# debug
#CFLAGS="$CFLAGS -g"
1.2.2.查看CPU型号
# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
如果是Intel,一般PC机是显示 Pentium(R) Dual-Core CPU E6500 @ 2.93GHz , 前面是Pentium.
如果是AMD, 一般就是opteron.
如果是服务器,一般是Core
具体的要在生产服务器中查找对应的CPU弄号参数
这个型号在接下来编译的时候指定给–with-cpu-opt参数
1.2.3.生成配置
# ./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--add-module=../memc-nginx-module \
--add-module=../srcache-nginx-module \
--add-module=../ngx_http_upstream_keepalive \
--user=nginx \
--group=nginx \
--with-cc-opt='-O3' \
--with-cpu-opt=Pentium \
--with-google_perftools_module
1.2.4.编译
1
# make && make install
1.3 配置:
worker_processes 2; # 多少个CPU内核就开多少个进程,处理客户连接由进程开启线程来处理。
worker_cpu_affinity 0001 0010; #每一位代表一个进程,按顺序,0001代表第一个CPU,0010代表第二个CPU.这里把2个进程分配给两个CPU处理。
pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc; #使用google_preftools模块
worker_rlimit_nofile 65535; #每一个进程能打开的最大文件数, ulimit -n 得到。设置一样大小,因为Nginx不是平均给多个进程分配,所以最好设置一样大小。
events {
use epoll; #使用 epoll处理Socket,是异步事件的通知机制,不是传统的轮询,增加性能。与windows的IOCP相拟.
worker_connections 15000; #每个进程最大连接数 ,客户端连接数max_clients = worker_processes * worker_connections,2个进程,要开到3W并发,所以,设置1.5W
}
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"';
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on; #如果使用了keepalive,那就很有必要打开这个选项,因为keepalive不会关闭连接,所以需要显式的调用tcp_push来将数据push出去,这个选项在sendfile on时生效。
tcp_nodelay on; #tcp_nodelay和tcp_nopush是互斥的。不过如果你同时设置了两个值的话,将会在第一个buf发送的时候,强制push数据,而第二个buf时,将会调用tcp_cork来打开nagle算法,也就是后面的都会应用tcp_nopush.
server_tokens off; #nginx版本号
keepalive_timeout 65;
gzip on; #开启或者关闭gzip模块
gzip_min_length 1k; #默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 8k; #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
gzip_comp_level 2; #gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)
gzip_types text/plain application/x-javascript text/css application/xml; # 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
gzip_vary on; #启用 "Vary: Accept-Encoding"
#Load config files from the ../conf.d directory
include ../conf.d/*.conf;
#Memcache Service upstream
upstream memcache{
server 10.66.6.59:11211; #memcached服务器地址
keepalive 512 single; #保持512个不立即关闭的连接
}
# Web Service upstream
upstream rubyd{ #ruby服务器端地址列表
server 10.66.1.226:3000 down; #down表示关闭,不参于负载
server 10.66.1.227:3000 weight=5; #权重值,
server 10.66.1.228:3000 weight=1 max_fails=3 fail_timeout 30s; #如果连接3次并且都超时30s,这个服务器将被视为失效,不再参于负载
server 10.66.1.229:3000 weight=1; #weight默认是1
}
# 上面的配置表示每7个用户连接,.227将处理5个请求,228,229都分配1个请求。
server {
listen 80;
server_name localhost;
#memc-nginx-module #memc模块配置, 我们配置为/memc,所有请求都通过请求这个location来操作 memcache
location /memc {
internal; #只接受内部访问,不接收外部http请求
memc_connect_timeout 100ms; #memc连接超时时长。
memc_send_timeout 100ms; #memc发送超时时长。
memc_read_timeout 100ms; #memc读取超时时长。
set $memc_key $query_string; #使用Nginx内置的$query_string来作为 key
set $memc_exptime 300; #缓存失效时间
memc_pass memcache; #memc访问的upstream为memcache
}
location / { #所有访问
#root html;
index index.html index.htm;
#srcache-nginx-module #srcache模块配置
set $key $uri$args; #设置key为网址加参数的值。
#下面两步是以location的逻辑条件来执行,GET与PUT的优先级来决定的。
srcache_fetch GET /memc $key; #从/memc中查询$key, 以$uri$args为key的数据,如果有则直接返回.
srcache_store PUT /memc $key; #如果上一步没有直接返回,则跳到这一步,如果返回的http状态码为200,则在输出前 以$uri$args为key,将输入结果存入memcache。
#proxy
proxy_pass http://rubyd; # 代理访问,指向名为 rubyd 的 upstream
proxy_set_header Host $host; #设置http头,转发端口域名给后端
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设置http头,转发X-Forwarded-For给后端
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
逻辑要点解释:
memc-nginx是一个标准的upstream模块,因此首先需要定义memcache的upstream。
这里我在本机上启动了一 个memcache服务,端口为默认的11211,keepalive指令是http-upsteram-keepalive-module提供的功能, 这里我们最大保持512个不立即关闭的连接用于提升性能。
下面是为memc-nginx-module配置location,我们配置为/memc,所有请求都通过请求这个location来操作 memcache.
memc-nginx-module存取memcache是基于http method语义的,使用http的GET方法表示get、PUT方法表示set、DELETE方法表示delete。
这里我们将/memc设为internal表示只接受内部访问,不接收外部http请求,这是为了安全考虑,当然如果需要通过http协议开放外部访问,可以去掉internal然后使用deny和allow指 令控制权限。比较重要的是$memc_key这个变量,它表示以什么作为key,这里我们直接使用Nginx内置的$query_string来作为 key,$memc_exptime表示缓存失效时间,以秒记。这里统一设为300(5分钟),在实际应用中可以根据具体情况为不同的内容设置不同的过期时间。
最后我们为“/”这个location配置了缓存,这表示所有的请求都会结果被缓存,当然这里只是示例需要,实际中一般不会这么配,而是为特定需要缓存的location配置缓存。 比如只缓存图片,js,css等资源文件。
srcache_fetch表示注册一个输入拦截处理器到location,这个配置将在location进入时被执行;
而 srcache_store表示注册一个输出拦截器到location,当location执行完成并输出时会被执行。
注意srcache模块实际可以与任何缓存模块进行配合使用,而不必一定是memc。这里我们以$uri$args作为缓存的key。
memc-nginx-module
下载地址: https://github.com/agentzh/memc-nginx-module/downloads
srcache-nginx-module
下载地址: https://github.com/agentzh/srcache-nginx-module/downloads
ngx_http_upstream_keepalive
下载地址: http://mdounin.ru/hg/ngx_http_upstream_keepalive/
解压在Nginx安装目录的同级目录下。
接着添加google-perftools-module模块,用来优化高并发时的内存管理性能
先安装 libunwind
# wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.0.1.tar.gz
# CFLAGS=-fPIC ./configure --prefix=/usr
# make CFLAGS=-fPIC
# make CFLAGS=-fPIC install
再安装 google-perftools
#wget http://google-perftools.googlecode.com/files/google-perftools-1.9.1.tar.gz
# ./configure --prefix=/usr --enable-frame-pointers (32位可以不添加--enable-frame-pointers)
# make && make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# /sbin/ldconfig
1.2安装编译:
1.2.1.进入Nginx安装目录。先去掉Nginx的Debug功能,编辑auto/cc/gcc,找到
# debug
CFLAGS="$CFLAGS -g"
然后注释掉CFLAGS行,如下
# debug
#CFLAGS="$CFLAGS -g"
1.2.2.查看CPU型号
# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
如果是Intel,一般PC机是显示 Pentium(R) Dual-Core CPU E6500 @ 2.93GHz , 前面是Pentium.
如果是AMD, 一般就是opteron.
如果是服务器,一般是Core
具体的要在生产服务器中查找对应的CPU弄号参数
这个型号在接下来编译的时候指定给–with-cpu-opt参数
1.2.3.生成配置
# ./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--add-module=../memc-nginx-module \
--add-module=../srcache-nginx-module \
--add-module=../ngx_http_upstream_keepalive \
--user=nginx \
--group=nginx \
--with-cc-opt='-O3' \
--with-cpu-opt=Pentium \
--with-google_perftools_module
1.2.4.编译
1
# make && make install
1.3 配置:
worker_processes 2; # 多少个CPU内核就开多少个进程,处理客户连接由进程开启线程来处理。
worker_cpu_affinity 0001 0010; #每一位代表一个进程,按顺序,0001代表第一个CPU,0010代表第二个CPU.这里把2个进程分配给两个CPU处理。
pid logs/nginx.pid;
google_perftools_profiles /tmp/tcmalloc; #使用google_preftools模块
worker_rlimit_nofile 65535; #每一个进程能打开的最大文件数, ulimit -n 得到。设置一样大小,因为Nginx不是平均给多个进程分配,所以最好设置一样大小。
events {
use epoll; #使用 epoll处理Socket,是异步事件的通知机制,不是传统的轮询,增加性能。与windows的IOCP相拟.
worker_connections 15000; #每个进程最大连接数 ,客户端连接数max_clients = worker_processes * worker_connections,2个进程,要开到3W并发,所以,设置1.5W
}
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"';
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on; #如果使用了keepalive,那就很有必要打开这个选项,因为keepalive不会关闭连接,所以需要显式的调用tcp_push来将数据push出去,这个选项在sendfile on时生效。
tcp_nodelay on; #tcp_nodelay和tcp_nopush是互斥的。不过如果你同时设置了两个值的话,将会在第一个buf发送的时候,强制push数据,而第二个buf时,将会调用tcp_cork来打开nagle算法,也就是后面的都会应用tcp_nopush.
server_tokens off; #nginx版本号
keepalive_timeout 65;
gzip on; #开启或者关闭gzip模块
gzip_min_length 1k; #默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 8k; #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
gzip_comp_level 2; #gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)
gzip_types text/plain application/x-javascript text/css application/xml; # 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
gzip_vary on; #启用 "Vary: Accept-Encoding"
#Load config files from the ../conf.d directory
include ../conf.d/*.conf;
#Memcache Service upstream
upstream memcache{
server 10.66.6.59:11211; #memcached服务器地址
keepalive 512 single; #保持512个不立即关闭的连接
}
# Web Service upstream
upstream rubyd{ #ruby服务器端地址列表
server 10.66.1.226:3000 down; #down表示关闭,不参于负载
server 10.66.1.227:3000 weight=5; #权重值,
server 10.66.1.228:3000 weight=1 max_fails=3 fail_timeout 30s; #如果连接3次并且都超时30s,这个服务器将被视为失效,不再参于负载
server 10.66.1.229:3000 weight=1; #weight默认是1
}
# 上面的配置表示每7个用户连接,.227将处理5个请求,228,229都分配1个请求。
server {
listen 80;
server_name localhost;
#memc-nginx-module #memc模块配置, 我们配置为/memc,所有请求都通过请求这个location来操作 memcache
location /memc {
internal; #只接受内部访问,不接收外部http请求
memc_connect_timeout 100ms; #memc连接超时时长。
memc_send_timeout 100ms; #memc发送超时时长。
memc_read_timeout 100ms; #memc读取超时时长。
set $memc_key $query_string; #使用Nginx内置的$query_string来作为 key
set $memc_exptime 300; #缓存失效时间
memc_pass memcache; #memc访问的upstream为memcache
}
location / { #所有访问
#root html;
index index.html index.htm;
#srcache-nginx-module #srcache模块配置
set $key $uri$args; #设置key为网址加参数的值。
#下面两步是以location的逻辑条件来执行,GET与PUT的优先级来决定的。
srcache_fetch GET /memc $key; #从/memc中查询$key, 以$uri$args为key的数据,如果有则直接返回.
srcache_store PUT /memc $key; #如果上一步没有直接返回,则跳到这一步,如果返回的http状态码为200,则在输出前 以$uri$args为key,将输入结果存入memcache。
#proxy
proxy_pass http://rubyd; # 代理访问,指向名为 rubyd 的 upstream
proxy_set_header Host $host; #设置http头,转发端口域名给后端
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设置http头,转发X-Forwarded-For给后端
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
逻辑要点解释:
memc-nginx是一个标准的upstream模块,因此首先需要定义memcache的upstream。
这里我在本机上启动了一 个memcache服务,端口为默认的11211,keepalive指令是http-upsteram-keepalive-module提供的功能, 这里我们最大保持512个不立即关闭的连接用于提升性能。
下面是为memc-nginx-module配置location,我们配置为/memc,所有请求都通过请求这个location来操作 memcache.
memc-nginx-module存取memcache是基于http method语义的,使用http的GET方法表示get、PUT方法表示set、DELETE方法表示delete。
这里我们将/memc设为internal表示只接受内部访问,不接收外部http请求,这是为了安全考虑,当然如果需要通过http协议开放外部访问,可以去掉internal然后使用deny和allow指 令控制权限。比较重要的是$memc_key这个变量,它表示以什么作为key,这里我们直接使用Nginx内置的$query_string来作为 key,$memc_exptime表示缓存失效时间,以秒记。这里统一设为300(5分钟),在实际应用中可以根据具体情况为不同的内容设置不同的过期时间。
最后我们为“/”这个location配置了缓存,这表示所有的请求都会结果被缓存,当然这里只是示例需要,实际中一般不会这么配,而是为特定需要缓存的location配置缓存。 比如只缓存图片,js,css等资源文件。
srcache_fetch表示注册一个输入拦截处理器到location,这个配置将在location进入时被执行;
而 srcache_store表示注册一个输出拦截器到location,当location执行完成并输出时会被执行。
注意srcache模块实际可以与任何缓存模块进行配合使用,而不必一定是memc。这里我们以$uri$args作为缓存的key。
经过上述配置后,相当于对Nginx增加了如下逻辑:当所请求的uri以“.php”结尾时,首先到memcache中查询有没有 以$uri$args为key的数据,如果有则直接返回;否则,执行location的逻辑,如果返回的http状态码为200,则在输出前 以$uri$args为key,将输入结果存入memcache。
本文转自:http://blog.hackroad.com/read.php/494.htm