首页 > 信息管理 > 行业资讯 > 正文

史上最全的技术实践之nginx,反向代理、防盗链、高速缓存  (移动端简洁版浏览)
媒体资源网 http://www.allchina.cn 2023/6/16

今天说说Nginx, 其实有老铁比较奇怪,nginx不是运维来搞的吗?确实是的,大部分情况下,公司比较大的话,存在运维的话,这个锅肯定是运维来做的。但是现在有个趋势叫devops之前我也说过,开发运维一体化,开发也要懂一定的运维知识。在一些互联网的创业公司刚开始技术的工种,并不是分的那么清楚,可能都要会的。环境的搭建,运维,框架搭建,开发都必须拿得下来。

源码:https://github.com/limingios/netFuture/tree/master/nginx

Nginx服务搭建与基础演示(一)

Nginx

官网

http://nginx.org/

介绍

Nginx是一个轻量级、高性能、稳定性高、并发性好的HTTP和反向代理服务器。也是由于其的特性,其应用非常广。

历史

由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:Рамблер)使用。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。

理解代理的概念

1.正向代理:某些情况下,代理我们用户去访问服务器,需要用户手动的设置代理服务器的ip和端口号。

2.反向代理:是用来代理服务器的,代理我们要访问的目标服务器。代理服务器接受请求,然后将请求转发给内部网络的服务器(集群化),并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器。

根据源码配置的机器

系统类型IP地址节点角色CPUMemoryHostnameCentos7192.168.66.110nginx12GnginxCentos7192.168.66.111tomcat12Gtomcat1Centos7192.168.66.112tomcat12Gtomcat2

三台机器

准备工作

yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel

nginx主机安装pcre的安装包(192.168.66.110)

https://sourceforge.net/projects/pcre/files/pcre/

nginx rewrite依赖于PCRE库,所以需要在linux系统中编译安装PCRE库

wget https://nchc.dl.sourceforge.net/project/pcre/pcre/8.41/pcre-8.41.tar.gztar zxvf pcre-8.41.tar.gzcd image.png./configuremake && make installpcre-config --prefix

安装nginx

cd ..wget http://nginx.org/download/nginx-1.13.10.tar.gztar zxvf nginx-1.13.10.tar.gzmkdir nginxcd nginx-1.13.10./configure --prefix=/root/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/root/pcre-8.41make && make install cd ~cd nginx/sbin/./nginx -v./nginx -t

启动nginx

cd ~/nginx/sbin/./nginx

其实没有权限

修改配置文件

vi ~/nginx/conf/nginx.conf#修改成user root#wq保存#重新加载nginx新的配置./sbin/nginx -s reload

111 和112 两个机器安装tomcat

java -versionwget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.37/bin/apache-tomcat-8.5.37.tar.gz

tar zxvf apache-tomcat-8.5.37.tar.gz cd apache-tomcat-8.5.37cd bin./startup.shcurl 127.0.0.1:8080

111 和112 添加一个index.jsp文件方法查看

cd /root/apache-tomcat-8.5.37/webapps/ROOT>index.jspvi index.jspcat index.jsp

upstream 与location 模块参数与案例讲解(二)

未来软件其实都是趋于模块化的。拼装完成。

upstream

官网的介绍

http://nginx.org/en/docs/

upstream实例

http://nginx.org/en/docs/http/ngx_http_upstream_module.html

upstream 参数

参数名称描述service反向服务地址 加端口weight权重max_fails失败多少次 认为主机已挂掉则,踢出,默认是1次,企业一般配置2到3次,但是电商更加重视用户体验所以就是1次。前提这个机器供给比较多。fail_timeout踢出后重新探测时间backup备用服务max_conns允许最大连接数slow_start当节点恢复,不立即加入

修改66.110 那个nginx配置文件

vi /root/nginx/conf/nginx.confcat /root/nginx/conf/nginx.conf

因为权重相同,所以轮播111 和 112 2个tomcat

yu

*负载均衡算法

1.ll weight

默认的负载算法,其实就是根据权重才分配服务请求。

2.ip_hash

基于Hash 计算 应用场景:保持session 一至性,第一次访问那台,一直是同一台。hash(ip)%3 =index。弊端小区或者学校集中化的地方,他们出去的ip都是一致的,某个节点负载会非常非常的大。成为热点,有了ip_hash导致weight权重就失效了。

3.url_hash

(第三方)应用场景:静态资源缓存,节约存储,加快速度

4.least_conn

最少链接

5.least_time

最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重。

6.keeplive

占用连接数。内存消耗比较大,但是响应速度很快,应该保持这socket连接。

