nginx的反向代理与正向代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx的反向代理与正向代理相关的知识,希望对你有一定的参考价值。

               nginx的反向代理与正向代理

nginx多用现在公司的企业当中如:

淘宝、新浪博客、新浪播客、网易新闻、六间房、56.co、豆瓣、YUPOO、海内、迅雷在线等多家网站使用

为什么这么多公司愿意使用您想呢?说明nginx有不可取代的优势特点:

我们分析下nginx的特点:

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

2配置异常简单:非常容易上手。

3非阻塞、高并发连接官方测试能够支撑5并发连接,在实际生产环境中跑到23万并发连接数。(这得益于Nginx使用了最新的epoll模型);{这里的5万并发量属于静态}

具体的阻塞和非阻塞不在这里做过多的介绍,后面会为大家进行详细的介绍。

4nginxmaster/worker结构:

技术分享 

在这里可以看的出来master维护worker列队,将请求下发到多个worker并行执行,worker将运行结果返回给master

优点;

每个进程之间不会相互影响,一个进程推出之后,其他进程换在工作,服务不会中断。

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

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

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

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

 这里既然说到了反向代理,那么就说一说正向代理和反向代理的区别:

1)正向代理:

用于代理服务器的内部网络连接请求外部的internet:如vpnnat技术

2)反向代理:

用于制定代理服务器接受客户端的连接请求,将请求的内容分发到内部的服务器中。{在生产环境中大多使用反向代理,所以简单介绍下作用}

 

反向代理的作用:

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

技术分享 

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

技术分享

 

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

技术分享 

接下来的环境就是今天为大家带来的关于nginx的反向代理;

实验环境如下:

nginx192.168.5.130

web1 192.168.5.129

web2 192.168.5.128

技术分享 

首先配置nginx服务器,在安装nginx之前必须解决nginx的依赖关系:通过网络yum源安装

技术分享 

接下来为nginx创建nginx的用户“www

技术分享 

解压nginx的安装包,以及ngx_cache_purge模块,和master模块:

注:这里的模块属于第三方的模块,需要制定,在nginx的安装包中不存在

技术分享 

--user ==============================================指定用户名

--group=============================================指定组名

--with-http_stub_status_module========================启用状态统计模块

--with-http_realip_module============================获取到真是的用户Ip

--with-http_ssl_module===============================启用ssl安全连接

--with-http_gzip_static_module=========================启动gzip压缩功能

-http-client-body-temp-path=/var/tmp/nginx/client============指定客户端连接目录

--http-proxy-temp-path=/var/tmp/nginx/proxy================允许将请求传递到另一个服务器

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi===============使用fistcgi模块

--with-pcre==========================================使用prce正则表达式

--add-module=../ngx_cache_purge-2.3===================缓存清除模块

-with-http_flv_module===============================添加流媒体文件模块

--add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42=====实现会话粘连(保持会话)

 

 

这里做个软连接,也可以做个环境变量,echo PATH="$PATH:/usr/local/nginx1.10/sbin/nginx ">> /etc/profile  两种方法都可以.

技术分享 

通过语法检测查看上面我们所做的操作是否有错误。可以看到缺少一个客户端的路径,我们可以手动创建一个。

技术分享 

之后再次进行验证:

技术分享 

在这里我们在启动程序的环境变量当中创建一个启动nginx的脚本服务,可以加入开机自启动当中。方便我们日常的启动工作。

技术分享 

技术分享 

技术分享 

创建完成之后需要给一个执行权限,添加为系统服务,开机自启动

技术分享 

查看一下nginx服务是否已经启动

技术分享 

将防火墙的80端口启动

技术分享 

以上属于nginx的配置就可以了,后面我们会修改其配置文件。

接下来配置nginx的两台负载服务器,web1web2服务器。

web1服务器的配置如下;在这里就通过yun安装web服务了

技术分享 

web2服务和web1服务安装相同;

技术分享 

如果想要做反向代理和负载均衡,就需要在nginx的主配置文件当中进行配置具体配置如下;

后面会有具体的相对应的介绍;

技术分享 

 

技术分享技术分享 

常用指令说明:

main全局配置:

woker_processes 4
在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数grep ^processor /proc/cpuinfo | wc -l,也是 auto 值,如果开启了sslgzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。

 

worker_cpu_affinity
也是写在main部分。在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。

另外也可以使用top命令之后按1可以查看:

技术分享 

上面的配置表示:4CPU,开启4个进程。0001表示开启第一个cpu内核, 0010表示开启第二个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。

例如:

12CPU,开启2个进程

worker_processes2;

worker_cpu_affinity  01  10;

22CPU,开启4进程

worker_processes 4;

worker_cpu_affinity  01  10  01  10;

32CPU,开启8进程

worker_processes8;

worker_cpu_affinity  01 10 01 10 01 10 01 10;

48CPU,开启2进程

worker_processes2;

worker_cpu_affinity  10101010 01010101;

说明:10101010表示开启了第2,4,6,8内核,01010101表示开始了1,3,5,7内核

worker_connections  4096
写在events部分。每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。

 

worker_rlimit_nofile 10240
写在main部分。worker进程的最大打开文件数限制。默认是没有设置,如果没设置的话,这个值为操作系统的限制(ulimit -n)可以限制为操作系统最大的限制65535把这个值设高,这样nginx就不会有“too many open files”问题了。

 

use epoll
写在events部分。在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginxLinux操作系统下效率相当高。同时NginxOpenBSDFreeBSD操作系统上采用类似于epoll的高效事件模型kqueue

 

http服务器:

与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。

sendfile on
开启高效文件传输模式。

 

keepalive_timeout 65 : 长连接超时时间,单位是秒,长连接请求大量小文件的时候,可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源。

