Nginx是由俄罗斯软件工程师IgorSysoev开发的一个高性能的HTTP和反向代理服务器,具备IMAP/POP3和SMTP服务器功能。Nginx最大的特点是对高并发的支持和高效的负载均衡,在高并发的需求场景下,是Apache服务器不错的替代品。目前,包括新浪、腾讯等知名网站已经
Nginx是由俄罗斯软件工程师IgorSysoev开发的一个高性能的HTTP和
反向代理服务器,具备IMAP/POP3和SMTP服务器功能。Nginx最大的特点是对高并发的支持和高效的
负载均衡,在高并发的需求场景下,是Apache服务器不错的替代品。目前,包括新浪、腾讯等知名网站已经开始使用Nginx作为Web应用服务器。
Nginx配置一个神奇的Web服务器,我们在使用的时候有不少需要注意的,接下来我们就看看如何才能简单明了的进行Nginx服务器的配置。
#运行用户
user nobody nobody;
#启动进程,根据硬件调整,大于等于cpu核数
worker_processes 2;
#指定进程可以打开的最大描述符
worker_rlimit_nofile 204800;
这个指令是指当一个
nginx进程打开的最多文件描述符数目,理论值应该是最多打开文 件数(ulimit
-n)与
nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。 现在在linux
2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回
502错误。
#全局错误日志[debug|info|notice|warn|error|crit]及PID文档位置
error_log logs/error.log notice;
pid logs/Nginx.pid;
events {
use epoll;
#使用epoll的I/O 模型
补充说明: 与apache相类,nginx针对不同的操作系统,有不同的事件模型
A)标准事件模型
Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
B)高效事件模型
Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS
X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
Epoll:使用于Linux内核2.6版本及以后的系统。
/dev/poll:使用于Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX
6.5.15+ 和 Tru64 UNIX 5.1A+。
Eventport:使用于Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装安全补丁
worker_connections 1024;
#工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行
每个进程允许的最多连接数,
理论上每台nginx服务器的最大连接数为worker_processes*worker_connections
}
#设定http服务器,利用他的反向代理功能提供负载均衡支持
http {
#设定mime类型
include conf/mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local]
'
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user
[$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_s ent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址;
#设定请求缓冲
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
#关闭报错时的Nginx版本显示
server_tokens off;
sendfile on; #打开系统函数sendfile()支持
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 65;
#上述四项可以有效提高文件传输性能
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#设置上述数值设置太小时若负载上来时可能报 502 Bad Gateway
#开启gzip模块
gzip on;
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0;
#压缩版本(默认1.1,前端为squid2.5使用1.0
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-Javascript text/css
application/xml;
#压缩类型,默认就已经包含text/html 所以下面就不用再写了,当然写上去的话,也不会有问题,但是会有一个warn
gzip_vary on;
#此选项可让前端的缓存服务,如squid缓存经过nginx压缩的数据
#该选项在做反向代理时设定压缩,后面参数为验证的header头信息,再做相应的压缩处理,关闭为off
#gzip_proxied expired no-cache no-store private
no_last_modified no_etag auth any
#设定access log
access_log logs/access.log main;
client_header_timeout 3m;
client_body_timeout 3m;
#设定负载均衡的服务器列表
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
#本机上的Squid开启3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
#设定虚拟主机
server {
listen 80; #配置监听端口
server_name 192.168.8.1 www.rekfan.com; #IP地址或者域名
,多域名用空格隔开
charset gb2312; #默认编码
index index.html index.htm index.php;
#默认访问文件,从前到后的顺序查找
#limit_conn connlimit 20; 限制一个IP只能最多只能发起20个连接,超过报 503
Service unavailable
#设定本虚拟主机的访问日志格式
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 logs/www.rekfan.com.access.log main;
#假如访问 /img/*, /js/*, /css/* 资源,则直接取本地文档,不通过squid
#假如这些文档较多,不推荐这种方式,因为通过squid的缓存效果更好
location ~ ^/(img|js|css)/ {
root /rekfan.com/Html;
access_log off; #不记录访问日志
expires 24h; #缓存过期时间
}
#对 "/" 启用负载均衡,location ~* .(mp3|exe)$ 对以“mp3或exe”结尾的地址进行负载均衡
location / {
#设置被代理服务器的端口或套接字,以及URL
proxy_pass http://mysvr;
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;
}
}
}
备注:conf/htpasswd 文档的内容用 apache 提供的 htpasswd 工具来产生即可!
查看 Nginx 运行状态 输入地址http://www.rekfan.com/NginxStatus/
。输入验证帐号密码,即可看到类似如下内容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324