location1.root

后面的配置相当于把浏览器中的输入路径进行了重指

2.index

在前后端分离的基础上,指定网站初始页

3.proxy_set_header

用来重定义发往后端服务器的请求头

4.proxy_pass

如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走

动静分离方案

一般动静分离两种方式

静态文件放入nginx静态文件放入指定的服务器,通过请求地址来区别跳转到那个服务器。静态文件放入nginx

#思路:动、静态的文件,请求时匹配不同的目录当访问gif,jpeg时 直接访问e:wwwroot;server { listen 80; server_name localhost; location / { root e:wwwroot; index index.html; } # 所有静态请求都由nginx处理,存放目录为html location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ { root e:wwwroot; } # 所有动态请求都转发给tomcat处理 location ~ .(jsp|do)$ { proxy_pass http://test; } error_page 500 502 503 504 /50x.html; location = /50x.html { root e:wwwroot; } } 静态服务器的方式

多个upstream,多个location, location的名称不一样。

Nginx如何实现高速缓存(三)

场景介绍

假设在做一个大型项目,面向全国的,公司对架构师的要求是做到700 的QPS,如何去处理。

介绍几个开发网站需要了解的关键字响应时间(RT)

响应时间是指系统对请求作出响应的时间。

吞吐量(TPS)

系统在单位时间内处理请求的数量

并发用户数

系统可以同时承载的正常使用系统功能的用户的数量

QPS每秒查询率

对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准

了解下一个网站一般的实际html大小

打开一个技术博客:idig8.com

查看源代码

保存在文件大小:45kb,700QPS/s = 700*45/1024 = 30MB,单个页面如果700QPS的话需要吐出来30MB/s的量,毕竟是个人博客肯定承受不了。

image.png

咱们在拿某东为例,保存在文件大小:186kb,700QPS/s = 700*186/1024 = 100MB ,单个页面如果700QPS的话需要吐出来100MB/s的量,某东好牛逼。

如果让咱们来设计京东这么大的体谅如何设计。

对于商品详情 页涉及了如下主要服务:商品详情页HTML页面渲染价格服务促销服务 库存状态/配送至服务 广告词服务预售/秒杀服务评价服务试用服务推荐服务商品介绍服务 各品类相关的一些特殊服务

上边的全部搞成微服务。

采用Ajax 动态加载 价格、广告、库存等服务采用key value 缓存详情页主体html。

很多比较大型的内部系统都是这样来设计的。

微服务和微服务之前都是内网都是千兆带宽,第一次从微服务中取。之后都是通过redis直接过去。特殊的数据通过ajax的方式。从redis来获取肯定会有大大的提升。如果用这种情况500qps还是可以的,如果想往上走,基本很难得。但是我们的要求走到700qps。

当达到500QPS 的时候很难继续压测上去。

分析原因:一个详情页html 主体达平均150 kb 那么在500QPS 已接近局域网宽带极限。75MB ,内网一般都是千兆带宽,千年带宽128MB/s,其实这个也是在往内网IO的一个瓶颈上边走。在上边图的架构,其实内网走了2次,一个是通过nginx访问商品的详情服务,一个是详情服务访问redis。

如果想解决上边的2次内网的通信最理想的方式,上图中的2个节点都不要就可以了。

不走redis缓存,也不通过nginx来请求商品详情页服务,直接从nginx本地的硬盘缓存来走。内网通信的瓶颈是不是就解决了。

解决方式

减少内网的通信,nginx本身也可以通过配置将数据缓存到本地硬盘上,下次请求直接请求nginx内部的硬盘缓存数据,这样也减少了内网的通信。

正常情况下是这样的流程,有缓存的情况。

正常情况下没有缓存的情况,nginx自动添加缓存

商品变更怎么办,思路是通过MQ消息服务,通过详情页服务,由详情页服务统一的来请求直接的地址的,来清空nginx下的缓存。

nginx的缓存配置

nginx如何配置缓存

proxy_cache 是用于 proxy 模式(一般也可称为反代)的缓存功能

events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;#配置缓存 proxy_cache_path /data/nginx/cache_item levels=1:2 keys_zone=cache_item:200m inactive=30d max_size=10g; upstream idig8 { server 192.168.66.111:8080 weight=5; server 192.168.66.112:8080 weight=5; } server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } #配置缓存 location ~*.(html|htm)$ { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://idig8; proxy_cache cache_item; proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 304 12h; expires 7d; } }}

image.png

在tomcat目录下新建立一个index.html

tomcat1

