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: 最小响应时间,响应最快的分配更高的权重
queue
//TODO:原理
Nginx queue的特点:
1、实现了排序功能。
2、它非常轻量级,是一个纯粹的双向链表。它不负责链表元素所占内存的分配,与Nginx封装的ngx_pool_t内存池完全无关。
3、支持两个链表间的合并。
Nginx 生产环境应用
Nginx高速缓存
案例:电商平台商品详情页面需要实现700+QPS。如何实现?
实现:
1、首先分析一下一个商品详情页包含哪些信息。
2、从图中我们可以看出,对于商品详情页,主要依赖了如下服务:
商品图片:商品详情页HTML渲染、图片管理服务
商品信息:商品详情页HTML渲染、库存/配送服务、商品介绍服务、评价服务
价格信息:价格服务、促销(优惠券)服务、预售/秒杀服务、试用服务
广告信息:广告服务、推荐服务、相似品服务
3、解决方案核心
a、使用ajax动态加载价格、广告、库存等信息
b、采用key-value缓存详情页html主体
4、方案架构
5、存在问题
问题:当达到500QPS的时候,就几乎达到极限,很难继续压测上去
分析:一个详情页html主体平均达到150kb,500QPS以上就接近局域网宽带极限。
解决办法:减少内网通讯。采用如下架构
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目录
# 添加相应静态文件