基本概念
Nginx(engine x)是一个高性能的HTTP和反向代理Web服务器,占有内存少,并发处理能力强
Nginx默认端口号80,即Http协议默认的端口号,因此在访问nginx服务器时不需要再手动指定端口号
Nginx的用途
反向代理
- 正向代理:代理服务器为客户端提供服务,代替客户端访问服务器,返回数据给客户端
- 反向代理:代理服务器为服务器提供服务,客户端发送数据后由代理服务器选择目标服务器进行数据传输,暴露代理服务器地址,隐藏了真实的服务器地址
负载均衡
在高并发的情景中,单个服务器可能不能满足处理业务的需要,这时通过增加服务器数量和配置反向代理服务器,用户直接访问反向代理服务器,由反向代理服务器根据实际情况将请求分发到多个服务器上,以减小服务器压力
动静分离
为了加快网站的解析速度,将静态页面和动态页面分别由不同的服务器进行解析,降低单个服务器的压力
负载均衡的策略
- 轮询:每个请求按照时间顺序分配到不同的服务器
- 权重:权重weight默认为1,根据权重产生不同比例的请求分配给各服务器
- ip_hash:用户之间采用分配模式,单用户一旦访问服务器成功之后就只能访问这一台确定的服务器。可以解决Session问题
- fair:根据后端服务器的响应时间来分配请求,响应时间短的优先分配
Nginx工作方式
通过查看进程可以看到,除了第三个ps进程,nginx进程分为master和worker两类进程
工作结构:
- master负责管理和监控worker
- 当新的请求来到,所有worker会争抢去处理请求
一个master和多个worker的优点:
可以使用
nginx -s reload
热部署热部署时正在处理请求的worker继续工作,空闲的worker开始适配新规则,当worker处理完请求后再适配新规则
每个worker是独立的进程,当某一worker出现问题,其他worker仍然可以继续工作
设置worker数量:一般worker数目和服务器的cpu核数相当最佳
worker工作占用的连接数
如果访问本地的静态资源
接收用户请求和返回数据共2个连接
如果请求远程服务器
接受用户请求和返回数据,给服务器发送请求和获取数据,共4个连接
如果共有4个worker,每个worker最大连接数为1024,支持的最大/最小并发数为?
根据上面的结论,最大并发数为所有用户都访问静态资源,即1024*4/2=2048
最小连接数为所有用户都访问远程服务器,nginx服务器作为反向代理,即1024*4/4=1024
开始Nginx
安装
需要的依赖:
- pcre
- openssl
- zlib
为了方便安装,这里使用docker进行示例
1 | docker run --name nginx -p 80:80 -v /root/conf/nginxconf:/etc/nginx/outside-conf -d nginx:1.20.1 |
这里我们在容器内部的配置文件同级目录下创建了一个挂载的目录,如果我们需要修改内部文件,就在这个挂载的目录中修改
这时访问服务器的80端口就能够看到nginx的欢迎页了
常用命令
不适用docker使用命令之前需要先进入/usr/local/nginx/sbin
路径使用./nginx
执行命令
如果使用docker环境变量已经自动配好
1 | nginx -v #查看版本 |
配置文件
docker中的路径为/etc/nginx
这里的配置文件分为三部分
- 全局块:配置整体运行的指令
- event块:配置nginx服务器与用户的访问配置
- http块
新版server块已经被划分到/etc/nginx/conf.d
路径下,可以在这里进行配置
配置实例
最简单的代理
安装Tomcat
1 | docker run --name tomcat -p 8080:8080 -v /root/test:/usr/local/tomcat/webapps/test -d tomcat |
我们直接运行的Tomcat容器的webapps目录下是没有内容的,为方便测试,可以将webapps.dist目录下的默认欢迎页复制到webapps目录
配置nginx
由于之前我们配置了挂载目录,因此可以在挂载目录中编辑容器内部的配置文件,在/etc/nginx
将两个配置文件进行拷贝:
1 | cp nginx.conf outside-conf/ |
在外部使用vim就可以进行编辑了
这里在default.conf修改两处
这里不使用127.0.0.1,因为在容器里面配置环回IP相当于容器自己的IP,当然不会与另一个容器的IP相连通
配置完毕后,可以尝试访问服务器的80端口,看nginx服务器能不能给我们传回8080端口的tomcat默认页内容
反向代理
新建一个tomcat容器配置端口8081:8080
在default.conf文件末尾追加一个新的虚拟服务器(需要更改默认服务器的监听端口,不然会冲突)
1 | server { |
两个tomcat服务器分别放入对应端口号的html文件,实验结果如下
location匹配url指令说明
负载均衡
实现效果:输入一个url后代理服务器根据负载情况分发请求到8080或者8081端口
在nginx.conf文件的http块中添加负载均衡服务器配置,名为myserver
1 | upstream myserver { |
在default.conf文件,将我们的myserver服务器添加到代理配置中
1 | server { |
这时访问一个页面不断刷新浏览器就可以发现端口号在8080和8081之间不断变动,说明配置成功
动静分离
配置静态资源
配置default.conf
这里的/data/是在容器内部单独创建的静态资源目录
1 | server { |
Nginx集群
要点:
- 需要多台nginx
- 需要keepalived
- 需要虚拟ip
待补充