nginx反向代理iis,nginx反向代理的作用

http://www.itjxue.com  2023-01-13 09:13  来源:未知  点击次数: 

Nginx相关知识点

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。

Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。

Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

自行安装

正向代理: 代理服务器站在客户端那边就是正向代理;

反向代理: 代理服务器站在原始服务器那边就是反向代理;

详解参考点击 Nginx正向代理与反向代理

Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。

Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。

并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。

如果你的nginx服务器给2台web服务器做代理,负载均衡算法采用轮询,那么当你的一台机器web程序iis关闭,也就是说web不能访问,那么nginx服务器分发请求还是会给这台不能访问的web服务器,如果这里的响应连接时间过长,就会导致客户端的页面一直在等待响应,对用户来说体验就打打折扣,这里我们怎么避免这样的情况发生呢。这里我配张图来说明下问题。

如果负载均衡中其中web2发生这样的情况,nginx首先会去web1请求,但是nginx在配置不当的情况下会继续分发请求道web2,然后等待web2响应,直到我们的响应时间超时,才会把请求重新分发给web1,这里的响应时间如果过长,用户等待的时间就会越长。

下面的配置是解决方案之一:

如果使用upstream指令配置了一组服务器作为被代理服务器,服务器中的访问算法遵循配置的负载均衡规则,同时可以使用该指令配置在发生哪些异常情况时,将请求顺次交由下一组服务器处理。

状态值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。

内置策略: 1.轮询;2.加权轮询;3.Ip hash;

扩展策略: 就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。

Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

eg:

开启简单的缓存配置,只需要两个指令:proxy_cache_path和proxy_cache。

proxy_cache_path: 配置缓存的存放地址和其他的一些常用配置;

proxy_cache:指令是为了启动缓存;

相关配置说明:

该指令用于定义满足条件的响应不会被保存到缓存中。在条件字符串中至少有一个条件不为空或者0,符合这样条件的响应才不会被缓存。

举例如下

其中,cookie_nocache、arg_nocache...皆为变量,可以根据你访问的匹配策略来设置,其值只有2类,0和非0;

访问匹配策略例如:

如果在此链式配置中,只要有一个值不为0,则不会cache;例如:

则不会被cache.

注:一般会配合proxy_cache_bypass共同使用;

该指令用于定义哪些情况不从cache读取,直接从backend获取资源;配置方式同proxy_no_cache。

给缓存数据定义一个键,例如

该指令用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法,不缓存HTTP POST 方法.。

设置不同响应码的缓存时间,当不指定响应码的时候,例如

只对响应码为200,301,302的访问请求资源设置缓存时间,此外可以个性化定制,例如:

此外,还可以在相应header里设置优先级更高的缓存有效时间:

不缓存包含在field的响应header,可以设置的值有:“X-Accel-Redirect”, “X-Accel-Expires”, “X-Accel-Limit-Rate”,“X-Accel-Buffering”, “X-Accel-Charset”, “Expires”, “Cache-Control”, “Set-Cookie” (0.8.44), and “Vary”。

如果上述的header field没有设置为忽略,则header filed中有“X-Accel-Expires”, “Expires”, “Cache-Control”, “Set-Cookie”, and “Vary”的话,响应会被缓存。

该指令用于设置缓存的最小使用次数,默认值为1

源站有问题时,nginx可以通过proxy_cache_use_stale指令开启容错能力,即使用缓存内容来响应客户端的请求。举例如下:

如上配置表示,当作为cache的NGINX收到源站返回error、timeout或者其他指定的5XX错误,并且在其缓存中有请求文件的陈旧版本,则会将这些陈旧版本的文件而不是错误信息发送给客户端。

使用NGINX,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,NGINX可以用来在多个硬盘之间分割缓存。举例如下:

在这份配置中,使用了3个独立的缓存,每个缓存专用一块硬盘,另外,3个独立的线程池也各自专用一块硬盘。

