Nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯。 一、nginx的配置文件nginx.conf #Nginx所用用户和组 user nginx nginx; #工作进程数,一般与CPU核数一样 worker_processes 16; #全局错误日志存放路径以及日志类型[debug|info|notice|warn|error|crit] error_log /var/log/nginx/error.log warn; #指定pid存放文件 pid /var/run/nginx.pid; #工作模式与每隔工作进程连接数上限 events { #使用网络IO模型,在Linux下建议epoll #use epoll; #每个工作进程允许最大的连接数 worker_connections 1024; } #设定http服务器 http { #文件扩展名与文件类型映射表 include /etc/nginx/mime.types; #默认文件类型 default_type application/octet-stream; #默认编码 #charset utf-8; #定义日志格式 log_format main '$host - $http_x_forwarded_for - $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent $request_time "$http_referer" ' '"$http_user_agent"'; #设置访问日志存放路径 access_log /var/log/nginx/access.log main; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改 成off。 sendfile on; #防止网络阻塞 #tcp_nopush on; #长连接超时时间,单位是秒 keepalive_timeout 65; #gzip模块设置 #开启gzip压缩输出 gzip on; #最小压缩文件大小 gzip_min_length 1024; #压缩类型 gzip_types text/plain application/x-javascript text/css application/xml application/json; #include /etc/nginx/conf.d/*.conf; #设置负载均衡的服务器列表 upstream qingyezhu.com { server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; } upstream xiaoxian.com { server 192.168.1.201:8080 weight=5; server 192.168.1.202:8080 max_fails=3 fail_timeout=30s; server 192.168.1.203:8080 down; server 192.168.1.204:8080 backup; } #虚拟主机的配置 server { #监听端口 listen 80; #域名可以多个,用空格隔开 server_name 192.168.1.1 qingyezhu.com; #定义本虚拟主机的访问日志 access_log /opt/logs/qingyezhu.access.log main; #对"/"启用反向代理 location / { expires 0; root html; index index.html index.htm; proxy_pass http://qingyezhu.com; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #设置查看Nginx状态查看的地址 location /NginxStatus { stub_status on; allow 192.168.1.1/8; deny all; } location /test.json { expires 300m; root /data/www; default_type text/json; } location = /getts.json { root /data/www; expires 5m; default_type application/json; access_log off; } } #虚拟主机的配置 server { #监听端口 listen 80; #域名可以多个,用空格隔开 server_name 192.168.1.2 xiaoxian.com; #定义本虚拟主机的访问日志 access_log /opt/logs/qingyezhu.access.log main; #对"/"启用反向代理 location / { expires 0; proxy_pass http://xiaoxian.com; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #设置查看Nginx状态查看的地址 location /NginxStatus { stub_status on; } } } 二、日志文件格式 log_format main '$host - $http_x_forwarded_for - $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent $request_time "$http_referer" ' '"$http_user_agent"'; 日志格式允许包含的变量注释如下: $remote_addr, $http_x_forwarded_for 记录客户端IP地址 $remote_user 记录客户端用户名称 $request 记录请求的URL和HTTP协议 $status 记录请求状态 $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。 $bytes_sent 发送给客户端的总字节数。 $connection 连接的序列号。 $connection_requests 当前通过一个连接获得的请求数量。 $msec 日志写入时间。单位为秒,精度是毫秒。 $pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。 $http_referer 记录从哪个页面链接访问过来的 $http_user_agent 记录客户端浏览器相关信息 $request_length 请求的长度(包括请求行,请求头和请求正文)。 $request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。 $time_iso8601 ISO8601标准格式下的本地时间。 $time_local 通用日志格式下的本地时间。 三、upstream的配置方式 1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如: upstream bakend { server 192.168.1.101 weight=5; server 192.168.1.102 weight=3; } 2、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题[也有人说不可以,由于]。 例如: upstream bakend { ip_hash; server 192.168.1.201:8080; server 192.168.1.202:8080; } 3、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream backend { server server1; server server2; fair; } 4、url_hash(第三方) 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法 upstream backend { server squid1:3128; server squid2:3128; hash$request_uri; hash_method crc32; } 5、tips: upstream bakend{#定义负载均衡设备的Ip及设备状态 ip_hash; server 192.168.1.101:8080 down; server 192.168.1.201:8080 weight=2; server 192.168.1.301:8080; server 192.168.1.401:8080 backup; } 在需要使用负载均衡的server中增加 proxy_passhttp://bakend/; 每个设备的状态设置为: 1.down 表示单前的server暂时不参与负载 2.weight 默认为1.weight越大,负载的权重就越大。 3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 4.fail_timeout:max_fails次失败后,暂停的时间。 5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 四、location语法 nginx location可以根据字符串或者正则表达式来进行匹配 如果要使用正则表达式,则必须以“~”或者"~*"开头 "~"表示区分大小写 "~*"表示不区分大小写 匹配过程如下: 第一步:进行字符串匹配,找到最合适的那一个 第二步:进行正则表达式匹配,找到匹配上的第一个 第三步:如果第二步匹配上了,则用第二步匹配的结果,否则用第一步匹配的结果 从上面可以看出来,正则表达式的优先级要高一些 上面的匹配过程的例外: 1.可以用"="加在字符串前面,表示完全匹配,如果过来的url与某个字符串完全匹配(前面有"="),则搜索停止。因此经常访问"/",则用"=/"可以加快一点点处理速度(因为它停止了nginx配置中的其他搜索) 2.如果只想用字符串匹配,则在字符串前加“^~”,则一旦字符串匹配上了,就不会再进行正则表达式匹配 综上,location的匹配规则如下: 1.先进行"="的完全匹配,如果匹配上,则搜索停止 2.进行字符串匹配,如果匹配上了,但是没有"^~",则进行第3步;如果匹配上了,而且有"^~",则搜索停止; 3.正则表达式匹配,如果匹配上了,则搜索停止;如果没有匹配上,则进行第4步; 4.此时第3步没有匹配上,则拿第2步匹配的结果来进行,如果第2步也没有匹配上,则跳到错误页面(404) 五、一些命令 检测nginx配置文件是否语法正确 /usr/sbin/nginx -c /etc/nginx/nginx.conf -t 或 /opt/nginx/sbin/nginx -t 重新启动nginx /usr/sbin/nginx -c /etc/nginx/nginx.conf -s reload 或 /opt/nginx/sbin/nginx -s reload http://www.blogjava.net/niumd/archive/2011/05/10/349958.html http://www.ibm.com/developerworks/cn/web/wa-lo-nginx/index.html http://jahnkey.huang.blog.163.com/blog/static/27489840201242103925740/