/ 中存储网

Nginx服务器配置详细说明

2014-04-19 12:41:01 来源:itjs.cn
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