缓存之间(其结果就是磁盘之间)的负载均衡使用split_clients模块,split_clients非常适用于这个任务。

在 proxy_cache_path指令中设置 use_temp_path=off ,表示NGINX会将临时文件保存在缓存数据的同一目录中。这是为了避免在更新缓存时,磁盘之间互相复制响应数据。

通过访问日志,你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息;

通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。

因此,将日志好好利用,你可以得到很多有价值的信息。

打开nginx.conf配置文件:vim /usr/local/nginx/conf/nginx.conf

日志部分内容:

#access_log logs/access.log main;

日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。

默认“main”日志格式:

参数明细表:

查看日志命令tail -f /usr/local/nginx/logs/access.log

打开nginx.conf配置文件去掉#注释见下图:

自定义某一个server配置的日志,使用“main”日志格式。

日志生成的到Nginx根目录logs/access.log文件,默认使用“main”日志格式,也可以自定义格式。

重新读取加载Nginx配置文件:

执行命令:nginx-s reload

网上一位老师写的log文件分解的脚本

此脚本执行时间根据自己公司情况来定,可以设置默认一天执行一次;

创建crontab设置作业

设置日志文件存放目录crontab -e

*/1 * * * * sh /usr/local/software/nginx/nginx_log.sh

此设置的为一分钟,如果设置一天自行修改;

默认的 nginx 配置文件 nginx.conf 内容如下

示例

几个常见配置项:

注意:

惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能

每个指令必须有分号结束。

进入安装目录下的sbin

IIS VS Nginx 如何合理对比以及看待IIS和Nginx的性能

首先,必须承认的一点是,IOCP,EPOOL以及KQUEUE在本质上并没有太大的区别,对于成熟的商业公司和全球性的开源组织来说其最终实现的效率不会有太大的区别。这一点是讨论的基础,狂热的anti ms分子狂扁windows一无是处的说法不足以作为论据,当然一说windows哪里不足就仿佛被抓住痛脚立马反击也是不可取的。

第二点,抛开应用服务器的性能差异,ASP.NET还是java,什么的,暂时抛开,一般来说,借用绝世好bra的台词,在应用服务器down掉前,一般web服务器是不会down的。所以web服务器的处理能力应该远远高于应用服务器。那么现在纯粹对比的就是对静态文件的处理能力了。

对静态文件的处理能力,大文件处理的性能对比是没有意义的,大文件传输考察的带宽而不是服务器性能。所以要对比的就是对小文件的并发处理能力,由于在网络层面的优劣并不明显,所以最终影响结果的就是文件系统的优劣了,这也是打消进行测试的主要原因:linux下可以选择的文件系统有好几个,挨个测试的假期就泡汤了。

现在条理已经理清楚了,那么测试其实就是在对比NTFS和linux下可用的ext3,ext4,Reiserfs等文件系统性能,其实这也是IIS和Nginx对比测试结果各异的由来,而linux的影响因素太多了,内核网络参数调优,文件系统等都能够左右测试的结果。

不过在常规情况下,未经过特别调优作为前提来考量的话,linux下nginx的性能是超过IIS的,因为linux从某种意义上来说,是一种文件型的操作系统,连设备都是挂载到一个文件符号,当做一个文件来处理,其本身在处理文件的能力上是超过windows的。

Vue-element-admin项目使用Nginx初体验

nginx这个名词听了多年,好似是搞什么反向代理。很多人在用,我却没尝试过。因为不了解,所以误解。

开始还以为一定要用什么IIS,然后再代理什么的。用了两天才搞明白一点,nginx可以取代iis, 当然这是我初次的判断。开始用nginx缘于用vue-element-admin搞的一个项目要发布到生产环境,官方介绍说生产环境下的跨域建议用nginx解决。然后从昨天开始尝试,开始用起来很懵。

a. vue-element-admin用npm run build:prod打包到dist,路径为:D:/AppCode/StPlatform/dist

