一、简介
Nginx是一款免费开源的高性能HTTP服务器及反向代理服务器(Reverse Proxy)产品,同时,它还提供IMAP/POP3代理服务等功能。能够快速响应静态页面(HTML)的请求;支持FastCGI、SSL、Virtual Host、URL Rewrite、HTTP Basic Auth、Gzip等大量使用功能,并且支持第三方功能模块的扩展。其特点是占有内存少,并发能力强。
Nginx提供的基本功能从大体上归纳为基本HTTP服务、高级HTTP服务和邮件服务等三大类。
1、Nginx提供基本HTTP服务,可以作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等
2、Nginx提供高级HTTP服务,可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等
3、Nginx作为邮件代理服务器是最早开发这个产品的目的之一,它支持IMAP/POP3代理服务功能,支持内部SMTP代理服务功能
代理:
反向代理:代理服务器接收客户端请求
正向代理:代理客户端请求服务器(代理客户端的请求去访问客户端不能访问的网站,如常见的翻墙工具,游戏代理)
反向代理典型应用场景:
将防火墙后面的服务器提供给Internet用户访问,加强安全防护。还可以为后端的多台服务器提供负载均衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启动高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
为什么使用反向代理,原因如下:
1)、保护和隐藏原始资源服务器
2)、加密和 SSL 加速
3)、通过缓存静态资源,加速 Web 请求
4)、实现负载均衡
负载均衡:
用来在多个计算机集群、网络资源、CPU、磁盘驱动或其他资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
对于互联网服务,负载均衡通过软件监听一个外部端口,用户通过这个端口来访问服务,而作为负载均衡器的软体会将用户的请求转发给后台内网服务器,内网服务器将请求的响应返回给负载均衡器,负载均衡器再将响应发送到用户,这样就向互联网用户隐藏了内网结构,阻止了用户直接访问后台(内网服务器),使得服务器更加安全,可以阻止对核心网络栈和运行在其他端口服务的攻击。
当所有后台服务器均出现故障时,有些负载均衡器会提供一些特殊的功能来处理这种情况。如转发请求到一个备用的负载均衡器、显示一条关于服务中断的消息等来提高容错能力。
nginx是常用的HTTP请求负载均衡器。
Nginx、Apache 和 Tomcat的区别:
Nginx:轻量级、高并发 HTTP 服务器。
Apache HTTP Server Project:一个 Apache 基金会下的 HTTP 服务项目,和 Nginx 功能类似。
Apache Tomcat:是 Apache 基金会下的另外一个项目,是一个 Application Server。更准确的说是一个 Servlet 应用容器,与 Apache HTTP Server 和 Nginx 相比,Tomcat 能够动态的生成资源并返回到客户端。
二、安装配置
1、nginx安装(ubuntu):sudo apt-get install nginx
nginx文件安装完成之后的文件位置:
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
nginx命令:
查看是否安装成功:nginx -v
启动:./nginx ,若是端口占用,使用命令netstat -anp | grep 80,找到pid,kill -9 pid 即可
更改配置重启:./nginx -s reload,每次修改后,都需要清理一下浏览器缓存
判断配置文件是否正确:./nginx -t
关闭:ps -ef|grep nginx,
kill -QUIT 主进程号 :从容停止Nginx
kill -TERM 主进程号 :快速停止Nginx
pkill -9 nginx :强制停止Nginx
2、nginx配置
nginx.conf的配置文件主要分为三部分:
1)、全局块
2)、Events块
3)、HTTP块
1、全局块用来配置对整个Server都有效的参数。包括配置运行 Nginx 服务器的用户(组)、允许生成的 Worker Process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。如:
user nobody; worker_processes 1; error_log logs/error.log;
2、Events块涉及的指令主要影响Nginx服务器与用户的网络连接
events { worker_connections 1024; // 每个work process支持的最大连接数为1024 }
3、HTTP块
代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:HTTP 块也可以包括 HTTP 全局块、Server 块。
1)、HTTP 全局块
HTTP 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
2)、Server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 HTTP 块可以包括多个 Server 块,而每个 Server 块就相当于一个虚拟主机。而每个 Server 块也分为全局 Server 块,以及可以同时包含多个 Locaton 块。
(1)、全局 Server 块:也被叫做“虚拟服务器”部分,它描述的是一组根据不同server_name指令逻辑分割的资源,这些虚拟服务器响应 HTTP 请求,因此都包含在 HTTP 部分。
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
server { listen 80; #server_name也支持通配符,*.example.com、www.example.*、.example.com server_name localhost; #charset koi8-r; #access_log logs/host.access.log main;
(2)、Location 块:一个 Server 块可以配置多个 Location 块。
Location 块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串(例如前面的 /uri-string)进行匹配,对特定的请求进行处理。
地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
nginx配置语法:
1、配置文件由指令和指令块构成
2、每条指令以分号(;)结尾,指令和参数间以空格符分隔
3、指令块以大括号{}将多条指令组织在一起
4、include 语句允许组合多个配置文件以提高可维护性
5、使用 # 添加注释
6、使用 $ 定义变量
7、部分指令的参数支持正则表达式
在/etc/nginx/nginx.conf 配置文件中,在http块的配置中包含了下面的内容:
include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;
因此,针对每个业务的配置,只需在/etc/nginx/conf.d/ 文件夹下创建一个 xxx.conf的配置文件,在其中配置server块的内容即可。
3、配置内容详解
worker_process # 表示工作进程的数量,一般设置为cpu的核数 worker_connections # 表示每个工作进程的最大连接数 server{} # 块定义了虚拟主机 listen # 监听端口 server_name # 监听域名 location {} # 是用来为匹配的 URI 进行配置,URI 即语法中的“/uri/” location /{} # 匹配任何查询,因为所有请求都以 / 开头 root # 指定对应uri的资源查找路径,这里html为相对路径,完整路径为 # /opt/nginx-1.7.7/html/ index # 指定首页index文件的名称,可以配置多个,以空格分开。如有多# 个,按配置顺序查找。
1、location配置
location匹配规则:
语法规则:location [=|~|~*|^~] /uri/ { … }
符号 | 含义 |
= | 开头表示精准匹配 |
^~ | 开头表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为 /static/20%/aa ,可以被规则 ^~/static/ /aa 匹配到(注意是空格) |
~ | 开头表示表示区分大小写的正则匹配 |
~* | 开头表示不区分大小写的正则匹配 |
/ | 通用匹配,任何请求都会匹配到 |
多个 location 配置的情况下匹配顺序为:
首先匹配 =
其次匹配 ^~
其次是按文件中顺序的正则匹配
最后是交给 / 通用匹配
当有匹配成功时候,停止匹配,按当前匹配规则处理请求
location反向代理配置项:
location:对请求URI进行匹配,location后面配置了匹配规则,支持正则匹配
proxy_pass:proxy_pass后面跟着一个URL,用来将请求反向代理到URL参数指定的服务器上。
proxy_set_header:默认情况下,反向代理不会转发原请求中的Host头部,如果需要转发,就需要加上:proxy_set_header Host $host;
除了上面几个常用配置项,还有 proxy_redirect、proxy_set_body、proxy_limit_rate 等参数
反向代理Demo:实现访问www.123.com 直接跳转到自己的机器127.0.0.1:8080上
1):修改本机hosts文件,添加(127.0.0.1 www.123.com)将www.123.com映射到自己的机器ip上
2):修改nginx.conf配置文件,增加如下配置
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://127.0.0.1:8080;
}
2、nginx.conf 负载均衡配置
upstream配置示例:
upstream myserver{ ip_hash; server 192.168.10.13:80; server 192.168.10.14:80 down; server 192.168.10.15:8009 max_fails=3 fail_timeout=20s; server 192.168.10.16:8080; } server { location / { proxy_pass http://myserver; } }
注,upstream 是定义在 server{ } 之外的,不能定义在 server{ } 内部。定义好 upstream 之后,用 proxy_pass 引用一下即可。
upstream 是 Nginx 的 HTTP Upstream 模块,这个模块通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。在上面的设定中,通过 upstream 指令指定了一个负载均衡器的名称 test.net。这个名称可以任意指定,在后面需要用到的地方直接调用即可。
upstream 支持的负载均衡算法(后两项属于第三方调度算法):
1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,故障系统被自动剔除,使用户访问不受影响。
2、ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个ip的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题,电子商务网站比较常用
3、fair:比上面两个更加智能,可依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应短的优先分配。需要下载nginx的upstream_fair模块。
4、url_hash:按访问url的hash结果分配请求,使每个url固定到同一个后端服务器,需下载nginx的hash包
5、least_conn:最少连接负载均衡,即每次选择的后端都是当前最少连接的一个server
6、hash:这个 hash 模块又支持两种模式 hash, 一种是普通的 hash, 另一种是一致性 hash(consistent)
upstream 支持的状态参数
在 HTTP Upstream 模块中,可以通过 server 指令指定后端服务器的 IP 地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
1、down:表示当前的server暂时不参与负载均衡。
2、backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。
3、max_fails:允许请求失败的次数,默认为 1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
4、fail_timeout:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。
当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是backup,因为如果负载均衡把用户分配到了backup服务器上,则不能访问到页面。
4、Nginx Rewrite
Rewrite可以实现URL重写和重定向功能。如:下面对 /java 的请求重定向到了 /hello
server { listen 80; server_name 127.0.0.1; location / { proxy_pass http://127.0.0.1:8080; rewrite ^/java /hello/ rediret; }
Rewrite指令可以在Server块或Location块中配置,其基本语法如下:
rewrite regex replacement [flag];
1)、rewrite:实现URL重写的指令
2)、regex:用于匹配要操作的URI的正则表达式
3)、replacement:将regex正则匹配到的内容替换成replacement
4)、flag:标记,有如下值:
(1)last:本条规则匹配完成后,继续向下匹配新的Location URI规则(不常用)
(2)break:本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)
(3)redirect:返回302临时重定向,浏览器地址会显示跳转新的URL地址
(4)permanent:返回301永久重定向,浏览器会显示跳转新的URL地址
三、OpenResty
OpenResty(也称为ngx_openresty)是一个基于 Nginx 与 Lua 的高性能 Web 平台,它打包了Nginx的核心和很多的常用的第三方模块以及它们的大多数依赖项。用于方便地搭建能够处理高并发、扩展性极高的动态Web应用、Web服务和动态网关。
通过整合了众多设计良好的Nginx模块,OpenResty有效地把Nginx服务器转变为一个强大的Web应用服务器,基于它开发人员可以使用Lua变成语言对Nginx核心以及现有的各种NginxC模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的Web应用。
OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。