Nginx随笔
程序员文章站
2022-06-11 14:58:40
...
Nginx
Nginx是俄罗斯人编写的十分轻量级的HTTP和方向代理服务器
是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。
Nginx的优点
- 高并发链接
- 官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
- 内存消耗少
- 在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
- 配置文件非常简单
- 风格跟程序一样通俗易懂
- 成本低廉
- Nginx为开源软件,可以免费使用。像F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。
- 支持Rewrite重写规则
- 能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。
- 内置的健康检查功能
- 如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
- 节省带宽
- 支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
- 稳定性高
- 用于反向代理,宕机的概率微乎其微。
DOS攻击无效
Nginx官方表示保持 10000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说基本上是毫无用处的。
Nginx的负载均衡
什么是负载均衡?
负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中
后台服务器组成了一个服务器集群(多台服务器). 有中间服务器(nginx)接受到请求分发给不同的服务器后台. 该nginx就是一个负载均衡服务器.
负载均衡的优点:
1.分散后台服务器的压力
2.自动去掉挂掉的后台服务器
3.缓存后台服务器响应内容
负载均衡的分配策略:
nginx的upstream目前支持4种方式的分配
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2.weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3.ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4.fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5.url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力
动静分离
动态资源、静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路.
动态资源、静态资源分离简单的概括是:动态文件与静态文件的分离
为什么要做动、静分离?
在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件)
这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗?
当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决
动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问
正向代理
一个位于客户端和原始服务器(origin server)之间的服务器, 为了从原始服务器取得内容, 客户端向代理发送一个请求并指定目标(原始服务器), 然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理
反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求,发给内部网络上的服务器并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
反向代理总结就一句话:代理端代理的是服务端
Nginx是如何处理一个请求的呢?
- 首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面
- 先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口,再listen)
- 然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子进程出来
- 然后子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后
- 此时,某一个子进程会accept成功,得到这个建立好的连接的socket,然后创建nginx对连接的封装,即ngx_connection_t结构体
- 接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了