b. 后端接口.net core3.1开发,用IIS发布,,? 接口中都有api这样一段

c. 前端项目发布在同一服务器,

1. vue中不需要作什么特别的设置, 也贴一下截图吧

后端的请求接口都是以/api开头的,要把这些接口都代理到上解决跨域问题,接口本来就是在. 开始反向代理不成功,就是这里没有理解,看到一些网上的实例/prod-app为代理,且把vue中的VUE_APP_BASE_API = '/Prod-Api', 再在nginx.conf中设置location /Prod-Api{? ...... },结果一次又一次的反向代理不成功,后来想到不能不理解的模仿别人,我后台接口中有/api,没有/prod-api这样的接口,应是直接按接口中这样的反向代理设置,最后果然成功了。

一切才刚刚开始,以后得好好学习nginx了,神奇!

IIS、Apache、Tomcat、Nginx、CDN,它们之间有何区别?

一个学习的总结,或者说是汇总,有些链接给出的观点过时,已按照自己的理解经过修改编辑;

web服务器

Web服务器的基本功能就是提供Web信息浏览服务,响应客户端的浏览器请求。因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的。待考:支持除HTTP之外的协议的web服务器?

不支持事务处理或数据库连接池,但它可以配置各种策略来实现容错性和可扩展性,例如负载平衡,缓冲,集群。

IIS、Apache、Tomcat都可以属于Web服务器。

IIS 是微软开发的web服务器,需要收费,主要用来跑 asp.net asp php,只能在windows下运行。

Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行。Apache是Web服务器而Tomcat是Java应用服务器。Apache服务器 只处理 静态HTML,而tomcat服务器 静态HTML 动态 JSP Servlet 都能处理。

一般是把 Apache服务器 与 tomcat服务器 搭配在一起用:

1) Apache服务器 负责处理所有 静态的 页面/图片 等信息。

2) Tomcat 只处理动态的 部分。

Apache:是C语言实现的,专门用来提供HTTP服务。特性:简单、速度快、性能稳定、可配置(代理)

1、主要用于解析静态文本,并发性能高,侧重于HTTP服务;

2、支持静态页(HTML),不支持动态请求如:CGI、Servlet/JSP、PHP、ASP等;3、具有很强的可扩展性,可以通过插件支持PHP,还可以单向Apache连接Tomcat实现连通;

4、Apache是世界使用排名第一的Web服务器。

Tomcat:是Java开发的一个符合JavaEE的Servlet规范的JSP服务器(Servlet容器),是 Apache 的扩展。特性:免费的Java应用服务器

1、主要用于解析JSP/Servlet,侧重于Servlet引擎;

2、支持静态页,但效率没有Apache高;支持Servlet、JSP请求;

3、Tomcat本身也内置了一个HTTP服务器用于支持静态内容,可以通过Tomcat的配置管理工具实现与Apache整合。

Apache + Tomcat:两者整合后优点:如果请深圳市是静态网页则由Apache处理,并将结果返回;如果是动态请求,Apache会将解析工作转发给Tomcat处理,Tomcat处理后将结果通过Apache返回。这样可以达到分工合作,实现负载远衡,提高系统的性能。apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet容器,可以认为是apache的扩展,但是可以独立于apache运行。独立于apache运行。换句话说,apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),而这个桶也可以不放在卡车上。

Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

Nginx与Apache比较:

1)轻量级,同样起web 服务,比apache占用更少的内存及资源 ;

2)高并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 ;

3)高度模块化的设计,编写模块相对简单 ;

4)提供负载均衡;

5)apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程;

Web Server中文名称叫网页服务器或web服务器。WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务 IIS

IIS是微软公司的Web服务器。主要支持ASP语言环境,对于中小企业来说建立自己的网站,对外展示自己的页面是最平常不过的事情了。目前最流行的建立WWW服务工具就要属Apache与IIS了。 IIS只能在微软公司的windows操作系统下使用,离开了windows他将一事无成。无法移植到其他类型的操作系统中。