client_max_body_size 10m
允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值

client_body_buffer_size 128k
缓冲区代理缓冲用户端请求的最大字节数

server_tokens off;

隐藏nginx的版本号

 

模块http_proxy
这个模块实现的是nginx作为反向代理服务器的功能,包括缓存功能

proxy_connect_timeout
nginx跟后端服务器连接超时时间(代理连接超时)

 

proxy_read_timeout
定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。

 

proxy_send_timeout

定义向后端服务器传输请求的超时。此超时是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果后端服务器在超时时间段内没有接收到任何数据,连接将被关闭。

 

proxy_buffer_size  4k
设置缓冲区的大小为sizenginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于proxy_buffers指令设置的一块缓冲区的大小,但它也可以被设置得更小。

 

proxy_buffers 8 4k

语法: proxy_buffersthe_numberis_size;

为每个连接设置缓冲区的数量为number,每块缓冲区的大小为size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是4K还是8K,取决于平台。

proxy_busy_buffers_size  64k
高负荷下缓冲大小(默认大小是proxy_buffers指令设置单块缓冲大小的2

 

proxy_max_temp_file_size
proxy_buffers放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M

 

proxy_temp_file_write_size 64k
当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小。

 

模块http_gzip

gzip on : 开启gzip压缩输出,减少网络传输。

 

gzip_min_length 1k :设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。建议设置成大于1k的字节数,小于1k可能会越压越大。

 

gzip_buffers 4 16k :设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,按照原始数据大小以16k为单位的4倍申请内存。如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果

 

gzip_http_version 1.1 :用于识别 http 协议的版本,早期的浏览器不支持Gzip压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项,如果你用了Nginx的反向代理并期望也启用Gzip压缩的话,由于末端通信是 http/1.1,故请设置为 1.1

 

gzip_comp_level 6 gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)

 

gzip_types :匹配mime类型进行压缩,无论是否指定”text/html类型总是会被压缩的。

默认值: gzip_types text/html (默认不对js/css文件进行压缩)
# 压缩类型,匹配MIME类型进行压缩
# 不能用通配符 text/*
# (无论是否指定)text/html默认已经压缩 
# 设置哪压缩种文本文件可参考conf/mime.types

 

gzip_proxied any Nginx作为反向代理的时候启用,根据某些请求和应答来决定是否在对代理请求的应答启用gzip压缩,是否压缩取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数,意义如下:

off – 关闭所有的代理结果数据的压缩
expired – 启用压缩,如果header头中包含 “Expires” 头信息
no-cache – 启用压缩,如果header头中包含 “Cache-Control:no-cache” 头信息
no-store – 启用压缩,如果header头中包含 “Cache-Control:no-store” 头信息
private – 启用压缩,如果header头中包含 “Cache-Control:private” 头信息
no_last_modified – 启用压缩,如果header头中不包含 “Last-Modified” 头信息
no_etag – 启用压缩 ,如果header头中不包含 “ETag” 头信息
auth – 启用压缩 , 如果header头中包含 “Authorization” 头信息
any – 无条件启用压缩

 

gzip_vary on :和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩

 

模块http_stream
这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡,upstream后接负载均衡器的名字,后端realserver host:port options; 方式组织在 {} 中。如果后端被代理的只有一台,也可以直接写在proxy_pass

 

Location:

root  /var/www/html

定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件,root没什么作用,一般放在server指令里面或/下。

 

index index.jsp index.html index.htm

定义路径下默认访问的文件名,一般跟着root

 

proxy_pass http:/backend

请求转向backend定义的服务器列表,即反向代理,对应upstream负载均衡器。也可以proxy_passhttp://ip:port

 

proxy_redirect off;

指定是否修改被代理服务器返回的响应头中的location头域跟refresh头域数值

例如:

设置后端服务器“Location”响应头和“Refresh”响应头的替换文本。假设后端服务器返回的响应头是 “Location: http://localhost:8000/two/some/uri/”,那么指令

proxy_redirect http://localhost:8000/two/ http://frontend/one/;

将把字符串改写为 “Location: http://frontend/one/some/uri/”


proxy_set_header Host $host;

允许重新定义或者添加发往后端服务器的请求头。

总结:

通过上面的配置可以看的出来nginx的配置计较简单相对apache;许多的配置要简化了好多。

 

接下来对两台web服务进行配置网页内容:

技术分享 

技术分享 

 

 

验证:通过访问nginxip地址可以访问到两台web服务器的网页内容:

 

技术分享 

技术分享 

接下来对访问到的内容进行一个测试按F12键查看,注:必须通过火狐浏览器或者谷歌;

可以看到1.gif的访问情况是200.说明是直接从后台的web服务直接获得。

技术分享 

当我们再一次打开浏览其查看的时候,会发现,1.gif文件变成了304,另外nginx-Cache:"HIT"

说明这次我们访问到的内容是在nginx当中进行缓存了的内容,而不是从后台服务中获得

技术分享 

如果还想继续验证,那么可以通过192.168.5.130/purge/1.gif清除缓存,再次进行查看,这里的purge属于前面我们编译安装时安装的模块起到了作用

技术分享 

通过刚才的清除缓存,我们再一次进行访问可以看到我们的1.gif图片是从web中获得的

nginx-Cache:“MISS

技术分享 


本文出自 “[email protected]之星” 博客,请务必保留此出处http://xiaorenwutest.blog.51cto.com/12754924/1949630

以上是关于nginx的反向代理与正向代理的主要内容,如果未能解决你的问题,请参考以下文章

nginx反向代理与正向代理

Nginx教程 正向代理与反向代理总结

nginx 正向代理与反向代理

Nginx的正向代理和反向代理

Nginx 学习 —— 正向代理与反向代理

关于Nginx的正向代理与反向代理