nginx的反向代理与正向代理
nginx多用于现在公司的企业当中如:
淘宝、新浪博客、新浪播客、网易新闻、六间房、56.co、豆瓣、YUPOO、海内、迅雷在线等多家网站使用
为什么这么多公司愿意使用您想呢?说明nginx有不可取代的优势特点:
我们分析下nginx的特点:
(1)跨平台:Nginx 可以在大多数OS编译运行,而且也有Windows的版本;
(2)配置异常简单:非常容易上手。
(3)非阻塞、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。(这得益于Nginx使用了最新的epoll模型);{这里的5万并发量属于静态}
具体的阻塞和非阻塞不在这里做过多的介绍,后面会为大家进行详细的介绍。
(4)nginx的master/worker结构:
在这里可以看的出来master维护worker列队,将请求下发到多个worker并行执行,worker将运行结果返回给master。
优点;
每个进程之间不会相互影响,一个进程推出之后,其他进程换在工作,服务不会中断。
(5)内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
(6)内置的健康检查功能:如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问。
(7)节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
(8)稳定性高:用于反向代理,宕机的概率微乎其微。
这里既然说到了反向代理,那么就说一说正向代理和反向代理的区别:
1)正向代理:
用于代理服务器的内部网络连接请求外部的internet:如vpn、nat技术
2)反向代理:
用于制定代理服务器接受客户端的连接请求,将请求的内容分发到内部的服务器中。{在生产环境中大多使用反向代理,所以简单介绍下作用}
反向代理的作用:
①保护网站安全:任何来自Internet的请求都必须先经过代理服务器;
②通过配置缓存功能加速Web请求:可以缓存真实Web服务器上的某些静态资源,减轻真实Web服务器的负载压力;
③实现负载均衡:充当负载均衡服务器均衡地分发请求,平衡集群中各个服务器的负载压力;
接下来的环境就是今天为大家带来的关于nginx的反向代理;
实验环境如下:
nginx: 192.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的两台负载服务器,web1和web2服务器。
web1服务器的配置如下;在这里就通过yun安装web服务了
web2服务和web1服务安装相同;
如果想要做反向代理和负载均衡,就需要在nginx的主配置文件当中进行配置具体配置如下;
后面会有具体的相对应的介绍;
常用指令说明:
main全局配置:
woker_processes 4
在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数grep ^processor /proc/cpuinfo | wc -l,也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。
worker_cpu_affinity
也是写在main部分。在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。
另外也可以使用top命令之后按1可以查看:
上面的配置表示:4核CPU,开启4个进程。0001表示开启第一个cpu内核, 0010表示开启第二个cpu内核,依次类推;有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
例如:
1、2核CPU,开启2个进程
worker_processes2;
worker_cpu_affinity 01 10;
2、2核CPU,开启4进程
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
3、2核CPU,开启8进程
worker_processes8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
4、8核CPU,开启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事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于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
设置缓冲区的大小为size。nginx从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于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服务进行配置网页内容:
验证:通过访问nginx的ip地址可以访问到两台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”