【.com原稿】本文首先介绍了Nginx的反向代理、负载均衡、动静分离、高可用的原理,然后详细讲解了Nginx的配置文件,带你从原理到实战,吃透Nginx!图片来自PexelsNginx是一款开源的轻量级Web服务器、反向代理服务器、负载均衡器和HTTP缓存。其特点是高并发、高性能、低内存。Nginx是专门为性能优化而开发的。性能是其最重要的考虑因素。它在实现上非常注重效率,经得起高负载的考验,最大可以支持5万并发连接。Nginx还支持热部署,特别好用,几乎可以7x24小时不间断运行。Nginx的网站用户有:百度、淘宝、京东、腾讯、新浪、网易等反向代理①正向代理Nginx不仅可以作为反向代理实现负载均衡,还可以作为正向代理上网和其他功能。②反向代理客户端不知道代理服务器。客户端不需要做任何配置。用户只请求反向代理服务器。反向代理服务器选择目标服务器,获取数据返回给客户端。反向代理服务器和目标服务器对外是同一台服务器,只是暴露了代理服务器的地址,而隐藏了真实服务器的IP地址。负载均衡将原来请求集中在一台服务器上的情况,改为增加服务器的数量,然后将请求分发到每台服务器上,将负载分散到不同的服务器上,即负载均衡。动静分离为了加快网站的分析速度,可以将静态页面和动态页面分在不同的服务器上进行分析,加快分析速度,减轻原有单台服务器的压力。高可用性为了提高系统的可用性和容错性,可以增加Nginx服务器的数量。当主服务器发生故障或宕机时,备份服务器可以立即充当主服务器不间断工作。Nginx配置文件①文件结构...#globalblockevents{#eventsblock...}http#httpblock{...#httpglobalblockserver#serverblock{...#serverglobalblocklocation[PATTERN]#locationblock{...}location[PATTERN]{...}}server{...}...#httpglobalblock}Nginx配置文件由三部分组成:Globalblock,主要设置一些影响Nginx服务器配置说明的整体运行。例如:worker_processes1;worker_processes的值越大,可以支持的并发处理越多。事件块,涉及的指令主要影响Nginx服务器与用户之间的网络连接。例如:worker_connections1024;支持的最大连接数。HTTPblock,包括HTTPglobalblock和Serverblock,是服务器配置中使用频率最高的部分,包括代理、缓存、日志定义等大部分功能的配置。服务器块:配置虚拟主机的相关参数。Location块:配置请求路由和各种页面的处理。②配置文件###########每条命令必须以分号结尾。##################用户管理员管理员;#配置用户或组,默认是nobodynobody。#worker_processes2;#允许生成的进程数,默认为1#pid/nginx/pid/nginx.pid;#指定nginx进程运行文件的存放地址error_loglog/error.logdebug;#制定日志路径和水平。这个设置可以放在全局块、http块、服务器块中,级别如下:debug|info|notice|warn|error|crit|alert|emergevents{accept_mutexon;,默认为onmulti_accepton;#设置进程是否同时接受多个网络连接,默认关闭#useepoll;#事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportworker_connections1024;#最大连接数,默认为512}http{includemime.types;#文件扩展名和文件类型映射表default_typeapplication/octet-stream;#默认文件类型,默认为text/plain#access_logoff;#取消服务日志log_formatmyFormat'$remote_addr–$remote_user[$time_local]$request$status$body_bytes_sent$http_referer$http_user_agent$http_x_forwarded_for';#自定义格式access_loglog/access.logmyFormat;#combined是日志格式的默认值sendfileon;#允许sendfile传输文件,默认关闭,您可以http块、服务器块、位置块。sendfile_max_chunk100k;#每个进程每次调用的传输次数不能大于设置值,默认为0,即没有上限。keepalive_timeout65;#连接超时,默认75s,可以在http、server、location块中。upstreammysvr{server127.0.0.1:7878;server192.168.10.121:3333backup;#双机热备}error_page404https://www.baidu.com;#错误页面server{keepalive_requests120;#最大单连接请求数。listen4545;#监听端口server_name127.0.0.1;#监听地址位置~*^.+${#请求的url过滤,正则匹配,~区分大小写,~*不区分大小写。#rootpath;#根目录#indexvv.txt;#设置默认页面proxy_passhttp://mysvr;#请求重定向到mysvr定义的服务器列表deny127.0.0.1;#Rejectedipallow172.18.5.54;#Allowedip}}}配置示例下面配置Nginx配置文件,实现Nginx正向代理、反向代理、负载均衡、Nginx缓存、动静分离、高可用六大功能,进一步分析Nginx的原理。需要使用Nginx配置文件时,参考本文示例即可,推荐收藏。①正向代理正向代理的代理对象是客户端。正向代理是指代理服务器为客户端访问目标服务器。实现效果:在浏览器中输入www.google.com,浏览器会跳转到www.google.com。具体配置:server{resolver8.8.8.8;listen80;location/{proxy_passhttp://$http_host$request_uri;}}在需要访问外网的客户端上,执行以下操作之一:1.方法一(推荐)exporthttp_proxy=http://你的正向代理服务器地址:代理端口2.方法2vim~/.bashrcexporthttp_proxy=http://你的正向代理服务器地址:代理端口②反向代理reverseproxy是指代理的一个中间服务器,端服务器响应客户端请求,代理的对象是服务器。实现效果:在浏览器中输入www.abc.com,从Nginx服务器跳转到Linux系统Tomcat的主页面。具体配置:server{listen80;server_name192.168.4.32;#监听地址位置/{roothtml;#/html目录proxy_passhttp://127.0.0.1:8080;#请求重定向到indexindex.htmlindex.htm;#设置默认页面}}实现效果:根据浏览器输入的路径,跳转到不同端口的服务。具体配置:server{listen9000;server_name192.168.4.32;#监听地址location~/example1/{proxy_passhttp://127.0.0.1:5000;}location~/example2/{proxy_passhttp://127.0.0.1:8080;}}location指令说明:~:表示uri包含正则表达式,区分大小写。~*:表示uri包含正则表达式,不区分大小写。=:表示uri不包含正则表达式,需要严格匹配。③负载均衡效果:在浏览器地址栏输入http://192.168.4.32/example/a.html,平均到5000和8080端口,达到负载均衡效果。具体配置:upstreamserver{server192.167.4.32:5000;server192.168.4.32:8080;}server{listen80;#监听端口server_name192.168.4.32;#监听地址位置/{roothtml;#html目录索引index.htmlindex.htm;#设置默认页面proxy_passhttp://myserver;#请求到myserver定义的服务器列表}}Nginx分发服务器策略:轮询(默认):按照请求时间的先后顺序一个一个的,如果服务器是下来,它可以自动删除。权重:权重越高,分配的客户端越多,默认为1。例如:upstreammyserver{server192.167.4.32:5000weight=10;server192.168.4.32:8080weight=5;}IP:根据请求IP的哈希值,每个访问者定时访问一台后端服务器。例如:upstreamserver{ip_hash;server192.167.4.32:5000;server192.168.4.32:8080;}公平:根据后端服务器的响应时间分配,响应时间短的请求优先分配。例如:upstreamserver{fair;server192.168.4.32:5000;server192.168.4.32:8080;}④Nginx缓存实现效果:3天内,通过浏览器地址栏访问http://192.168.4.32/a.jpg,资源不会从服务器上取,3天后(过期)会从服务器上重新下载。具体配置:#http区添加缓存区配置proxy_cache_path/tmp/nginx_proxy_cachelevels=1keys_zone=cache_one:512minactive=60smax_size=1000m;#server区添加缓存配置位置~\.(gif|jpg|png|htm|html|css|js)(.*){proxy_passhttp://192.168.4.32:5000;#如果没有缓存,转向请求proxy_redirectoff;proxy_cachecache_one;proxy_cache_valid2001h;#为不同的HTTP状态码设置不同的缓存时间proxy_cache_valid5001d;proxy_cache_validany1m;expires3d;}expires是为一个资源设置一个过期时间。通过设置Expires参数,浏览器可以缓存过期时间之前的内容,减少服务器与服务器之间的请求和流量。也就是说不需要去服务器验证,直接通过浏览器本身就可以确认是否过期,所以不会产生额外的流量。这种方法非常适合不经常更改的资源。⑤动静分离的效果:通过浏览器地址栏访问www.abc.com/a.html,访问静态资源服务器的静态资源内容。通过浏览器地址栏访问www.abc.com/a.jsp,访问动态资源服务器的动态资源内容。具体配置:upstreamstatic{server192.167.4.31:80;}upstreamdynamic{server192.167.4.32:8080;}server{listen80;#监听端口server_namewww.abc.com;监听地址#拦截动态资源位置~.*\.(php|jsp)${proxy_passhttp://dynamic;}#拦截静态资源位置~.*\.(jpg|png|htm|html|css|js)${root/data/;#html目录proxy_passhttp://static;autoindexon;;#自动打开文件列表}}⑥高可用正常情况下,通过Nginx主服务器访问后台目标服务集群。当主服务器挂掉后,会自动切换到备份服务器,此时备份服务器将作为主服务器角色访问后端目标服务器。实现效果:准备两台Nginx服务器,通过浏览器地址栏访问虚拟IP地址,停止主服务器的Nginx,再次访问虚拟IP地址仍然有效。具体配置:#installkeepalivedyuinstallkeepalived-y#查看版本rpm-q-akeepalivedkeepalived-1.3.5-16.el7.x86_641。在两台Nginx服务器上安装Keepalived:Keepalived相当于一个路由,通过脚本检测当前服务器是否还活着,如果还活着,则继续访问,否则切换到另一台备份服务器。2、修改主备服务器的/etc/keepalived/keepalivec.conf配置文件(可直接替换),完成高可用主从配置。Keepalived将Nginx服务器绑定到一个虚拟IP,Nginx高可用集群将这个虚拟IP暴露给外界。客户端通过访问这个虚拟IP来访问Nginx服务器。global_defs{notification_email{acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from_Alexandre.Cassen@firewall.locsmtp_server192.168.4.32smtp_connect_timeout30router_idLVS_DEVEL#在rretc/hosts文件中,我们可以通过pp_的http_script访问host的配置在rretc/hosts文件中。script"/usr/local/src/nginx_check.sh"interval2#检查脚本执行的时间间隔weight2#每次加2个权重}vrrp_instanceVI_1{interfaceens7f0#网卡,需要修改stateMASTER#在备份服务器上,改MASTERtoBACKUPvirtual_router_id51#主备机的virtual_router_id必须相同priority100#主备机优先级不同,主机值大,备机值小advert_int1#每次发送心跳多长时间(default1s)检测服务器是否还活着authentication{auth_typePASSauth_pass1111}virtual_ipaddress{192.168.1.100#VRRPH虚拟地址,可以绑定多个}}字段如下:router_id:配置在/etc/hosts文件中,通过它我们可以访问我们的主人。127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6127.0.0.1LVS_DEVELinterval:设置脚本执行的间隔时间。weight:当脚本执行失败,即Keepalived或Nginx挂掉时,权重增加的值(可以为负数)。interface:输入ifconfig命令查看当前网卡名称是什么。ens7f0:flags=4163