Tomcat

java里面一个web容器,就是一个http请求来了,它帮你接受,可能再对请求做些处理,然后拉起你controller的代码,把请求传进去,最后当controller处理结束后,再把请求简单处理一下返回给请求者。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

CDN

中文叫内容分发网络,都是云服务商在运营,它可以让你的用户在访问资源的时候就近访问,提高静态资源的访问速度。

这些都是不同的东西,不过都是概念上的,功能上有一定的重叠,不过在使用中基本都是不同的东西。

一般生产上iis,nginx,apache都是当反向代理用,少数情况会当静态文件服务器用。tomcat,无论何时都是web容器。cdn一般只在生产上用,主要是提供静态文件服务。

至于他们的实现,理论上讲用什么语言否没问题,不管是java node还是啥的,不过有现成的,应该没人会造新的。

Apache

Apache是一个web服务器环境程序 启用他可以作为web服务器使用 不过只支持静态网页. 但asp,php,cgi,jsp等动态网页的就不行. 如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页, 而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK 整合的好处是:如果客户端请求的是静态页面,则只需要Apache服务器响应请求如果客户端请求动态页面,则是Tomcat服务器响应请求因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销。

apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展。

Apache:普通服务器,本身只支持html即普通网页,它是html容器,功能像IIS一样

tomcat:解释java程序(jsp,serverlet),它是是jsp/servlet容器,用于发布JSP及JAVA的

apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),tomcat就是一个桶(装像JAVA这样的水),而这个桶也可以不放在卡车上。

诀窍是, 当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。

Nginx

Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

nginx相对于apache的优点

轻量级,同样起web 服务,比apache占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

高度模块化的设计,编写模块相对简单

提供负载均衡

社区活跃,各种高性能模块出品迅速

总结

Nginx优点:负载均衡、反向代理、处理静态文件优势。nginx处理静态请求的速度高于Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。

Tomcat:动态解析容器,处理动态请求,是编译JSPServlet的容器,Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。

Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache较适合。

反向代理的理解:

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,

并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

您的提问,有我回答,我是IT屠工!

IIS

IIS是互联网信息服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。

IIS是一种Web(网页)服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。

IIS的功能

IIS是一个World Wide Web server。Gopher server和FTP server全部包容在里面。 IIS支持一些有趣的东西,像有编辑环境的界面(FRONTPAGE)、有全文检索功能的(INDEX SERVER)、有多媒体功能的(NET SHOW)。

其次,IIS是随Windows NT Server 4.0一起提供的文件和应用程序服务器,是在Windows NT Server上建立Internet服务器的基本组件。它与Windows NT Server完全集成,允许使用Windows NT Server内置的安全性以及NTFS文件系统建立强大灵活的Internet/Intranet站点。

Apache

Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。

Apache HTTP服务器是一个模块化的服务器,源于NCSAhttpd服务器,经过多次修改,成为世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。

Apacheweb服务器软件主要功能:

1.支持最新的HTTP/1.1通信协议

2.拥有简单而强有力的基于文件的配置过程

3.支持通用网关接口

4.支持基于IP和基于域名的虚拟主机

5.支持多种方式的HTTP认证

6.集成Perl处理模块

7.集成代理服务器模块

8.支持实时监视服务器状态和定制服务器日志

9.支持服务器端包含指令(SSI)

10.支持安全Socket层(SSL)

11.提供用户会话过程的跟踪

12.支持FastCGI

13.通过第三方模块可以支持JavaServlets

Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

Nginx

Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。

Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。

CDN

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

CDN网络中包含的功能实体包括内容缓存设备、内容交换机、内容路由器、CDN内容管理系统等组成。

CDN具有以下主要功能:

1.节省骨干网带宽,减少带宽需求量;

