Nginx
概念
-
正向代理 和 反向代理
-
正向代理是客户端与正向代理客户端在同一局域网,客户端发出请求,正向代理 替代客户端向服务器发出请求。服务器不知道谁是真正的客户端,正向代理隐藏了真实的请求客户端。代理多数是帮助内网 client 访问外网 server 用的。 反向代理:服务器与反向代理在同一个局域网,客服端发出请求,反向代理接收请求 ,反向代理服务器会把我们的请求分转发到真实提供服务的各台服务器Nginx就是性能非常好的反向代理服务器,用来做负载均衡. 代理将来自外网客户端的请求转发到内网服务器,从外到内。
-
能做什么
反向代理
- 正向代理:特定情况下,代理用户访问服务器,需要用户手动的设置代理服务器的ip和端口号。
- 反向代理:是用来代理服务器,代理用户要访问的目标服务器。代理服务器接受请求,然后将请求转发给内部网络的服务器(服务集群模式),并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器。
负载均衡
-
Nginx 可使用的负载均衡策略有:轮询(默认)、 权重、 ip_hash、 url_hash(第三方)、least_conn, fair(第三方)。
-
负载均衡用于从 “upstream” 模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的 upstream 模块是这样的,模块内的 server 是服务器列表:
-
#动态服务器组 upstream dynamic_zuoyu { server localhost:8080; #tomcat 7.0 server localhost:8081; #tomcat 8.0 server localhost:8082; #tomcat 8.5 server localhost:8083; #tomcat 9.0 } 在 upstream 模块配置完成后,要让指定的访问反向代理到服务器列表: #其他页面反向代理到tomcat容器 location ~ .*$ { index index.jsp index.html; proxy_pass http://dynamic_zuoyu; }
-
动静分离
-
常用于前后端分离,Nginx 提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高
-
Nginx 可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在 Nginx 上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理
-
拿我们 Java 来说 jsp、servlet 等就是动,因为他们离开我们的 web 服务器的支持就会无法正常工作。而css、html、jpg、js 等文件就是静了。因为离开 web 服务器他一样能正常的工作。
-
Nginx如何做动静分离
Nginx 根据客户端请求的 url 来判断请求的是否是静态资源,如果请求的 url 包含 jpg、png,则由 Nginx 处理。如果请求的 url 是 .php 或者 .jsp 等等,这个时候这个请求是动态的,将转发给 tomcat 处理。
总结来说,Nginx 是通过 url 来区分请求的类型,并转发给不同的服务端
还能做什么
-
ip限流
-
限制所有单个ip的访问频率
http中的配置
http { #$limit_conn_zone:限制并发连接数 limit_conn_zone $binary_remote_addr zone=one1:10m; #limit_req_zone:请求频率 #$binary_remote_addr:以客户端IP进行限制 #zone=one:10m:创建IP存储区大小为10M,用来存储访问频率 #rate=10r/s:表示客户端的访问评率为每秒10次 limit_req_zone $binary_remote_addr zone=one2:10m rate=10r/s; }
server配置
server { listen 80; server_name localhost; location / { #限制并发数2 limit_conn one1 2; #burst:如果请求的频率超过了限制域配置的值,请求处理会被延迟 #nodelay:超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这个请求会被终止,并返回503 limit_req zone=one2 burst=10 nodelay; root html; index index.html index.htm; } }
-
-
配置黑白ip名单
-
配置说明(黑名单 deny, 白名单 allow)
-
可新建一个配置文件,如 blockip.conf。在其中编写相关的 ip 限制语句,然后在 nginx.conf 中加入如下配置:
# 配置ip限制策略 include blockip.conf;
-
nginx 会根据配置文件中的语句,从上至下依次判断。因此,写在前面的语句可能会屏蔽后续的语句。除部分 ip 白名单外,屏蔽所有 ip 的错误示例:
deny all; # 该语句已经禁止所有ip的访问,后续的配置不会生效 allow 123.45.25.6; allow 123.68.52.125; allow 123.125.25.106;
正确示例:
# 允许部分ip访问 allow 123.45.25.6; allow 123.68.52.125; allow 123.125.25.106; # 禁止其余ip访问 deny all;
-
屏蔽策略文件可以放在 http, server, location, limit_except 语句块中,我们可以根据需要合理的配置。
放置位置 效果 http nginx 中所有服务起效 server 指定的服务起效 location 满足的 location 下起效 limit_except 指定的 http 方法谓词起效 -
-
Nginx开启gzip压缩
- Nginx 开启 Gzip 压缩功能, 可以使网站的 css、js 、xml、html 文件在传输时进行压缩,提高访问速度, 进而优化 Nginx 性能。
- gzip 不一定适用于所有文件的压缩。例如,文本文件压缩得非常好,通常会缩小两倍以上。另一方面,诸如 JPEG或 PNG 文件之类的图像已经按其性质进行压缩,使用 gzip 压缩很难有好的压缩效果或者甚至没有效果
配置项
Nginx rewrite 常用的全局变量如下:
变量 | 说明 |
---|---|
$args | 存放了请求 url 中的请求指令。比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的arg1=value1&arg2=value2 |
$content_length | 存放请求头中的 Content-length 字段 |
$content_type | 存放了请求头中的 Content-type 字段 |
$document_root | 存放了针对当前请求的根路径 |
$document_uri | 请求中的 uri,不包含请求指令 ,比如比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 /server/source |
$host | 存放了请求 url 中的主机字段,比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 www.myweb.name 。如果请求中的主机部分字段不可用或者为空,则存放 nginx 配置中该 server 块中 server_name 指令的配置值 |
$http_user_agent | 存放客户端的代理 |
$http_cookie | cookie |
$limit_rate | nginx 配置中 limit_rate 指令的配置值 |
$remote_addr | 客户端的地址 |
$remote_port | 客户端与服务器端建立连接的端口号 |
$remote_user | 变量中存放了客户端的用户名 |
$request_body_file | 存放了发给后端服务器的本地文件资源的名称 |
$request_method | 存放了客户端的请求方式,如 get,post 等 |
$request_filename | 存放当前请求的资源文件的路径名 |
$requset_uri | 当前请求的 uri,并且带有指令 |
$query_string | $args 含义相同 |
$scheme | 客户端请求使用的协议,如 http, https, ftp 等 |
$server_protocol | 客户端请求协议的版本,如 ”HTTP/1.0”, ”HTTP/1.1” |
$server_addr | 服务器的地址 |
$server_name | 客户端请求到达的服务器的名称 |
$server_port | 客户端请求到达的服务器的端口号 |
$uri | 同 $document_uri |
- 1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
- 2.$remote_user :用来记录客户端用户名称;
- 3.$time_local : 用来记录访问时间与时区;
- 4.$request : 用来记录请求的url与http协议;
- 5.$status : 用来记录请求状态;成功是200;
- 6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
- 7.$http_referer :用来记录从那个页面链接访问过来的;
- 8.$http_user_agent :记录客户端浏览器的相关信息
Nginx epoll
为什么 epoll 快,比较一下 Apache 常用的 select 和 Nginx 常用的 epoll:
select
- 最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048,因此 Select 模型的最大并发数就被相应限制了。自己改改这个 FD_SETSIZE? 想法虽好,可是先看看下面吧。
- 效率问题,select 每次调用都会线性扫描全部的 FD 集合,这样效率就会呈现线性下降,把 FD_SETSIZE 改大的后果就是,大家都慢慢来,什么?都超时了。
- 内核/用户空间,内存拷贝问题,如何让内核把 FD 消息通知给用户空间呢?在这个问题上 select 采取了内存拷贝方法,在 FD 非常多的时候,非常的耗费时间。
总结为:1、连接数受限 2、查找配对速度慢 3、数据由内核拷贝到用户态消耗时间。
epoll
- Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 查看。
- 效率提升,Epoll 最大的优点就在于它只管你 “活跃” 的连接 ,而跟连接总数无关,因此在实际的网络环境中,Epoll 的效率就会远远高于 select 和 poll。
- 内存共享,Epoll 在这点上使用了 “共享内存”,这个内存拷贝也省略了
Nginx多进程
Nginx 是通过基于异步及非阻塞的事件驱动模型和多进程机制实现高性能的。
- 进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低编程的复杂度,降低开发成本;
- 采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。