1.什么是Nginx?
Nginx 是⼀款⾼性能的 http 服务器/反向代理服务器及电⼦邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊⼽尔·⻄索夫(Igor Sysoev)所开发,官⽅测试 nginx 能够⽀⽀撑 5 万并发链接,并且cpu、内存等资源消耗却⾮常低,运⾏⾮常稳定。
2.Nginx特点
- 动静分离。Nginx 是⼀个 http 服务可以独⽴提供 http 服务。可以做⽹⻚静态服务器。
静态请求直接从 nginx 服务器所设定的根目录路径去取对应的资源,动态请求转发给真实的后台(前面所说的应用服务器,如图中的Tomcat)去处理;这样做不仅能给应用服务器减轻压力,将后台api接口服务化,还能将前后端代码分开并行开发和部署。
- 反向代理。要了解反向代理,我们需要先了解一下正向代理。
正向代理的处理模式是这样的,如果我们想要访问国外网站时,我们需要找到一个可以访问国外网站的代理服务器,然后将请求发送给代理服务器,由代理服务器去访问国外的网站,代理服务器将访问到的信息传递给我们。
这种代理模式成为正向代理。其最大的特点是是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
简而言之,正向代理代理的是客户端,是一个位于客户端和原始服务器(Origin Server)之间的服务器,为了从原始服务器取得内容,客户端向该代理发送了一个请求并指定目标。
相对的,反向代理就是清楚客户端的地址,但是对于服务器的地址是不清楚的。它的应用场景是这样的,以某宝为例,其网站每天接受到的请求非常之多,使用单个服务器是远远处理不过来的,这时会通过部署多台服务器来缓解单个服务器的压力,即分布式部署。多个客户端给服务器发送请求,nginx服务器接收到之后,会按照一定的规则将这些请求分配给后端得业务服务器进行处理。这时,请求的客户端是明确的,但是请求由哪台服务器进行处理是不明确的。这就是反向代理和正向代理最大的区别。
反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。通常,我们在实际项目操作时,正向代理和反向代理很有可能会存在同一个应用场景中,正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向单利服务器,反向代理了多台真实的业务处理服务器。如下图所示:
- 负载均衡。当⽹站的访问量达到⼀定程度后,单台服务器不能满⾜⽤户的请求时,需要⽤多台服务器集群可以使⽤nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载⾼宕机⽽某台服务器闲置的情况。这里服务器将多个请求按照一定的分发方式分发给业务服务器的方式称之为负载均衡。既然Nginx 扮演了反向代理服务器的角色,它是依据什么样的规则进行请求分发的呢?一般有以下几种分发方式:
①weight 轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率。权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
②ip_hash:每个请求按照发起客户端的 ip 的 hash 结果进行匹配,这样的算法下一个固定 ip 地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下 Session 共享的问题。
③fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配。响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少,它是结合了前两者的优点的一种调度算法。
④url_hash:按照访问的 URL 的 hash 结果分配请求,每个请求的 URL 会指向后端固定的某个服务器,可以在 Nginx 作为静态服务器的情况下提高缓存效率。同样要注意 Nginx 默认不支持这种调度算法,要使用的话需要安装 Nginx 的 hash 软件包。
3.使用docker安装Nginx
- 先搜索nginx镜像
docker search nginx
- 再直接拉取nginx镜像
docker pull nginx
- 创建一个容器,设置端口映射、和目录映射
#在/root⽬录下创建nginx⽬录⽤于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
#在~/nginx/conf/下创建nginx.conf⽂件,粘贴下⾯内容
vim nginx.conf
#这里是需要粘贴的内容
#全局块:设置一些影响 Nginx 服务器整体运行的配置指令=================
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#events块:影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 workprocess 下的网络连接进行序列化,是否允许同时接收多个网络连接等等。
events {
worker_connections 1024; #支持的最大连接数
}
#http块:诸如反向代理和负载均衡都在此配置============================
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
- 修改保存后conf文件后,回到nginx目录下执行以下命令
docker run -id --name=c_nginx \
-p 80:80 \
-p 81:81 \
-p 82:82 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/conf.d:/etc/nginx/conf.d \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \ #这是用于存放静态资源的目录,我们可以在该目录下使用vim创建一个html文件
nginx
- 再次回到nginx目录,执行下列命令,配置和web服务相关配置
cd conf.d/
vim 80.conf #在conf.d目录下创建一个针对于80端口的web配置文件,并写入下面内容
#80端口的web配置文件内容
server {
listen 80; # 监听的端⼝
server_name localhost; # 域名或ip
location / { # 访问路径配置
root /usr/share/nginx/html;# 根⽬录
index index.html index.htm; # 默认⾸⻚
}
error_page 500 502 503 504 /50x.html; # 错误⻚⾯
location = /50x.html {
root html;
}
}
- 最后直接启动容器就行了
docker exec -it c_nginx /bin/bash
查看效果的话,直接在浏览器地址栏输入配置的IP地址,端口号为80进行访问。即可看到在html目录下的静态页面内容
4.nginx原理解析:Master-Worker模式
如图所示,一个master进程管理着多个worker进程,master的另一个作用是读取并验证配置文件nginx.conf文件。而每一个Worker进程都维护一个线程(避免线程切换),处理连接和请求。Worker进程的个数由配置文件决定,一般和CPU个数相关(有利于进程切换),配置几个就有几个Worker进程,并且每个worker之间都是相互独立的,一个挂了不会影响其他的。