什么是Nginx?
❖ Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经因为它的稳定性、丰富的功能集 、 示例配置文件和低系统资源的消耗而闻名了 。
Nginx的特性
❖ 动静分离 ( 缓存命中 )
❖ 反向代理 ( 负载均衡 )
❖ 平滑升级
❖ 访问控制
❖ URLRewrite( 正则 )
Nginx的优点
❖ 1、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
❖ 2、内存消耗少:在3万并发连接下,开启的10个Nginx进程才消耗150M内存(15M*10=150M)。
❖ 3、配置文件非常简单:风格跟程序一样通俗易懂。
❖ 4、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币 。
❖ 5、支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP 请求分到不同的后端服务器群组 。
❖ 6、内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问 。
❖ 7、节省带宽:支持GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
❖
8、稳定性高:用于反向代理,宕机的概率微乎其微。
Nginx转发规则配置
❖ 进入nginx目录使用命令 vim conf / nginx.conf ,在文件末尾大括号内添加如下信息
include /usr/local/nginx/conf/vhost/*.conf;
❖ 创建vhost目录添加转发规则
~mkdirconf/vhost
~vim conf/vhost/tomcat_dangdang.conf
server {
listen 80;
server_namewww.dangdang.cn;
location / {
proxy_pass http://tomcat_dangdang;
}
}
upstream tomcat_dangdang
server 10.10.100.10:8080;
}
Nginx静态文件转发规则
❖
使用alias指定
location ^~ /static/activity/ {
alias /static/activity/;
}
❖
使用root指定
location ^~ /static/activity/ {
root / ;
}
区别:
alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无
Nginx转发规则顺序
❖ 以= 开头表示精确匹配
❖ 如 A 中只匹配根目录结尾的请求,后面不能带任何字符串 。
❖ ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
❖ ~ 开头表示区分大小写的正则匹配 ;
❖ ~* 开头表示不区分大小写的正则匹配
❖ / 通用匹配 , 如果没有其它匹配,任何请求都会匹配到
❖ 顺序 no优先级 :
(location =) > (location
完整路径
) > (location ^~
路径
) > (location ~,~*
正则顺序
) > (location
部分起始路径
) > (/)
负载均衡
upstream bbs_server_pool {
server 192.168.1.15:80 weight=1max_fails=2fail_timeout=30s;
server 192.168.1.16:80 weight=1max_fails=2fail_timeout=30s;
server 192.168.1.17:80 weight=1max_fails=2fail_timeout=30s;
server 192.168.1.18:80 weight=1max_fails=2fail_timeout=30s;
}
❖weight越高权重越高,max_fails指定重试次数,fail_timeout是超时时间
访问控制
location /docs/ {
## 禁止192.168.1.1ip访问
deny 192.168.1.1;
##允许 192.168.1.0/24段ip访问
allow 192.168.1.0/24;
## 允许10.10.100.0/16段ip访问
allow 10.10.100.0/16;
## drop禁止所有ip访问
deny all;
}
从上到下的顺序。匹配到了便跳出。如上的例子先禁止了192.16.1.1,接下来允许了2个网段,最后未匹配的IP全部禁止访问.
缓存配置
location ^~ /static/activity/ {
alias /static/activity/;
expires 3d;
#expires 1h;
}
expires可以配置缓存时间,但是开发
/
测试环境尽量不用,否则可能造成新代码不生效
灰度环境的实现方式
❖
app端
/
wap端访问app服务端时,在http请求的header中设置
dangdang_umark
=1
set $group "app_default";
if ($http_dangdang_umark = 0) {
set $group "app_normal";
}
if ($http_dangdang_umark = 1) {
set $group "app_huidu";
}
❖
web端
/
wap端访问自身服务时,在cookie中种入dangdang_umark
=1
set $group "tomcat_default";
if($http_cookie ~* "dangdang_umark=0") {
set $group "tomcat_dangdang";
}
if ($http_cookie ~* "dangdang_umark=1") {
set $group "tomcat_huidu";
}
Nginx日志
error_log :
❖
error_log
级别分为
debug, info, notice, warn, error,
crit
默认为crit
error_log /opt/nginx/logs/nginx_error.log crit;
access_log :
❖
配置格式如下
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" - $http_x_forwarded_for - $http_x_real_ip - "$request_time"' ;
配置地址如下
access_log /opt/nginx/logs/access_log access;
可在http 或 server中配置。
❖ $ 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_local 通用日志格式下的本地时间 。
Nginx服务常用命令
❖ 1.*TEST* 测试配置文件是否正确
sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
❖ 2.启动
sbin/nginx -c /usr/local/nginx/conf/nginx.conf
❖ 3.重载配置文件
sbin/nginx -s reload
❖ 4.停止
sbin/nginx -s stop