nginx基础
nginx的安装
-
此处采用docker进行nginx的安装(为例方便后续部署集群)
# 获取镜像 docker pull nginx # 创建并运行容器 docker run --name nginx -p 81:80 -v /home/docker/nginx/html:/usr/share/nginx/html # 挂载虚拟目录 -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/docker/nginx/logs:/var/log/nginx -v /home/docker/nginx/conf.d:/etc/nginx/conf.d --restart always -d nginx:1.19.6
-
安装完毕后通过访问
htpp:[服务器ip]:[-p设置的端口]
,可以看到nginx的主页
nginx反向代理
- nginx的各种配置都主要在于修改nginx.conf文件,上述运行时已经挂载在本地的
/home/docker/nginx/conf
目录下,未挂载的可以通过docker exec -it nginx /bin/bash
进入容器后,在etc/nginx/
目录下找到nginx.conf文件
nginx.conf结构解析
nginx.conf 的代码结构主要由三部分组成
-
全局块
从配置文件开始,到events块之间的内容,主要会设置一些影响nginx整体运行的配置指令,如
用户组
,允许生成的work process数
,进程pid存放路径
,日志类型和存放路径
,配置文件的引入
等 -
events块
events 块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess可以同时支持的最大连接数等。
-
http块
http块是nginx.conf修改最频繁的地方,代理,缓存,日志定义等绝大部分功能都在这里修改,主要可分为两部分
http全局块
server块
server块相当于一个虚拟主机,其中指定监听的端口和server_name(一般为ip),一个server中可以包含多个
location
,location中定义了代理的路径和代理后的转发路径,通过proxy_pass
进行转发路径指定
配置反向代理
-
什么是正向代理
正向代理服务器相当于一个资源传递,比如正常我们访问谷歌是无法访问,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了
-
正向代理的用途
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
-
-
什么是反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
-
配置反向代理服务器
修改nginx.conf文件,添加一个server,或者在原有server(80端口)下添加location进行反向代理转发
# 此处我们新建一个最简易版的server server{ listen 8100 ; # 监听8100端口 server_name 192.168.56.101 # 天写ip或者是负载均衡的upstream location /test{ proxy_pass http:192.168.56.101:8080/ # 将请求转发到本地的tomcat主页(或者其他地址) } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
保存后重启nginx,启动tomcat,访问
[你的ip]:80/test/
,跳转到tomcat首页,即配置成功
nginx负载均衡
修改nginx.conf,添加upstream
# 此处同样使用tomcat首页作为转发,启动两个tomcat,修改server.xml将其中一个端口改为8081即可
upstream myserver {
# ip hash; # ip hash分配方式
# fair; # 按照响应速度的分配方式
server 192.168.56.101:8081 weight=1; # weight为nginx的权重负载均衡策略,默认weight为1
server 192.168.56.101:8080 weight=2;
}
nginx的负载均衡策略
-
默认为轮询方式
-
weight为权重方式进行轮询
指定轮询的几率,和weight设置的值成正比
-
ip hash 策略
ip hash策略主要是当用户访问时,计算当前用户访问ip的hash值,根据hash值进行负载均衡分配,这样可以保证同一个ip之后访问的一定是同一台服务器,可以解决session的问题
-
fair策略
根据服务器的响应速度来进行分配,响应速度快的服务器优先分配,有效利用服务器资源
ps:此处的8100端口在docker运行时并未指定,配置完成后可能无法访问,动态给docker容器添加开放端口的方法如下: [docker给已运行容器添加开放端口]
nginx动静分离
动静分离即动态请求和静态请求通过分发到不同的地方进行分离,减轻服务器的流量与网络请求压力。
准备工作
首先创建用于存储静态资源的目录mkdir -p /home/data/{html,imgs}
,并在html目录新建a.html,index.html,在imgs目录添加a.jpg;
由于本文中nginx是部署在docker中的,在运行时并没有挂载静态文件的资源目录,首先需要为nginx容器新增挂载目录。已经挂载的可以忽略此步。
-
重新发布后重启容器进行添加
最直接的办法就是通过
docker commit 容器名/容器id 镜像名
将当前容器重新发布为镜像,然后将打包后的镜像重新运行,添加需要挂载的目录即可# 打包镜像 docker commit nginx nginx_new # 重新运行容器 docker run --name nginx -p 81:80 -v /home/docker/nginx/html:/usr/share/nginx/html # 挂载虚拟目录 -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/docker/nginx/logs:/var/log/nginx -v /home/docker/nginx/conf.d:/etc/nginx/conf.d -v /home/data:/data # 挂载存放静态资源的目录,目录随意,此处为/home/data --restart always -d nginx:1.19.6
-
修改配置文件动态添加挂载目录
-
获取容器id
docker images
-
进入容器目录
cd /var/lib/docker/containers/[容器id]
-
关闭docker!
systemctl stop docker
-
修改hostconfig.json
vim hostconfig.json
,找到Binds节点,将挂载目录新增进去 -
修改config.v2.json
vim config.v2.json
,通过:?MountPoints
命令在文件中查找到该节点,依照该节点原有的格式将新挂载的目录添加进去,如下"/data":{ "Source":"/home/data", # 源目录 "Destination":"/data", # 目标目录 "RW":true, # 读写权限 "Name":"", "Driver":"", "Type":"bind", "Propagation":"rprivate", "Spec":{ "Type":"bind", "Source":"/home/data", "Target":"/data" }
-
修改完成后重启docker,通过
docker inspect nginx
查看nginx容器信息,此时新目录已经挂载进去了。
-
动静分离配置
-
在 nginx.conf的server下添加location对静态资源进行转发
# 此处是在监听80端口的srever下进行配置,端口随意 location /html/ { # 注:nginx默认只能识别index.html,所以访问[nginx]/html/ 为index.html,其他页面要加上名字 alias /data/html/; } location /img/ { alias /data/imgs/; autoindex on; # 列出文件夹中目录 expires 3d; # 缓存过期时间3天 }
-
重启nginx
docker restart nginx
-
访问静态资源,浏览器访问
http:192.168.56.101:81/img/
,可以得到文件目录(前提是配置中加了autoindex on
),点击即可浏览图片,或者直接访问http:192.168.56.101:81/img/a.jpg
-
浏览器访问
http:192.168.56.101:81/html/
默认访问的是index.html,要访问其他html需要在后缀中加上,如http:192.168.56.101:81/html/a.html
nginx集群
准备工作
-
通过docker搭建一个简易的nginx集群,首先总共需要启动三个nginx服务,一个master,两个slave,其中只有主服务需要挂载目录和指定端口,主服务器已经准备好,只需准备两个从服务器即可
# 运行两个从服务器 docker run -itd --name nginx_slave1 nginx:1.19.6 docker run -itd --name nginx_slave2 nginx:1.19.6
-
查看三个nginx分区的ip信息
docker network ls
查看docker的网络信息,获取network_id,根据你虚拟机的网络配置情况选择。 -
查看docker中容器的网络信息
docker network inspect【上一步的network_id】
,可查看到如下信息,docker ps
查看到三个nginx容器的id,然后逐一匹配找到其对应的ip,此处示例对应ip分别为172.17.0.2
,172.17.0.7
,172.17.0.8
修改配置文件配置集群
-
修改master的配置,进入容器
vim /etc/nginx/nginx.conf
,挂载了目录的话则直接在本地目录修改,添加如下配置。# 集群配置 upstream 172.17.0.4 { # 添加两个nginx从服务器并设置权重 server 172.17.0.7 weight=10; # 对应nginx_slave1 server 172.17.0.8 weight=20; # 对应nginx_slave2 } # 在server中新建/修改location,此处为80端口的server,对/路径的location进行修改 location / { root /usr/share/nginx/html; index index.html index.htm; proxy_pass http://172.17.0.4/; # 配置集群代理 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
-
为了让集群访问效果看起来明显,对两个从服务器的index.html进行修改,加上各自的信息
# 进入nginx_slave容器 docker exec -it nginx_slave1 /bin/bash # 修改index.html vim /usr/share/nginx/html/index.html # nginx_slave1的index.html加上<h1>this is nginx_slave1 </h1>,对nginx_slave2做系统的配置
-
之后访问
192.168.56.101:81/
,可以看到slave1和slave2交替被访问,且频率和之前设置的权重成正比。