idig8.com192.168.66.111

tomcat2

idig8.com192.168.66.112

重启nginx

./sbin/nginx -s stopmkdir -p /data/nginx/cache_item./sbin/nginx查看缓存路径

pwdcd /data/nginx/cache_item/3/cfls

清空缓存

看看效果

修改了index.html

请求还是缓存里面的数据

回顾如何配置,该方案Nginx 配置实现

1、在http元素下添加缓存区声明。proxy_cache_path /data/nginx/cache_item levels=1:1:2 keys_zone=cache_item:500minactive=30d max_size=10g;2、为指定location 设定缓存策略。proxy_cache cache_item;proxy_cache_key $host $uri$is_args$args;#以全路径md5值做做为Keyproxy_cache_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间expires 7d; #总体缓存时间

演示缓存生效过程

配置声明缓存路径为location 配置缓存策略重启nginx(修改了)查看缓存目录生成

父元素名称描述httpproxy_cache_path指定缓存区的根路径levels缓存目录层级最高三层,每层1~2个字符表示。如1:1:2 表示三层。keys_zone缓存块名称 及内存块大小。如cache_item:500m 。表示声明一个名为cache_item 大小为500m。超出大小后最早的数据将会被清除。inactive最长闲置时间 如:10d 如果一个数据被闲置10天将会被清除max_size缓存区硬盘最大值。超出闲置数据将会被清除locationproxy_cache指定缓存区,对应keys_zone 中设置的值proxy_cache_key通过参数拼装缓存key 如:host uri is_args args 则会以全路径md5值做做为Keyproxy_cache_valid为不同的状态码设置缓存有效期

缓存的清除:

该功能可以采用第三方模块 ngx_cache_purge 实现。将ngx_cache_purge编译到到Nginx中,用来清除指定URL的缓存。

为nginx 添加 ngx_cache_purge 模块

cd ~wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz#查看已安装模块~/nginx/sbin/nginx -V#进?nginx安装包?录 重新安装 --add-module为模块解压的全路径cd ~/nginx-1.13.10./configure --prefix=/root/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/root/ngx_cache_purge-2.3#重新编译makecp /root/nginx-1.13.10/sbin/nginx ~/nginx/sbin/nginx #查看是否安装成功./nginx/sbin/nginx -t

清除配置

