什么是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