2.提供服务器端加速,解决由于用户访问量大造成的服务器过载问题;

3.服务商能使用Web Cache技术在本地缓存用户访问过的Web页面和对象,实现相同对象的访问无须占用主干的出口带宽,并提高用户访问因特网页面的相应时间的需求;

4.能克服网站分布不均的问题,并且能降低网站自身建设和维护成本;

5.降低“通信风暴”的影响,提高网络访问的稳定性。

以上是我的回答,希望可以帮助到您!

iis apache nginx属于一类,都是web服务,本身提供静态文件访问功能,同时又可以通过扩展接入其他语言的解析。tomcat是针对java类的web服务容器。可以这样理解iis apache nginx是阿里,tomcat是京东。而cdn只是一种服务的统称,用到的web服务器则可能不同,有用nginx实现cdn的,也有自研的。

这类再简单介绍一下,iis主要针对微软系的语言。当然也支持php等。但是主要用于微软系。

apache主要以扩展方式运行,比如php,如果想在apache里运行,你得给apache写个扩展,这样才可以跑php,也就是耦合度比较高。

nginx以性能闻名。运行web主要靠反向代理和协议。这样其他语言只需要按照协议通讯即可无需开发nginx扩展。耦合度低。

请教问题nginx反向代理proxy

一、反向代理:Web服务器的“经纪人”

1.1 反向代理初印象

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

Nginx搭建反向代理服务器过程详解

从上图可以看出:反向代理服务器位于网站机房,代理网站Web服务器接收Http请求,对请求进行转发。

1.2 反向代理的作用

①保护网站安全:任何来自Internet的请求都必须先经过代理服务器;

Nginx搭建反向代理服务器过程详解

②通过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力;

Nginx搭建反向代理服务器过程详解

③实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;

Nginx搭建反向代理服务器过程详解

二、初识Nginx:简单却不平凡

2.1 Nginx是神马?

Nginx搭建反向代理服务器过程详解

Nginx是一款轻量级的网页服务器、反向代理器以及电子邮件代理服务器。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

Source:Nginx(发音同engine x),它是由俄罗斯程序员Igor Sysoev所开发的。起初是供俄国大型的门户网站及搜索引擎Rambler(俄语:Рамблер)使用。此软件BSD-like协议下发行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中运行。

说到Web服务器,Apache服务器和IIS服务器是两大巨头;但是运行速度更快、更灵活的对手:Nginx 正在迎头赶上。

2.2 Nginx的应用现状

Nginx 已经在俄罗斯最大的门户网站── Rambler Media()上运行了3年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。

Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解Nginx搭建反向代理服务器过程详解

在国内,已经有 淘宝、新浪博客、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、海内、迅雷在线 等多家网站使用 Nginx 作为Web服务器或反向代理服务器。

2.3 Nginx的核心特点

(1)跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本;

(2)配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置;

(3)非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。(这得益于Nginx使用了最新的epoll模型);

PS:对于一个Web服务器来说,首先看一个请求的基本过程:建立连接—接收数据—发送数据,在系统底层看来 :上述过程(建立连接—接收数据—发送数据)在系统底层就是读写事件。

①如果采用阻塞调用的方式,当读写事件没有准备好时,必然不能够进行读写事件,那么久只好等待,等事件准备好了,才能进行读写事件,那么请求就会被耽搁 。

②既然没有准备好阻塞调用不行,那么采用非阻塞调用方式。非阻塞就是:事件马上返回,告诉你事件还没准备好呢,你慌什么,过会再来吧。好吧,你过一会,再来检查一下事件,直到事件准备好了为止,在这期间,你就可以先去做其它事情,然后再来看看事件好了没。虽然不阻塞了,但你得不时地过来检查一下事件的状态,你可以做更多的事情了,但带来的开销也是不小的。

(4)事件驱动:通信机制采用epoll模型,支持更大的并发连接。

