您的位置:首页 > 运维架构 > Nginx

nginx小记

2016-03-09 13:19 866 查看
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/[/code] 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: