白话Nginx
nginx作为高性能Web服务器,想必大家已经垂涎已久,想要学习一番了吧。网上的内容大多数是枯燥的,接下来就说说nginx的那些事儿。
正向代理
正向代理:内网服务器主动去请求外网的服务的一种行为
光看概念是不是有点迷糊呢?很多人都会发出疑问。那么,什么是正向?什么是代理呢?
正向:相同一致的方向
代理:自己做不了的事情或者自己不打算做的事情,委托或依靠别人来完成。
回归到nginx的概念,正向代理其实就是说客户端无法主动或者不打算完成主动去向某服务器发起请求,而是委托了nginx代理服务器去向服务器发起请求,并且获得处理结果,返回给客户端。
从下图可以看出:
举个栗子:广大的社会主义接班人都了解,为了保护祖国的花朵不受外界乌烟瘴气的熏陶,国家对网络进行了一系列的“优化”,正常情况下是不能访问外网的,作为程序员的我们如果没有谷歌等搜索引擎的帮助,再销魂的代码也会因此失色,因此,网络上也曾出现过一些fan qiang技术和软件供有需要的人使用,如某v*n等,其实v*n的原理大体上也类似于一个正向代理,也就是需要访问外网的电脑,发起一个访问外网的请求,通过本机上的v*n去寻找一个可以访问国外网站的代理服务器,代理服务器向外国网站发起请求,然后把结果返回给本机。
正向代理的配置:
server {
#指定DNS服务器IP地址
resolver 114.114.114.114;
#指定代理端口
listen 8080;
location / {
#设定代理服务器的协议和地址(固定不变)
proxy_pass http://$http_host$request_uri;
}
}
正向代理关键配置:
resolver:DNS服务器IP地址
listen:主动发起请求的内网服务器端口
proxy_pass:代理服务器的协议和地址
反向代理
反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处理完之后,把结果通过nginx返回给客户端。
上面讲述了正向代理的原理,相信对于反向代理,就很好理解了吧。反向代理是对于来自外界的请求,先通过nginx统一接受,然后按需转发给内网中的服务器,并且把处理请求返回给外界客户端,此时代理服务器对外表现的就是一个web服务器,客户端根本不知道“上游服务器”的存在
举个栗子:一个服务器的80端口只有一个,而服务器中可能有多个项目,如果A项目是端口是8081,B项目是8082,C项目是8083,假设指向该服务器的域名为www.xxx.com,此时访问B项目是www.xxx.com:8082,以此类推其它项目的URL也是要加上一个端口号,这样就很不美观了,这时我们把80端口给nginx服务器,给每个项目分配一个独立的子域名,如A项目是a.xxx.com,并且在nginx中设置每个项目的转发配置,然后对所有项目的访问都由nginx服务器接受,然后根据配置转发给不同的服务器处理。具体流程如下图所示:
1server {
#监听端口
listen 80;
#服务器名称,也就是客户端访问的域名地址
server_name a.xxx.com;
#nginx日志输出文件
access_log logs/nginx.access.log main;
#nginx错误日志输出文件
error_log logs/nginx.error.log;
root html;11 index index.html index.htm index.php;
location / {
#被代理服务器的地址14 proxy_pass http://localhost:8081;
#对发送给客户端的URL进行修改的操作
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;22 }23}
透明代理
透明代理:也叫做简单代理,意思客户端向服务端发起请求时,请求会先到达透明代理服务器,代理服务器再把请求转交给真实的源服务器处理,也就是是客户端根本不知道有代理服务器的存在。
举个栗子:它的用法有点类似于拦截器,如某些制度严格的公司里的办公电脑,无论我们用电脑做了什么事情,安全部门都能拦截我们对外发送的任何东西,这是因为电脑在对外发送时,实际上先经过网络上的一个透明的服务器,经过它的处理之后,才接着往外网走,而我们在网上冲浪时,根本没有感知到有拦截器拦截我们的数据和信息。
有人说透明代理和反向代理有点像,都是由代理服务器先接受请求,再转发到源服务器。其实本质上是有区别的,透明代理是客户端感知不到代理服务器的存在,而反向代理是客户端感知只有一个代理服务器的存在,因此他们一个是隐藏了自己,一个是隐藏了源服务器。事实上,透明代理和正向代理才是相像的,都是由客户端主动发起请求,代理服务器处理;他们差异点在于:正向代理是代理服务器代替客户端请求,而透明代理是客户端在发起请求时,会先经过透明代理服务器,再达到服务端,在这过程中,客户端是感知不到这个代理服务器的。
负载均衡
负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡。负载均衡是反向代理的一种体现。
可能绝大部分人接触到的web项目,刚开始时都是一台服务器就搞定了,但当网站访问量越来越大时,单台服务器就扛不住了,这时候需要增加服务器做成集群来分担流量压力,而在架设这些服务器时,nginx就充当了接受流量和分流的作用了,当请求到nginx服务器时,nginx就可以根据设置好的负载信息,把请求分配到不同的服务器,服务器处理完毕后,nginx获取处理结果返回给客户端,这样,用nginx的反向代理,即可实现了负载均衡。
nginx实现负载均衡有几种模式:
1、轮询:每个请求按时间顺序逐一分配到不同的后端服务器,也是nginx的默认模式。轮询模式的配置很简单,只需要把服务器列表加入到upstream模块中即可。
下面的配置是指:
1upstream serverList {
server 1.2.3.4;3
server 1.2.3.5;4
server 1.2.3.6;5
}
2、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
下面的配置是指:
upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
hash $request_uri;
hash_method crc32;
}
3、url_hash:按访问url的hash结果来分配请求,相同的url固定转发到同一个后端服务器处理。
upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
hash $request_uri;
hash_method crc32;
}
4、fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
1upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
fair;
}
而在每一种模式中,每一台服务器后面的可以携带的参数有:
down: 当前服务器暂不参与负载
weight: 权重,值越大,服务器的负载量越大。
max_fails:允许请求失败的次数,默认为1。
fail_timeout:max_fails次失败后暂停的时间。
backup:备份机, 只有其它所有的非backup机器down或者忙时才会请求backup机器。
静态服务器
现在很多项目流行前后分离,也就是前端服务器和后端服务器分离,分别部署,这样的方式能让前后端人员能各司其职,不需要互相依赖,而前后分离中,前端项目的运行是不需要用Tomcat、Apache等服务器环境的,因此可以直接用nginx来作为静态服务器。
静态服务器的配置如下,其中关键配置为:
root:直接静态项目的绝对路径的根目录。
server_name : 静态网站访问的域名地址。
server {
listen 80;
server_name www.xxx.com;
client_max_body_size 1024M;
location / {
root /var/www/xxx_static;
index index.html;
}
}
nginx的安装