①非阻塞通过不断检查事件的状态来判断是否进行读写操作,这样带来的开销很大,因此就有了异步非阻塞的事件处理机制。这种机制让你可以同时监控多个事件,调用他们是阻塞的,但可以设置超时时间,在超时时间之内,如果有事件准备好了,就返回。这种机制解决了上面阻塞调用与非阻塞调用的两个问题。

②以epoll模型为例:当事件没有准备好时,就放入epoll(队列)里面。如果有事件准备好了,那么就去处 理;如果事件返回的是EAGAIN,那么继续将其放入epoll里面。从而,只要有事件准备好了,我们就去处理它,只有当所有事件都没有准备好时,才在 epoll里面等着。这样,我们就可以并发处理大量的并发了,当然,这里的并发请求,是指未处理完的请求,线程只有一个,所以同时能处理的请求当然只有一 个了,只是在请求间进行不断地切换而已,切换也是因为异步事件未准备好,而主动让出的。这里的切换是没有任何代价,你可以理解为循环处理多个准备好的事 件,事实上就是这样的。

③与多线程方式相比,这种事件处理方式是有很大的优势的,不需要创建线程,每个请求占用的内存也很少,没有上下文切换, 事件处理非常的轻量级,并发数再多也不会导致无谓的资源浪费(上下文切换)。对于IIS服务器,每个请求会独占一个工作线程,当并发数上到几千时,就同时 有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战:因为线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不 去,从而导致在高并发场景下性能下降严重。

总结:通过异步非阻塞的事件处理机制,Nginx实现由进程循环处理多个准备好的事件,从而实现高并发和轻量级。

(5)Master/Worker结构:一个master进程,生成一个或多个worker进程。

Nginx搭建反向代理服务器过程详解

PS:Master-Worker设计模式核心思想是将原来串行的逻辑并行化, 并将逻辑拆分成很多独立模块并行执行。其中主要包含两个主要组件Master和Worker,Master主要将逻辑进行拆分,拆分为互相独立的部分,同 时维护了Worker队列,将每个独立部分下发到多个Worker并行执行,Worker主要进行实际逻辑计算,并将结果返回给Master。

问:nginx采用这种进程模型有什么好处?

答:采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,Master 进程则很快重新启动新的Worker进程。当然,Worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前Worker上的所有请求失 败,不过不会影响到所有请求,所以降低了风险。

(6)内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。

(7)内置的健康检查功能:如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问。

(8)节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。

(9)稳定性高:用于反向代理,宕机的概率微乎其微。

三、构建实战:Nginx+IIS构筑Web服务器集群的负载均衡

这里我们主要在Windows环境下,通过将同一个Web网站部署到不同服务器的IIS上,再通过一个统一的Nginx反响代理服务器对外提供统一访问接入,实现一个最简化的反向代理和负载均衡服务。但是,受限于实验条件, 我们这里主要在一台计算机上进行反向代理、IIS集群的模拟,具体的实验环境如下图所示:我们将nginx服务和web网站都部署在一台计算机 上,nginx监听http80端口,而web网站分别以不同的端口号(这里是8050及8060)部署在同一个IIS服务器上,用户访问 localhost时,nginx作为反向代理将请求均衡地转发给两个IIS中不同端口的Web应用程序进行处理。虽然实验环境很简单而且有限,但是对于 一个简单的负载均衡效果而言,本文是可以达到并且展示的。

Nginx搭建反向代理服务器过程详解

3.1 准备一个ASP.NET网站部署到IIS服务器集群中

(1)在VS中新建一个ASP.NET Web应用程序,但是为了在一台计算机上展示效果,我们将这个Web程序复制一份,并修改两个Web程序的Default.aspx,让其的首页显示不同 的一点信息。这里Web1展示的是“The First Web:”,而Web2展示的则是“The Second Web”。

Nginx搭建反向代理服务器过程详解