location ~ /purge(/.*) {#允许访问的IPallow 127.0.0.1;allow 192.168.0.193;#禁?访问的IPdeny all;#配置清除指定缓存区和路径(与proxy_cache_key??)proxy_cache_purge cache_item $host$1$is_args$args;}

Nginx如何防盗链(四)

提问:

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

该功能如果用JAVA如何实现?很单简单,只要判断一下 请求头当中的referer 属性是否为 指定域名即可。

Nginx原理类似。

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

说明:如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referer 为true

语法: valid_referers none | blocked | server_names | string ...;

参数说明:

none

不允许 “Referer” 来源头部为空的情况

blocked

不允许“Referer”值为空情况,有可能Referer被的值被代理或者防火墙删除

server_names

“Referer”来源头部包必须含当前的server_names (当前域名)可以多个

Nginx如何实现子域名站点配置,类似赶紧网城市站点的配置(三)

有时会有这样的需求,每个子域名对应一个静态站点(类似58到家、有赞商城等)。如果每天增加一个域名

的会相当麻烦。在nginx 当中可直接基于$host 连接到对应目录。具体配置实现如下:

server {listen 80;server_name *.tl.com;root /data/www/$host;access_log logs/$host.access.log;location / {index index.html;}}

一定要修改下,主机的host文件,它依靠host文件的。

PS:一般用nginx比较多就是反向代理,其实很多特殊的配置也是在大型互联网电商经常使用的。所以这个高速缓存和防盗链也是一个不错的功能。


本站文章部分内容转载自互联网,供读者交流和学习,如有涉及作者版权问题请及时与我们联系,以便更正或删除。感谢所有提供信息材料的网站,并欢迎各类媒体与我们进行文章共享合作。投稿邮箱:ad@allchina.cn



媒体店铺最新动态:



首页新闻
·纽约曼哈顿Midtown Financial 
·吉隆坡时代广场十字路口电子屏 
·吉隆坡Maju Junction交通枢纽中心 
·马来西亚吉隆坡市区电子广告牌组合 
·纽约时代广场Broadway Plaza数字 
·新加坡乌节大酒店电子屏广告 
·新加坡面积最大的交互式户外电子屏-Ten S 
·新加坡森林大厦墙体电子屏广告 
·巴西圣保罗市中心电子时钟LED高清广告牌 
·巴西圣里约热内卢市中心街头全动态电子广告牌套 
·巴西圣保罗市地铁1、2、3号线路电子屏套装 
·巴西圣保罗地铁中心电梯环形广告组合 
·巴西圣保罗地铁中转处静态灯箱广告 
·土耳其伊斯坦布尔机场电子屏325块套装 
·伊斯坦布尔机场出发区大尺寸LED电子屏广告 
·伊斯坦布尔机场国内国际到达行李提取处LED屏 
·伦敦希斯罗机场T5航站楼电子屏广告 
·伦敦希思罗机场T3航站楼到达区LED广告屏 
·伦敦希思罗机场T2、T4航站楼到达区行李提取 
·巴西圣保罗瓜鲁柳斯机场T1航站楼到达区行李提 
广告行业资讯
·广告语大全——打造营销神器 
·餐饮广告语——吸引消费者的利器 
·网络资源与电视广告费用相关性研究 
·户外广告行业分析 
·公益广告语的重要性及其对社会的积极影响 
·促销活动广告语:如何用短短几句话吸引消费者? 
·广告设计与制作:打造品牌形象的重要环节 
·2023年中国广告行业分析 
·户外广告牌费用一般多少 
·从事广告行业需要会什么 
·亚心论坛——推动中国精神文化建设的重要平台 
·汽车网络广告的现状 
·如何写好广告文案 
·每天一个C/C++知识点 
·每天一个C/C++知识点 
·奥迪小满广告视频、平面接连“翻车”,资深广告 
·营销平台升级为磁力引擎,快手凭啥要当短视频社 
·移动互联网广告的新黑马——激励视频 
·全面禁止VS分级制度,未成年人沉迷网游到底怎 
·商家在网络平台发布限时优惠广告,是否属于虚假 
综艺节目最新更新
2021/7/31
芒果捞星闻
2021/7/31
经视观察
2021/7/30
女神说电影
2021/7/30
看我72变之创意少年
2021/7/21
妻子的浪漫旅行
2021/7/6
山东电视台相亲相爱
2021/7/2
厨娘物语
2021/6/18
拜托了煮夫
2021/6/17
口袋舞蹈
2021/6/11
淮秀帮
户外广告资源推荐
·浙江省杭州市公交车车身户外广告位 
·广州天河北中石化大厦屏(全国性) 
·长春市国贸大厦楼体广告牌 
·广东茂名东站出站通道灯箱广告 
·湖南全省中石化加油站便利店货架/橱窗广告位 
·湖南全省中石化加油站便利店外墙广告牌 
·北京崇文门搜秀商城屏西向和北向(全国性) 
·南京市建邺区写字楼企业办公区域LED显示屏 
·石家庄新百商圈新百广场屏(全国性) 
·河南郑州郑州地铁全线各站资源地铁灯箱广告 
·江苏省常州市户外公交车身广告 
·江苏省常州市户外公交灯箱 
·深圳地铁4号线LED大屏独家资源,视频+图片 
·全国高端楼盘百叶式拦车道闸媒体广告(全国性) 
·湖南湘潭康星百货 LED 显示屏 
·上海地铁口魔伞设备LCD屏 
·上海市普陀区长寿路巴黎春天LED广告牌 
·浙江宁波市海曙区东方商厦三面翻广告牌 
·上海地铁广告位(灯箱,看板,LED电子屏,画 
·甘肃省兰州市火车东站LED大屏 
报纸广告资源推荐
·《印度时报》为印度最老、也是发行量最大的英文 
·德国每日镜报Der Tagesspiegel 
·德国也是欧洲发行量最大的报纸: 德国图片报简 
·德国发行量最大报纸之一:法兰克福汇报 
·《南德意志报》:德国发行量最大的日报 
·德国时代周报:一份覆盖全德国的德语周报 
·俄罗斯主流报纸广告大全2019 
·俄罗斯报:俄罗斯报界具有权威性的报纸 
·欧洲时报:欧洲最具影响力的华文日报 
·意大利《欧洲华人报》简介 
杂志广告资源推荐
·土耳其航空机上杂志广告投放 
·汉莎航空杂志广告投放推荐 
·美国新闻周刊newsweek(或电子版)刊登 
·《新知客》杂志简介 
·《健康准妈妈》从婚前到宝贝教育的专业类杂志 
·《女友•校园》《女友• 
·《南都周刊》全国性新闻类杂志 
·《京城一瞥》媒体简介 
·Outside中文版《户外》 
·《东方养生》杂志-海航航机头等舱