Nginx服务搭建与基础演示

安装与配置

//安装先决条件
sudo yum install yum-utils
//安装nginx
sudo yum install nginx

配置

nginx默认配置文件路径:

# upstream模块
upstream starcold {#starcold upstream的名字
    hash $remote_addr consistent;#负载均衡算法
    
    # ip地址/域名(采用域名的话使用DNS又可以做一层负载均衡),端口,权重(越大轮询次数越多)
    server 192.168.XXX.XXX:12345  weight=5;
    
    # server 后面跟的参数表示
    # weight	权重
  	 # down		当前服务器暂时不参与负载
    # backup 	预留的备份服务器
    # max_fails	允许请求失败的次数(失败后踢掉)
    # fail_timeout	经过max_fails失败后, 服务器暂停的时间(提出后重新探测时间)
    # max_conns	限制最大接收连接数       
    # slow_start	当节点恢复,不立即加入
    server backend2.example.com:12345;
    
    # 默认nginx访问后端都是用的短连接
    # keepalive:作为长连接保存的最大连接数。
    keepalive 300
    #
    server unix:/tmp/backend3;


    server backup1.example.com:12345   backup;
    server backup2.example.com:12345   backup;
}

server {
    # location参数语法规则: location [=|~|~*|^~] /uri/ { … }
    
    # 第一个必选规则 
    # 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
    # 这里是直接转发给后端应用服务器了,也可以是一个静态首页
    location = / {
        proxy_pass http://tomcat:8080/index
    }
    
    # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项,有两种配置模式,任选其一或搭配使用
    # 目录匹配
        location ^~ /static/ {				# 以xx开头
        root /webroot/static/;
    }
    # 后缀匹配
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {		# 以xx结尾
        root /webroot/res/;
    }
        
    # 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
    # 非静态文件请求就默认是动态请求,自己根据实际把握
    location /apps {
        # location参数
        alias: /data/statics/bin/apps/	# alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
        root: /data/statics/bin		# root会根据完整的URI请求来映射。
        index: index.html index.php;	# 在前后端分离的基础上,通过Nginx配置,指定网站初始页(指定多个按序轮询)。
        proxy_set_header: 			# 用来设定被代理服务器接收到的header信息
        proxy_pass ;http://starcold;	# 设置要代理的目标url,正向代理保持该值固定即可
        # 健康检查
        health_check;			
    }    

}

负载均衡算法

ll_wegiht: 轮询加权重算法

hash_ip

hash(clent_ip)%激活的节点数,(学校、社区通过同一个交换机对于服务器来说是一个ip。可能出现“热点”问题)

应用场景:保持session一致性

url_hash

第三方算法,通过url请求的hash值来选择后端服务器节点,一般配合缓存命中来使用,同一个localurl会访问同一个节点,避免了不同服务器多次下载相同资源的问题。

应用场景:静态资源缓存,节约存储,加快速度

least_conn: 最小链接

least_time: 最小响应时间,响应最快的分配更高的权重

NGINX upstream 延迟高 nginx upsync module_nginx

queue

//TODO:原理

Nginx queue的特点:

1、实现了排序功能。

2、它非常轻量级,是一个纯粹的双向链表。它不负责链表元素所占内存的分配,与Nginx封装的ngx_pool_t内存池完全无关。

3、支持两个链表间的合并。

 

 

Nginx 生产环境应用

Nginx高速缓存

案例:电商平台商品详情页面需要实现700+QPS。如何实现?

实现:

1、首先分析一下一个商品详情页包含哪些信息。

NGINX upstream 延迟高 nginx upsync module_nginx_02

2、从图中我们可以看出,对于商品详情页,主要依赖了如下服务:

商品图片:商品详情页HTML渲染、图片管理服务

商品信息:商品详情页HTML渲染、库存/配送服务、商品介绍服务、评价服务

价格信息:价格服务、促销(优惠券)服务、预售/秒杀服务、试用服务

广告信息:广告服务、推荐服务、相似品服务

 

3、解决方案核心

a、使用ajax动态加载价格、广告、库存等信息

b、采用key-value缓存详情页html主体

 

4、方案架构

NGINX upstream 延迟高 nginx upsync module_缓存_03

 

5、存在问题

问题:当达到500QPS的时候,就几乎达到极限,很难继续压测上去

分析:一个详情页html主体平均达到150kb,500QPS以上就接近局域网宽带极限。

解决办法:减少内网通讯。采用如下架构

NGINX upstream 延迟高 nginx upsync module_Nginx_04

6、Nginx静态缓存配置:

a、在http元素下添加缓存区声明。

http{
    # /data/nginx/cache2 缓存地址 
    # levels 层级,MD5之后倒数的多少位字符
    # keys_zone 缓存区域名称 200m 缓存块内存中
    # inactive 缓存有效期 30d 30天未访问则删除
    # max_size 最大硬盘大小
    proxy_cache_path /data/nginx/cache_item1  levels=1:2 keys_zone=cache_item1:200m inactive=30d max_size=10g #修改这个参数必须重启
}

b、为指定location设定缓存策略

location ~* \.(html|htm)${
   proxy_set_header Host $host;
   # X-Forwarded-For最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP.
   proxy_set_header X-Forwarded-For $remote_addr; 
   proxy_pass http://127.0.0.1:8080;
   proxy_cache cache_item1;
   # host:全路径, uri:uri, is_args:?, args:params
   proxy_cache_key $host$uri$is_args$args;
   # 对不同的HTTP状态码设置不同的缓存时间
   proxy_cache_valid 200 304 12h;
   # 缓存时间
   expires 7d;
}

c、缓存的清除

# 缓存的清除可以通过第三方模块 ngx_cache_purge 实现

# 下载对应版本ngx_cache_purge模块包,这里用2.0版本
wget http://labs.frickle.com/files/ngx_cache_purge-2.0.tar.gz
# 查看已安装模块
./sbin/nginx/ -V
# 进入nginx安装包目录 重新安装 --add-module为模块的解压全路径
./configure --prefix=/root/svr/nginx --with-http_stub_status_module --with-http_ssl_module --add_module=/root/svr/nginx/models/ngx_cache_purge-2.0
# 重新编译
make
# 拷贝 安装目录/objs/nginx 替换原nginx文件
# 检查安装是否成功
nginx -t

# 清除配置
location ~ /purge(/.*){
    # 允许访问的IP
    allow 127.0.0.1;
    allow 192..168.0.0;
    # 禁止访问的IP
    deny all;
    # 配置清除指定缓存区和路径(与proxy_cache_key一致)
    proxy_cache_purge cache_item $host$l$is_args$args;
}

# 访问(http://域名+purge+静态资源相对路径)来清除静态资源缓存。

Nginx防盗链

定义:什么是防盗链?意思是本站内图片、CSS等资源只有本站点可以访问,不允许其他站点打开。

实现:java中判断请求头中referer属性是否为指定域名。Nginx原理类似。

防盗链配置:

location ~* \.(gif|png|jpg|swf|flv)$ {
    root html;
    valid_referers none *.starcold.com;
    if($invalid_referer){
        rewrite ^/ http://www.starcold.com/imge/403.png;
        #return 404;    
    }
}

Nginx子域名站点配置

场景:每个子域名对应一个静态站点,如果每天增加一个域名会相当麻烦。

解决:nginx中可以基于$host连接到对应目录。

具体配置:

server{
    listen 80;
    server_name *.starcold.com;
    root /data/www/$host;
    access_log logs/$host.access.log;
    location / {
        index index.html;    
    }
}
# 然后创建/data/www目录
# 添加相应静态文件