(2)调试运行,看看两个网站的效果如何?

①Web1的展示效果:

Nginx搭建反向代理服务器过程详解

②Web2的展示效果:

Nginx搭建反向代理服务器过程详解

③部署到IIS中,分配不同的端口号:这里我选择了Web1:8050,Web2:8060

Nginx搭建反向代理服务器过程详解

(3)总结:在真实环境中,构建Web应用服务器集群的实现是将同一个Web应用程序部署到Web服务器集群中的多个Web服务器上。

3.2 下载Nginx并部署到服务器中作为自启动的Windows服务

(1)到Nginx官网下载Nginx的Windows版本:(这里我们使用nginx/Windows-1.4.7版本进行实验,本文底部有下载地址)

(2)解压到磁盘任意目录,例如这里我解压到了:D:\Servers\nginx-1.4.7

(3)启动、停止和重新加载服务:通过cmd以守护进程方式启动nginx.exe:start nginx.exe,停止服务:nginx -s stop,重新加载配置:nginx -s reload;

Nginx搭建反向代理服务器过程详解

(4)每次以cmd方式启动Nginx服务不符合实际要求,于是我们想到将其注册为Windows服务,并设置为自动启动模式。这里,我们使用一个 不错的小程序:“Windows Service Wrapper”,将nginx.exe注册为Windows服务,具体的步凑如下:

①下载最新版的 Windows Service Wrapper 程序,比如我下载的名称是 “winsw-1.8-bin.exe”(本文底部有下载地址),然后把它命名成你想要的名字(比如: “nginx-service.exe”,当然,你也可以不改名)

②将重命名后的 nginx-service.exe 复制到 nginx 的安装目录(比如,我这里是 “D:\Servers\nginx-1.4.7″)

③在同一个目录下创建一个Windows Service Wrapper 的XML配置文件,名称必须与第一步重命名时使用的名称一致(比如我这里是 “nginx-service.xml”, 如果,你没有重命名,则应该是 “winsw-1.8-bin.xml”),这个XML的内容如下:

?xml version="1.0" encoding="UTF-8" ?

service

idnginx/id

nameNginx Service/name

descriptionHigh Performance Nginx Service/description

executableD:\Servers\nginx-1.4.7\nginx.exe/executable

logpathD:\Servers\nginx-1.4.7\/logpath

logmoderoll/logmode

depend/depend

startargument-p D:\Servers\nginx-1.4.7/startargument

stopargument-p D:\Servers\nginx-1.4.7 -s stop/stopargument

/service

④在命令行下执行以下命令,以便将其注册成Windows服务:nginx-service.exe install

Nginx搭建反向代理服务器过程详解

⑤接下来就可以在Windows服务列表看到Nginx服务了,这里我们可以将其设置为自动启动了:

Nginx搭建反向代理服务器过程详解

(5)总结:在Windows环境中,要对外提供的Windows服务一般都要将其启动类型设置为自动。

3.3 修改Nginx核心配置文件nginx.conf

(1)进程数与每个进程的最大连接数:

?nginx进程数,建议设置为等于CPU总核心数

?单个进程最大连接数,那么该服务器的最大连接数=连接数*进程数

Nginx搭建反向代理服务器过程详解

(2)Nginx的基本配置:

?监听端口一般都为http端口:80;

?域名可以有多个,用空格隔开:例如 server_name ha97.com;

Nginx搭建反向代理服务器过程详解

(3)负载均衡列表基本配置:

?location / {}:对aspx后缀的进行负载均衡请求,假如我们要对所有的aspx后缀的文件进行负载均衡时,可以这样写:location ~ .*\.aspx$ {}

?proxy_pass:请求转向自定义的服务器列表,这里我们将请求都转向标识为的负载均衡服务器列表;

Nginx搭建反向代理服务器过程详解

