Nginx是一个高性能的HTTP服务器和反向代理服务器,也是IMAP/POP3/SMTP 代理服务器。
作为HTTP服务器的基础功能: 1)处理静态文件,索引文件以及自动索引
2)反向代理加速(无缓存),简单的负载均衡和容错
3)FastCGI,简单的负载均衡和容错
4)模块化的结构
5)SSL 和 TLS SNI 支持
主要结构和扩展: 1)一个主进程和多个工作进程,工作进程运行于非特权用户
2)kqueue (FreeBSD4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 711/99+), select, 以及poll 支持
3)kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT,EV_EOF, 有效数据的数目,错误代码
4)sendfile (FreeBSD 3.1+),sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持
5)输入过滤(FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持
6)10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存
7)最小化的数据拷贝操作
选择nginx的理由: 1) 处理高连接并发效果很好。官方测试可以处理 50,000 个并发连接数(主要采用了epool和kqueue网络I/O模型)
2) 内存消耗少
3) 可作为负载均衡服务器
4) 配置简单,稳定性较高
反向代理(reverse proxy)以代理服务器来接受internet上的连接请求,将请求转发内部网络上的服务器,并将服务器上的结果返回给internet上请求连接的客户端,代理服务器表现得就像一个服务器。
普通的代理服务器不支持外部网络对内部网络的访问。当一个代理服务器(没有真实的数据)能够代理外部网络访问内部,成为反向代理服务。
安装环境: ubuntu-12.04
预先安装一些模块需要的第三方库:
apt-get install openssl
apt-get install libssl0.9.8
apt-get install libssl-dev
apt-get install libpcre3 libpcre3-dev
(gzip->zlib库 rewrite->pcre库 ssl->openssl库)
安装:tar zxvf nginx-1.0.2.tar.gz
cd nginx-1.0.2
./configure--user=www --group=www --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-1.2(第三方模块需要预先下载解压,用来除去指定的url缓存) --with-http_stub_status_module --with-http_ssl_module
make
make install(在root权限下)
配置文件(代理tomcat服务器):
user www www;//nginx的用户组和group组
worker_processes 2;#进程数,一般为cpu的2倍
error_log /usr/local/nginx/logs/nginx_jsp_error.logcrit;#错误日志文件
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;#打开文件上限
events {
use epoll;
worker_connections 65535;#每个进程处理最大连接数
}
http {
include mime.types;
default_type application/octet-stream;# 浏览器请求的文件媒体类型
charset UTF_8;
server_names_hash_bucket_size 128;# 指定服务器名称哈希表的桶大小。默认值根据CPU缓存
client_header_buffer_size 32k;#设置客户端请求的header头缓冲区大小。(大多数1KB够了)
large_client_header_buffers 432k;# 设置客户端请求的Header头缓冲区大小,默认4KB
client_max_body_size 10m;#允许接收客户端请求内容的最大值,即客户端请求Header头信息中设置的Content-Length最大值
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;# 允许或禁止使用套接字选项TCP_NODELAY,仅适用keep-alive
client_body_buffer_size 512k;# 客户端请求内容的缓冲区大小(默认网页大小的2倍) 请求内容大于缓冲区,整个请求内容或部分请求内容被写入临时文件
proxy_connect_timeout 600;#与后端服务器连接超时时间
proxy_read_timeout 600;# 后端被代理服务器读取应答内容的超时时间
proxy_send_timeout 600;# 代理服务器转发请求的超时时间
proxy_buffer_size 16k;# 从被代理服务器获取第一部分应答信息的缓冲区大小,保存用户的头信息供nginx进行规则处理
proxy_buffers 4 64k;#设置从被代理服务器读取应答信息的缓冲区数目和大小
proxy_busy_buffers_size 128k;#系统忙的时候可以申请更大缓冲区,一般*2
proxy_temp_file_write_size 128k;#写入proxy_temp_path临时目录数据大小。防止一个工作进程阻塞太久
gzip on;#压缩
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level2;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plainapplication/x-javascript text/css application/xml;
gzip_vary on;
proxy_temp_path /data0/proxy_temp_path;# 指定一个本地目录缓冲较大代理请求
proxy_cache_path /data0/proxy_cache_path levels=1:2keys_zone=cache_one:200m inactive=1d max_size=3g;# 设置缓存文件存放位置
upstream tomcat_server {#代理tomcat服务器
server 127.0.0.1:8080;
}
server {
listen 80;
server_name localhost;
index index.html index.htmindex.jsp default.jsp index.do default.do;
root /data0/www;//网页存放目录
if (-d $request_filename) {
rewrite ^/(.*)([^/])$http://$host/$1$2/ permanent;
}
location ~ ^/NginxStatus/ {//监测连接处理
stub_status on;
access_log off;#不写入日志
}
location ~ .*\.(jsp|jspx|do)?$ {#转发动态脚本到后端服务器
proxy_set_header Host $host;
proxy_set_headerX-Forwarded-For $remote_addr;
proxy_passhttp://tomcat_server;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {//本地缓存
proxy_cache cache_one;
proxy_cache_valid 300 304 12h;#不同HTTP状态码缓存存不同时间
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
proxy_cache_key$host$uri$is_args$args;#设置web缓存key值
proxy_set_header Host $host;
proxy_set_headerX-Forwarded-For $remote_addr;
proxy_passhttp://tomcat_server;
}
location ~ /purge(/.*){#清除url缓存
allow 127.0.0.1;
allow 192.168.0.0/16;
deny all;
proxy_cache_purge cache_one;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { #设置expires时间
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 1h;
}
log_format access '$remote_addr -$remote_user [$time_local] "$request" '
'$status$body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" ';
access_log /data0 /www/access.logaccess;
}
}
/usr/local/nginx/sbin/nginx–t /usr/local/nginx/conf/nginx.conf (配置文件测试)
/usr/local/nginx/sbin/nginx-c /usr/local/nginx/conf/nginx.conf (启动nginx)
/usr/local/nginx/sbin/nginx-s reload (重新启动)
kill-QUIT 主进程号 (终止nginx)
kill-HUP 主进程号 (平滑启动,重新加载配置文件)
1) 使用webbench -c 200 -t 30s http://localhost /examples/jsp/ //...压力测试
2) 在浏览器输入localhost/ NginxStatus/ 查看连接情况
active connections– 所有打开的连接,包括连接到后端服务器的。
server accepts handled requests – nginx已经接受并处理13109个连接,12953个请求reading – 正在读取的请求头。
writing – 正在读取的请求主体,正在处理的请求或者正在写入的应答。
waiting – keepalive连接数,等于active - (reading + writing)。
3) 使用netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'过滤后的连接数
4) 使用top查看负载
PS:参考资料:http://wiki.nginx.org/Chs 及互联网各种blog资源,搜索引擎
感谢网络,感谢搜索,感谢富有分享精神的人。