Nginx的作用Nginx是一款自由的开源的高性能的HTTP服务器和反向代理服务器同时也是一个IMAPPOP3SMTP代理服务器Nginx可以作为一个HTTP服务器进行网站的发布处理另外nginx可以作为反向代理进行负载均衡的实现nginx在19版本之后可以充当端口转发的作用即访问该服务器的指定端口nginx就可以充当端口转发的作用将流量导向另一个服务器同时获取目标服务器的返回数据并返回给请求者nginx的TCP代理功能跟nginx的反向代理不同的是请求该端口的所有流量都会转发到目标服务器而在反向代理中可以细化哪些请求分发给哪些服务器另一个不同的是nginx做TCP代理并不仅仅局限于WEB的URL请求还可以转发如memcachedMySQL等点到点的请求Nginx的安装在线安装下载及相关组件进入用户目录下载程序下载相关组件rootlocalhostsrcwgethttpnginxorgdownloadnginx1102targz省略安装内容rootlocalhostsrcwgethttpwwwopensslorgsourceopensslfips2010targz省略安装内容rootlocalhostsrcwgethttpzlibnetzlib1211targz省略安装内容rootlocalhostsrcwgetftpftpcsxcamacukpubsoftwareprogrammingpcrepcre840targz省略安装内容安装c编译环境如已安装可略过rootlocalhostsrcyuminstallgccc省略安装内容期间会有确认提示输入y回车IsthisokyNy省略安装内容安装及相关组件openssl安装rootlocalhostsrctarzxvfopensslfips2010targz省略安装内容rootlocalhostsrccdopensslfips2010rootlocalhostopensslfips2010configampampmakeampampmakeinstall省略安装内容pcre安装rootlocalhostsrctarzxvfpcre840targz省略安装内容rootlocalhostsrccdpcre840rootlocalhostpcre840configureampampmakeampampmakeinstall省略安装内容zlib安装rootlocalhostsrctarzxvfzlib1211targz省略安装内容rootlocalhostsrccdzlib1211rootlocalhostzlib1211configureampampmakeampampmakeinstall省略安装内容nginx安装rootlocalhostsrctarzxvfnginx1102targz省略安装内容rootlocalhostsrccdnginx1102rootlocalhostnginx1102configureampampmakeampampmakeinstall省略安装内容启动先找一下安装到什么位置上了进入目录并启动报错了errorwhileloadingsharedlibrarieslibpcreso1cannotopensharedobjectfileNosuchfileordirectory按照下面方式解决1用whereislibpcreso1命令找到libpcreso1在哪里2用lnsusrlocalliblibpcreso1lib64命令做个软连接就可以了3用sbinnginx启动Nginx4用psauxgrepnginx查看状态rootlocalhostnginxwhereislibpcreso1rootlocalhostnginxlnsusrlocalliblibpcreso1lib64rootlocalhostnginxsbinnginxrootlocalhostnginxpsauxgrepnginx离线安装安装环境选首先安装这几个软件GCCPCREPerlCompatibleRegularExpressionzlibOpenSSLNginx是C写的需要用GCC编译Nginx的Rewrite和HTTP模块会用到PCRENginx中的Gzip用到zlib用命令gcc查看gcc是否安装如果出现gccnoinputfiles信息说明已经安装好了否则就需要用命令yuminstallgcc进行安装了一路可能需要多次输入y进行确认安装好后可以再用命令gcc测试或者用命令gccv查看其版本号同样方法用如下命令安装PCREzlibOpenSSL其中devel是develop开发包的意思Yuminstallygccyuminstallypcrepcredevelyuminstallyzlibzlibdevelyuminstallyopensslopenssldevel下载好nginx安装包并导入到虚机某一个目录下cdnginx173configuremakemakeinstallwhereisnginx可以看到安装完的nginx在usrlocalnginx目录下进入usrlocalnginxsbin执行nginx将nginx服务起起来此时可以通过访问这台虚机ip地址的80端口查看nginx服务时是否正常也可以通过psauxgrepnginx查看服务时是否正常Nginx使用Nginx基本操作启动nginx进入sbin目录rootlocalhostsbinnginx关闭nginxrootlocalhostsbinnginxsstopstop以后需要再次执行nginx来启动nginx服务推荐使用rootlocalhostsbinnginxsquit重启nginx1先关闭后启动2刷新配置文件rootlocalhostsbinnginxsreloadNginx七层应用场景多服务器不同端口反向代理场景描述ClientZ需要访问服务器A和服务器B的80端口但是Z无法直接访问A和B需要经过Nginxserver进行反向代理当Z访问19216811163的7777端口时Nginxserver代理跳转到A的80端口上当Z访问19216811163的8888端口时Nginxserver代理跳转到B的80端口上1修改配置文件路径Nginx的反向代理配置文件路径usrlocalnginxconfnginxconf其中conf目录下还有个配置文件nginxconfdefault如果nginxconf配置文件修改错误无法修复可以使用default文件进行恢复default文件为模板2单台服务器反向代理测试访问规则Z访问19216811163的7777端口时跳转到A的80端口上配置文件如下注意请关闭三台服务器的firewalldiptables和selinux或者在防火墙上允许这些端口4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545eventsworkerconnections1024httpupstreamserveraserver172162021580keepalive2000serverlisten7777servername19216811163clientmaxbodysize1024MlocationproxypasshttpserveraproxysetheaderHosthostserverport4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545修改完配置文件后重启nginx进入nginx目录usrlocalnginxsbin运行nginxsreload再运行nginx开启nginx在Z上使用浏览器打开192168111637777访问规则Z访问19216811163的8888端口时跳转到B的80端口上配置文件如下4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545eventsworkerconnections1024httpupstreamserveraserver172162021680keepalive2000serverlisten8888servername19216811163clientmaxbodysize1024MlocationproxypasshttpserveraproxysetheaderHosthostserverport45454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545453两台服务器同时反向代理测试访问规则当Z访问nginxserver的192168111637777时反向代理到serverA的80端口当Z访问nginxserver的192168111638888时反向代理到serverB的80端口配置文件如下4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545eventsworkerconnections1024httpupstreamserveraserver172162021580keepalive2000upstreamserverbserver172162021680keepalive2000serverlisten7777servername19216811163clientmaxbodysize1024MlocationproxypasshttpserveraproxysetheaderHosthostserverportserverlisten8888servername19216811163clientmaxbodysize1024MlocationproxypasshttpserverbproxysetheaderHosthostserverport4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545修改完配置文件后重启nginx进入nginx目录usrlocalnginxsbin运行nginxsreload再运行nginx开启nginx服务器负载均衡反向代理场景描述某公司搭建一个web站点由于访问流量过大单台web服务器已经无法满足应用现需要在后端增加一台web服务器在前端nginxserver上需要对后端两个webserverA和B同时进行反向代理当clientZ向nginxserver发起访问请求时第一次会反向代理到serverA第二次会被代理到serverB由于serverA和B的应用相同所以无论解析到哪台server上都可以所以nginx上不需求配置两个不同的端口只要按照一定的负载均衡规则负载到后端的服务器上即可访问规则clientZ第一次访问19216811163666时代理到serverA的页面第二次访问19216811163666时代理到serverB的页面配置文件如下4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545eventsworkerconnections1024httpupstreamserverabserver172162021580server172162021680keepalive2000serverlisten666servername19216811163clientmaxbodysize1024MlocationproxypasshttpserverabproxysetheaderHosthostserverport4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545修改完配置文件后重启nginx进入nginx目录usrlocalnginxsbin运行nginxsreload再运行nginx开启nginxUpstream模块中默认不做任何配置的情况下为轮询负载均衡负载均衡模式普通轮询负载也就是322介绍的负载均衡模式后端服务器权重一样当nginx收到请求时平均分配到后端的服务器上加权轮询负载按照权重进行轮询这就是所谓的加权轮询看起来很简单但是最早使用的加权轮询算法有个问题就是7个请求对应的后端序列是这样的cbaaaaa会有5个连续的请求落在后端a上分布不太均匀目前使用的加权轮询叫做平滑的加权轮询smoothweightedroundrobinbalancing它和前者的区别是每7个请求对应的后端序列为aabacaa转发给后端a的5个请求现在分散开来不再是连续的例如4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545httpupstreamclusterserveraweight5serverbweight1servercweight1serverlisten80locationproxypasshttpcluster4545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545按照上述配置Nginx每收到7个客户端的请求会把其中的5个转发给后端a把其中的1个转发给后端b把其中的1个转发给后端c除了轮询和权重轮询以外还包含下面三种算法IPHash需要在upstream的配置中知道iphash每个请求按访问的ip的hash结果分配这样每个放歌固定访问一个后端服务器可以解决session的问题fair需要在upstream的配置中指定fair按后端服务器的响应时间来分配请求响应时间短的优先分配URLhash需要在upstream中配置指定hashrequesturihashmethodcrc32按访问url的hash结果来分配请求使每个url定向到同一个后端服务器后端服务器为缓存时比较有效另外在niginx中可以为每个backendserver指定最大的重试次数和重试时间间隔所有使用的关键字是maxfails和failtimeout而backup值的是仅当其他serverdown或者忙时才会请求这台server例如upstreamdebugoserversserverdebugo0180weight5backupserverdebugo0280weight10maxfails3failtimeout30sNginx四层应用场景nginx从190开始新增加了一个stream模块用来实现四层协议的转发代理或者负载均衡等比如在内网有一个四层应用服务想暴露到公网上去使用就可以通过nginx代理的方式通过nginx来进行内网四层应用的访问