NGINX联合创始人安德鲁·阿列克谢耶夫(AndrewAlexeev)曾说过:NGINX是为那些对Apache性能不满意的人打造的。随着Internet需求的变化,Web服务器的工作也会发生变化。NGINX旨在比以往任何时候都更高效、更具可扩展性、更安全和更健壮。本文提供Nginx的基本概念和知识。基于开发者必备的Nginx基础知识,列出一些Nginx教程,希望对大家有所帮助。1、环境服务器版本:CentOS7.2为了保证学习阶段不遇到奇怪的事情,请保证以下四点:确认系统网络可用,确认yum可用,确认iptables关闭,并且selinuxisdisabled#查看iptablesstatussystemctlstatusfirewalld.service#关闭防火墙(暂时关闭)systemctlstopfirewalld.service#查看SELinuxstatusgetenforce#暂时关闭SELinuxsetenforce0安装一些基本的系统工具,一般情况下,系统yum-yinstallgccgcc-c++autoconfpcrepcre-develmakeautomakeyum-yinstallwgethttpd-toolsvim2.基本概念2.1什么是Nginx?Nginx是一款高性能的http和反向代理服务器,特点是占用内存小,并发性强。Nginx是专门为性能优化而开发的。性能是其最重要的考虑因素。经得起高负荷的考验。据介绍,它最多可以支持50,000个并发连接。2.2正向代理和反向代理为了方便理解,我们先来了解一些基础知识,nginx是一款高性能的反向代理服务器,那么什么是反向代理呢?代理是服务器和客户端之间的假设服务器层。代理会收到客户端的请求并转发给服务器,然后将服务器的响应转发给客户端。不管是正向代理还是反向代理,都实现了以上功能。如果你对OSI七层模型和TCP/IP四层模型不是很熟悉,可以再复习一遍。正向代理正向代理(forwardproxy)是指客户端和原始服务器(originserver)之间的一个服务器,为了从原始服务器获取内容,客户端向代理发送请求并指定目标(originserver),以及然后代理将请求转发给源站服务器,并将获取到的内容返回给客户端。正向代理是给我们的,也就是给客户端的。客户端可以根据正向代理访问自己无法访问的服务器资源。正向代理对我们是透明的,对服务器是不透明的,即服务器不知道自己收到的访问是来自代理还是真实客户端。反向代理(ReverseProxy)模式是指代理服务器接受Internet上的连接请求,然后将请求转发给内网服务器,并将从服务器得到的结果返回给Internet上请求的连接请求。客户端,此时代理服务器对外充当反向代理服务器。反向代理服务于服务器。反向代理可以帮助服务端接收客户端的请求,帮助服务端转发请求,负载均衡等。反向代理对服务端是透明的,对我们是不透明的,即我们不知道自己访问的是一个代理服务器,但是服务器知道反向代理在为他服务。2.3负载均衡如果请求数量过多,单台服务器解决不了,我们增加服务器的数量,然后将请求分发到每台服务器上,将原来请求单台服务器改为请求分发到多台服务器,这是负载平衡。Upstream指定后端服务器地址列表,在服务器中拦截响应请求,将请求转发到Upstream中配置的服务器列表。`上游平衡服务器{服务器10.1.22.33:12345;服务器10.1.22.34:12345;服务器10.1.22.35:12345;}服务器{server_namefe.server.com;听80;location/api{alanceassbverhttp://proxy_p}}`上面的配置只指定了nginx需要转发的服务器列表,并没有指定分配策略。默认采用轮询策略,将所有客户端请求轮询分配给服务端。这种策略可以正常工作,但是如果其中一台服务器压力过大,出现延迟,就会影响分配给这台服务器的所有用户。Nginx支持的负载均衡调度算法如下:权重轮询(默认,常用):接收到的请求根据权重分配到不同的后端服务器,即使在使用过程中某个后端服务器挂掉,Nginx也会服务器会自动从队列中移除,请求接受不会受到任何影响。这样就可以为不同的后端服务器设置一个权重值(weight)来调整请求在不同服务器上的分配比例;权重数据越大,分配给请求的概率越大;权重值,主要针对实际工作环境中不同的后端服务器硬件配置进行调整。ip_hash(常用):每个请求根据发起客户端IP的哈希结果进行匹配。通过这种算法,固定IP地址的客户端会一直访问同一个后端服务器,也一定程度上解决了集群部署的问题。环境中session共享的问题。公平:智能调整调度算法,根据后端服务器从请求处理到响应的时间动态均衡分配。响应时间短、处理效率高的服务器被分配给请求的概率高,响应时间长、处理效率低的服务器被分配。更少的请求;一种综合了前两者优点的调度算法。不过需要注意的是,Nginx默认是不支持fair算法的。如果你想使用这个调度算法,请安装upstream_fair模块。url_hash:根据访问的url的哈希结果分配请求。每个请求的url都会指向后端固定的服务器,这样可以提高Nginx作为静态服务器时的缓存效率。另请注意,Nginx默认不支持此调度算法。如果要使用,需要安装Nginx的hash包。2.4动静分离为了加快服务器的解析速度,可以将动态页面和静态页面分别交给不同的服务器进行解析,加快了解析速度,减轻了原有单体服务器的压力。2.5Nginx常用命令#快速关闭Nginx,可能不保存相关信息,快速终止web服务nginx-sstop#顺利关闭Nginx,保存相关信息,有序结束web服务nginx-squit#由于Nginx相关配置发生变化,需要重新加载配置并重载配置文件。nginx会检查配置文件语法的正确性并尝试打开配置文件中引用的文件nginx-t#显示nginx的版本nginx-v#显示nginx的版本、编译器版本和配置参数nginx-V#FormatChangetodisplaynginxconfigurationparameters2>&1nginx-V|xargs-n12>&1nginx-V|xargs-n1|greplua3.为什么选择Nginx?Nginx是一个免费、开源、高性能的HTTP服务器和反向代理服务器;它还是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为网站发布处理的HTTP服务器,Nginx可以作为反向代理服务器,通过代理实现负载均衡。在Nginx网站上,它的功能包括:用于静态内容的HTTP和HTTPS(TLS/SSL/SNI)的超快速Web服务器用于动态内容的FastCGI、WSGI、SCGI具有负载平衡和缓存的加速Web代理不间断的实时二进制升级和配置压缩和内容过滤器虚拟主机FLV和MP4媒体流带宽和连接策略全面的访问控制自定义日志记录嵌入式脚本邮件代理逻辑用于SMTP/IMAP/POP3和TLS灵活和可扩展配置nginx以在Linux、FreeBSD、MacOSX、Solaris和Windows有以下优点:1.如何理解epoll的IO多路复用(IOmultiplexing)?举个例子!有A、B、C三位老师,他们都遇到了一个问题,想帮班里的同学解决作业。A老师从第一排开始,一次回答一个学生的问题。A老师浪费了很多时间,有的学生在老师来之前作业还没做完,效率极低。B老师是忍者。他发现A老师的方法行不通,就用影子分身术造了几个自己,帮助几个同学同时答题。还没等他回答完,B老师就用尽了体力崩溃了。C老师比较精明。他告诉同学们,谁完成了作业就举手,他就对举手的同学进行指导。他让学生说出来,把“并发”分开。这个C老师就是Nginx。2.更少的轻量级功能模块——Nginx只保留HTTP需要的模块,其余使用插件,加入代码模块化——更适合二次开发,如AlibabaTengine3。CPUaffinity结合了CPU核心和NginxWorker进程绑定,固定每个worker进程在一个CPU上执行,减少切换CPU时的cachemiss,从而提高性能。四、Nginx的安装1、在本地安装windows系统:直接到官网:https://nginx.org/en/download...下载对应版本。Mac系统:$brewinstallnginx2.Linux安装:以centOS系统为例,有两种安装方式(推荐1)1.)通过rpm安装$rpm-ivhhttp://nginx.org/packages/centosimagesource/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm$yuminstall-ynginx2.)nginx依赖库安装详解pcre,zlib$yuminstallpcrepcre-devel$yuminstallzlibzlib-devel如果有必要,可以安装c++编译环境和openssl$yuminstallgcc-c++$yuminstallopensslopenssl-devel下载/编译nginx$wget-chttps://nginx.org/download/nginx-1.16.0.tar.gz$tar-zxvfnginx-1.16.0.tar.gz#编译安装$cdnginx-1.16.0$./configure#默认安装在/usr/local/nginx$make&&makeinstall#创建软链$ln-s/usr/local/nginx/sbin/nginx/usr/local/sbin/nginx$nginx-v五.Nginx配置#打开主配置文件,如果是使用lnmp环境安装vim/usr/local/nginx/conf/nginx.conf---------------------------------------user#设置nginx服务的系统使用userworker_processes#工作进程数一般与CPU核数一致error_log#nginxerrorlogpid#pideventswhennginxstarts{worker_connections#每个进程允许使用的最大连接数#nginx使用的内核模型}我们使用nginx的http服务,在配置文件nginx.conf中的http区域配置了无数台服务器,每台服务器对应这个虚拟主机或者域名http{......#http配置项目后面会详细介绍。server{listen80#监听端口;server_namelocalhost#addresslocation/{#访问主页路径root/xxx/xxx/index.html#default目录indexindex.htmlindex.htm#defaultfile}error_page500504/50x.html#上面的时候重新定义为50x.html出现状态码location=/50x.html{#当访问50x.htmlroot/xxx/xxx/html#50x.html页面位置}}server{......}}一个服务器可以有多个位置。我们针对不同的情况配置不同的访问路径。下面我们看一下http的配置细节。http{sendfileon#高效文件传输模式必须开启keepalive_timeout65#客户端服务器请求超时log_formatmainXXX#定义日志格式代码为mainaccess_log/usr/local/access.logmain#日志保存地址格式代码main}以下是nginx的一些配置常用的内置全局变量,你可以在配置的任何地方使用它们。六。Nginx实战各种开发工具的配置结合实战,会让人更容易理解。先实现一个小目标:不管配置复杂,只完成一个http反向代理。nginx.conf配置文件如下:注:_conf/nginx.conf是nginx的默认配置文件。也可以使用nginx-c来指定你的配置文件_#runninguser#usersomebody;#启动进程,一般设置为等于cpu个数worker_processes1;#全局错误日志error_logD:/Tools/nginx-1.10.1/logs/error.log;error_logD:/Tools/nginx-1.10.1/logs/notice.lognotice;error_logD:/Tools/nginx-1.10.1/logs/info.loginfo;#PID文件,记录当前启动的nginx的进程IDpidD:/Tools/nginx-1.10.1/logs/nginx.pid;#工作模式和连接数上限事件{worker_connections1024;#单个后台工作进程最大并发连接数}#Set设置http服务器,利用其反向代理功能提供负载均衡支持http{#设置mime类型(邮件支持类型),类型由mime.types文件包括D:/Tools/nginx-1.10.1/conf/mime.types;default_type应用程序/八位字节流;#Setloglog_formatmain'[$remote_addr]-[$remote_user][$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_for"';access_logD:/Tools/nginx-1.10.1/logs/access.logmain;重写登录;#sendfile指令指定nginx是否调用sendfile函数(零拷贝模式)输出文件。对于普通应用,#必须设置为开启,如果用于下载等磁盘IO负载较大的应用,可以设置为关闭,以平衡磁盘和网络I/O的处理速度,减少系统的正常运行时间。发送文件;#tcp_nopush上;#连接超时keepalive_timeout120;tcp_nodelayon;#gzip压缩开关#gzipon;#设置实际服务器列表upstreamzp_server1{server127.0.0.1:8089;}#HTTPserverserver{#监听80端口,这是HTTP协议listen80的知名端口号;#定义使用www.xx.com访问server_namewww.helloworld.com;#首页索引index.html#指向webapp目录根目录D:01_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebapp;#编码格式charsetutf-8;#代理配置参数proxy_connect_timeout180;proxy_send_timeout180;proxy_read_timeout180;proxy_set_header主机$host;proxy_set_headerX-Forwarder-For$remote_addr;/zp_server1;}#静态文件,nginx自己处理locati在~^/(images|javascript|js|css|flash|media|static)/{rootD:01_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebappviews;#expired30天,静态文件更新不多,expired可以设置大一些,如果经常更新可以设置小一些expires30d;}#设置查看Nginx状态的地址location/NginxStatus{stub_statuson;访问登录;auth_basic"Nginx状态";auth_basic_user_fileconf/htpasswd;}#禁止访问.htxxx文件位置~/.ht{全部拒绝;}#错误处理页面(可选配置)#error_page404/404.html;#error_page500502503504/50x.html;#location=/50x.html{#根html;#}}}好,我们试试:启动webapp,注意开始绑定的端口要和nginx中上游设置的端口一致。更改host:在C:WindowsSystem32driversetc目录下的host文件中添加一条DNS记录127.0.0.1Startwww.helloworld.com启动上一篇中的startup.bat命令在浏览器中访问www.helloworld.com,不出意外,它已经可以访问了。搭建文件服务器有时候,团队需要对一些数据或资料进行归档,那么文件服务器是必不可少的。使用Nginx可以非常快速方便??的搭建一个简单的文件服务。Nginx中的配置要点:开启autoindex显示目录,默认不开启。打开autoindex_exact_size以显示文件大小。开启autoindex_localtime显示文件的修改时间。root用于设置文件服务打开的根路径。charset设置为charsetutf-8,gbk;,可以避免中文乱码。最简单的配置如下:autoindexon;#显示目录autoindex_exact_sizeon;#显示文件大小autoindex_localtimeon;#显示文件时间服务器{charsetutf-8,gbk;#在windowsserver下设置后,字符还是乱码,暂时没有解决办法listen9050default_server;听[::]:9050默认服务器;服务器名称_;根目录/共享/fs;nginx入门到这里基本就结束了。我希望能有所帮助。