?在负载均衡服务器列表的配置中,weight是权重,可以根据机器配置定义权重(如果某台服务器的硬件配置十分好,可以处理更多的请求,那么可以 为其设置一个比较高的weight;而有一台的服务器的硬件配置比较差,那么可以将前一台的weight配置为weight=2,后一台差的配置为 weight=1)。weigth参数表示权值,权值越高被分配到的几率越大;

Nginx搭建反向代理服务器过程详解

(4)总结:最基本的Nginx配置差不多就是上面这些内容,当然仅仅是最基础的配置。(详细的配置内容请下载底部的nginx-1.4.7详细查看)

3.4 添加Nginx对于静态文件的缓存配置

为了提高响应速度,减轻真实服务器的负载,对于静态资源我们可以在反向代理服务器中进行缓存,这也是反向代理服务器的一个重要的作用。

(1)缓存静态资源之图片文件

root /nginx-1.4.7/staticresources/image:对于配置中提到的jpg/png等文件均定为到/nginx-1.4.7/staticresources/image文件夹中进行寻找匹配并将文件返回;

expires 7d:过期时效为7天,静态文件不怎么更新,过期时效可以设大一点,如果频繁更新,则可以设置得小一点;

TIPS:下面的样式、脚本缓存配置同这里一样,只是定位的文件夹不一样而已,不再赘述。

Nginx搭建反向代理服务器过程详解

(2)缓存静态资源之样式文件

Nginx搭建反向代理服务器过程详解

(3)缓存静态资源之脚本文件

Nginx搭建反向代理服务器过程详解

(4)在nginx服务文件夹中创建静态资源文件夹,并要缓存的静态文件拷贝进去:这里我主要将Web程序中用到的image、css以及js文件拷贝了进去;

Nginx搭建反向代理服务器过程详解

(5)总结:通过配置静态文件的缓存设置,对于这些静态文件的请求可以直接从反向代理服务器中直接返回,而无需再将这些静态资源请求转发到具体的Web服务器进行处理了,可以提高响应速度,减轻真实Web服务器的负载压力。

3.5 简单测试Nginx反向代理实现负载均衡效果

(1)第一次访问时从127.0.0.1:8050处理响应返回结果

(2)第二次访问时从127.0.0.1:8060处理响应返回结果

(3)多次访问时的截屏:

Nginx搭建反向代理服务器过程详解

学习小结

在本文中,借助了Nginx这个神器简单地在Windows环境下搭建了一个反向代理服务,并模拟了一个IIS服务器集群的负载均衡效果。从这个 DEMO中,我们可以简单地感受到反向代理为我们所做的事情,并体会负载均衡是怎么一回事。但是,在目前大多数的应用中,都会将Nginx部署在 Linux服务器中,并且会做一些针对负载均衡的优化配置,这里我们所做的仅仅就是一个小小的使用而已(just修改一下配置文件)。不过,万丈高楼平地 起,前期的小小体会,也会帮助我们向后期的深入学习奠定一点点的基础。

突然在QQ空间里看到了朋友送的礼物,猛然发现今天居然是我的阳历生日,好吧,我祝我自己生日快乐,希望自己在未来的日子中能够做更多的实践,分享更多的内容。当然,如果你觉得本文还可以,那也麻烦点个赞,不要吝啬你的鼠标左键哟。

Nginx 使用反向代理 解决异步api获取问题!

问题解决非常简单,在宝塔服务器站点配置中,对nginx站点配置增加如下配置信息:

1、location 后面的/api是匹配本地url中带有指定目录所用;

2、 rewrite ^/api/(.*)$ /$1 break; 这一段是用来进行匹配修改的,意思是去除掉后面的api

3、 proxy_pass ; 这一段是用来设置转发地址的,意思就是你要把/api 这个路径指向的地址;

比如说你本地是 123.com 你要把 123.com/api 变成 234.com/api 就在 proxy_pass中输入 即可;

(责任编辑:IT教学网)

更多

推荐word文章