Nginx
一、基本概念
Nginx是一个高性能的http和反向代理服务器,专注于优化性能,占用内存少,支持高并发。
反向代理:
首先理解正向代理,即使用浏览器访问某个服务器时无法直接访问到,则需要在浏览器配置代理服务器,由代理服务器向该服务器进行访问(浏览器—>代理服务器—>目标服务器);而反向代理,浏览器不需要配置代理服务器,浏览器只需将请求发送至反向代理服务器,反向代理服务器会将请求发给各个目标服务器,再返回信,过程中,浏览器不知道目标服务器的存在,只知道反向代理服务器(反向代理服务器与目标服务器可以看成一个整体,但是对浏览器方暴露的是反向代理服务器的ip和端口)
负载均衡:
再单一的请求响应过程中,如果出现多个请求同时访问的情况,就会使响应的速度大大降低;要解决这个问题就可以添加多的服务器来响应。在上一概念中提到了反向代理,那么通过添加多个服务器后,使用反向代理服务器可以实现尽可能的平均分配请求负载给各个服务器,从而达到负载均衡,以提高响应速度。
动静分离:
动态资源(jsp、servlet等)和静态资源(html、css、js等)分开部署,当需要访问动态资源时,反向代理服务器访问动态资源服务器,;需要访问静态资源时,反向代理服务器会访问静态资源服务器。
二、安装、常用命令、配置文件
安装(linux):
这里使用docker安装,适用于了解dockers容器的用户
#查看nginx镜像
docker search nginx
#安装nginx,默认最新版本
docker pull nginx
#创建容器,并映射端口
docker run \
--name=nginx-test \
-d -p 8000:80 \
-v $PWD/html:/usr/share/nginx/html \
-v $PWD/nginx.conf:/etc/nginx/nginx.conf:ro \
-v $PWD/conf.d:/etc/nginx/conf.d \
nginx
解释:
- $PWD表示宿主机的当前目录(我的为:~/nginx)
- 8000为宿主机端口,80为nginx容器端口(可以在config文件中修改)
- 第一个-v 表示在~/nginx文件目录下创建html文件目录,挂载nginx中的html;该位置用于存放项目文件
- 第二个-v表示将nginx中的nginx.conf挂载到当前目录的nginx.conf文件,
由于是挂载,应先在宿主机的当前目录下拷贝nginx.conf文件,否则挂载后nginx中的文件就是空的的,相关命令为:docker cp nginx:/etc/nginx/nginx.conf ./ 解释:nginx为创建容器的自定义名称,冒号后面是该文件的位置 ./表示当前文件夹位置
- 第三个-v表示将nginx中的conf.d文件夹挂载到当前目录的conf.d文件夹
在该文件夹下有一个default.conf文件,也需要拷贝下到conf.d文件夹下
即可使用http://ip:8000访问
常用命令:
必须要在nginx中的/usr/local/nginx/sbin下才能使用命令
-
查看nginx版本
./nginx -v
-
启动nginx
./nginx
-
关闭nginx
./nginx -s stop
-
重启nginx
./nginx -s reload
docker容器可以直接使用docker命令关闭或开启容器
三、配置文件
dockers中的nginx.conf配置文件在 /etc/nginx/目录下
default.conf在/etc/nginx/conf.d目录下
有三部分组成:
- 全局块:配置整体运行指令
- events块:影响nginx服务器与用户的网络连接
- http块:配置最频繁的位置;包括http全局块(包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等)、server块(与虚拟主机有关)
server块内容不在nginx.conf中,而是在同级目录的conf.d/下
user nginx;
worker_processes 1; #并发处理的值
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024; #支持最大连接池
}
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;
}
四、配置实例–反向代理
实现效果1:在浏览器中输入www.xxx.com跳转到nginx宿主机中的tomcat主页面中
-
安装Nginx
-
安装tomcat:这里也是使用docker安装tomcat
#查询tomcat镜像 docker search tomcat #拉取tomcat镜像 docker pull tomcat #创建tomcat容器 docker run -id --name=tomcat1 -p 7999:8080 tomcat #处理无法访问tomcat主界面问题 #由于在docker中的tomcat容器中有两个webapps文件夹,而ROOT相关的文件在webapps.dist文件夹中,而webapps文件夹中没有文件,所以无法访问 #进入tomcat容器 docker exec -it tomcat1 /bin/bash #进入webapps.dist文件夹中 cd webapps.dist #将webapps.dist中的文件复制进入webapps中 mv ROOT ../webapps/ #使用上一条命令将该文件夹中全部文件移至webapps中即可
-
实现过程:浏览器输入www.xxx.com(先修改windows中的host映射文件) —> 访问nginx —> nginx访问tomcat服务器
-
具体配置:
-
修改host文件:默认位置:C:\Windows\System32\drivers\etc 在底部添加ip 网址映射即可
第一次修改注意需要取消只读状态,否则无法更改
-
修改default.conf文件
注意,在docker文件中无法直接修改,所以要在之前挂载的数据卷处修改文件,会自动同步
;修改内容:- server_name nginx宿主机ip地址
- 在location中添加一段: proxy_pass http://127.0.0.1:8080; 即tomcat,如果tomcat与nginx不在一台宿主机,则可以更改ip地址
-
完成,通过域名即可访问tomcat
**实现效果2:**在访问代理服务器的路径不同,直接跳转到不同的tomcat服务器
如:
http://ip:8000/s1 ----> 跳转到tomcat服务器1
http://ip:8000/s2 ----> 跳转到tomcat服务器2
-
创建两个tomcat容器(由于为已存在的容器添加数据卷需要其他工具,所以这里直接删除原来的tomcat),由于这里需要在webapps中放入页面以显示区别,所以需要挂载数据卷。
docker run -id --name=tomcat1 -p 7999:8080 -v $PWD:/usr/local/tomcat/webapps tomcat
docker run -id --name=tomcat2 -p 7998:8080 -v $PWD:/usr/local/tomcat/webapps tomcat
P W D 文 件 夹 为 宿 主 机 下 的 文 件 夹 , 里 面 有 之 前 w e b a p p s 中 的 全 部 文 件 和 添 加 的 文 件 ‘ s 1 / t e s t . h t m l ‘ ( 可 以 将 挂 载 的 数 据 卷 复 制 两 份 , 只 需 修 改 h t m l 文 件 即 可 ; 注 意 切 换 PWD文件夹为宿主机下的文件夹,里面有之前webapps中的全部文件和添加的文件`s1/test.html`(可以将挂载的数据卷复制两份,只需修改html文件即可;注意切换 PWD文件夹为宿主机下的文件夹,里面有之前webapps中的全部文件和添加的文件‘s1/test.html‘(可以将挂载的数据卷复制两份,只需修改html文件即可;注意切换PWD位置)
-
具体配置
default.conf文件
server { listen 80; server_name nginx所主机ip; location ~ /s1/{ proxy_pass http://tomcat1IP:7999; } location ~ /s2/{ proxy_pass http://tomcat2IP:7998; } }
即可实现访问
http://ip:8000/s1/test.html 页面跳转到tomcat1/s1/test.html
http://ip:8000/s2/test.html 页面跳转到tomcat21/s2/test.html
~表示URL中包含正则表达式,并区分大小写
~*表示URL中包含正则表达式,并且不区分大小写
^~表示不含正则表达式,要求nginx服务器表示到url和请求字
五、配置实例–负载均衡
**实现效果:**在浏览器中输入地址:http://ip/s1/test.html,实现负载均衡,平均到7999和7998端口
-
创建至少两个tomcat容器(7999、7998),在各个tomcat的webapps中都有
fzjh/test.html
,内容可以不同以示区分(这里只需要在上面实例中创建的容器的数据卷中添加即可) -
负载均衡配置:在nginx.conf中配置http,在default.cong中配置server
#nginx.conf中的http块添加负载均衡服务列表 upstream myserver{ server tomcat1IP:7999; server tomca21IP:7998; }
#在default.cong中配置规则 server { listen 80; server_name nginx宿主机IP; location /{ proxy_pass http://myserver; root html; index index.html index.htm; } }
这里记录一点:在访问nginx时,切记时docker容器,所以要访问映射的端口,而不是默认的80
配置完成即可初步实现负载均衡(会在两个服务器之间切换)
分配策略
-
轮询(默认):按照请求的时间顺序逐一分配到各个服务器;如果头服务器宕机,会自动剔除该服务器
-
weight:代表权重,默认为1,权重越高,分配到的越多
server tomcat1IP:7999 weight=2; server tomca21IP:7998 weight=1; #上述配置结果:tomcat1分配两次,tomcat1分配一次轮换
-
ip hash:根据请求ip地址的hash结果分配,同一ip只能访问一台服务器
直接在upstream中添加ip_hash;即配置完成
-
fair(第三方):根据后台响应时间决定
六、配置实例–动静分离
目的:提高请求效率
动态请求:请求传到tomcat,查询数据库等
静态请求:请求传到静态资源服务器
-
在linux中准备静态资源
因为docker无法直接访问宿主机,所以在创建nginx容器的时候已经挂载html文件夹,只需将文件放入html数据卷中即可
-
配置
location / { #文件位置 root /usr/share/nginx/html; index index.html index.htm; } location /{ #文件列表;测试时加上该配置无法访问 root /usr/share/nginx/html; autoindex on; }
七、高可用集群
当nginx宕机时,所有请求将失败
解决:可配置两台nginx;需要使用keeplived软件
keeplived:监测nginx是否还在工作;需要一个虚拟ip绑定到两台服务器上;当主nginx宕机时,启用备服务器
-
两台nginx:可使用两个虚拟机或云服务器(
使用docker安装的方法上面已经讲述
) -
keepalived软件安装
主要操作keepalived.conf配置文件
#使用yum命令安装keepalived,安装位置:/etc/keepalived/keepalived.conf yum install keepalived -y #检查是否安装完成 rpm -q -a keepalived
-
配置及设置虚拟IP
keepalived.conf配置文件
global_defs { notification_email { zjj@qq.com } notification_email_from root@zjj.com smtp_server mail.zjj.com smtp_connect_timeout 30 router_id LVS_DEVEL #127.0.0.1 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_pid.sh" # 检查nginx状态的脚本 interval 2 weight 3 } vrrp_instance VI_1 { state MASTER #备份服务器上将MASTER改为BACKUP interface ens33 #网卡 virtual_router_id 51 priority 100 #备份服务上将100改为小于100,可配置成90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.11 #有多个vip可在下面继续增加 } track_script { chk_nginx } }
脚本文件
#!/bin/bash #version 0.1 # A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then systemctl restart docker sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then systemctl stop keepalived fi fi
将MASTRE和BACKUP配置文件配置完成,分别启动服务即可
docker start nginx
systemctl start keepalived.service
在浏览器中输入虚拟ip即可访问,当主服务器宕机时,就会启动备用机
#停止命令
docker stop nginx
systemctl stop keepalived.service
八、原理
Master:只有一个master(管理员);
Worker:可以有多个worker;以争抢方式获得‘工作’
特点:
- 可以使用热部署操作;
- 每个worker时独立的一个进程;相互不影响,一个出现问题,其他不受影响;
- worker数量与cpu数量相同比较合理(多核)
*发送一个请求,worker需要2或4个连接数(访问静态资源占两个,访问动态资源占4个,因为需要转发到tomcat)
*一个nginx有4个worker,每个worker支持1024个连接数;则这个nginx服务器的并发数为4 * 1024 / 2
(静态)或 4 * 1024 / 4
(动态)