本文内容包括:
nginx配置实例之反向代理;
nginx配置实例之动静分离;
nginx配置实例之负载均衡;
nginx配置实例之高可用;
nginx原理分析
1、nginx是什么:
nginx是一个高性能的服务器,占用内存少,并发能力强。
2、反向代理:
正向代理:众所周知,我们不能直接访问谷歌,因为有墙,要访问我们就需要梯子,这个梯子就是正向代理。在我们浏览器端需要配置正向代理服务器,然后让代理服务器帮我们去访问谷歌,谷歌把内容返回给代理服务器,代理服务器再把内容返回到我们浏览器。
反向代理:通常我们自己撸代码都是发布到tomcat上,然后直接在浏览器访问tomcat,这个过程是没有代理的。反向代理就是不直接访问tomcat,而是在浏览器上访问一个代理服务器,代理服务器再决定将请求转发给哪一个tomcat。对外而言,客户端根本不知道自己访问的是代理服务器。
其实正向代理和反向代理就是代理的对象不同,正向是代理客户端,反向是代理服务端。
3、负载均衡:
说负载均衡前先说说我们自己撸的代码发布到tomcat然后通过浏览器访问是怎么样的一个过程。我们通过客户端请求服务端,服务端跟数据库交互,将数据返回服务端,服务端最后响应客户端。这种方式适合系统业务复杂度较低,请求量不大的情况。如果并发请求特别多,服务器是顶不住的,就会由于服务器性能瓶颈出现问题。解决办法就是一只汤姆猫拉不动了就多叫几只猫。
4、动静分离:
静态资源是固定的不变的,比如js、css、jpg等,动态资源就是要与数据库交互的,比如servlet、jsp之类的。未做动静分离的时候,不管是动态资源还是静态资源,我们都放到同一只汤姆猫上,这样它负担也挺大的;做了动静分离,就是把动态资源放到汤姆猫上,静态资源放到另外一台服务器上,然后客户端请求通过nginx,由nginx来决定是访问动态服务器还是静态服务器,这样就降低了单台服务器的压力。
1、安装nginx:
首先进入官网下载nginx。https://nginx.org/
安装需要的编译工具,包括pcre-devel、openssl-devel、gcc
和zlib-devel
。用 yum install make
安装即可。
将nginx上传到Linux中,解压,然后进入到解压缩目录,执行./configure
,出现下图才表示configure成功了。
完事儿后再执行 make&&make install
,如下图所示则安装成功了。安装完后在/usr/local
目录中,会有一个nginx
目录,启动脚本在nginx/sbin
中。
进入到/usr/local/nginx/sbin
目录中,执行./nginx
,就启动了nginx,浏览器访问你Linux机器的ip,出现下图就表示启动成功。如果访问不了,注意防火墙是否开放了80端口。
2、nginx常用命令:
以下列举的命令都是在/usr/local/nginx/sbin
下执行的。
./nginx
:启动nginx
./nginx -s stop
:快速关闭nginx,可能不保存相关信息
./nginx -s quit
:平稳关闭nginx,保存相关信息
./nginx -s reload
:重新加载配置文件
./nginx -s reopen
:重新打开日志文件
./nginx -c filename
:为nginx指定一个配置文件
./nginx -t
:检查配置文件的配置是否有语法错误
./nginx -v
:查看nginx的版本
./nginx -V
:查看版本以及配置参数等
3、nginx的配置文件:
配置文件的位置:/usr/local/nginx/conf
下的nginx.conf
。配置文件分为三部分,全局块、events块和http块。
从配置文件开始到events之间的叫全局块,配置全局的一些指令。worker_processes 1
表示nginx处理的并发数量,值越大,能处理的并发量就越多。
events块主要是影响nginx服务器与用户的网络连接。worker_connections 1024
表示支持的最大连接数。
http块是配置最频繁的部分,又包括http全局块和server块。http全局块可配置的指令包括文件引入、mime-type定义、日志自定义、连接超时时间和单链接请求数上限等;server块是最主要的配置部分,配置一些和主机相关的东西。
1、最终效果:
在浏览器上输入www.xixihaha.com,跳转到tomcat的主页面(所以要先安装一个tomcat并启动;或者也可以搞个springboot项目丢上去启动)。因为用到了域名,所以要在windows的host文件中配置域名与虚拟机ip的映射(域名的工作原理就是先看host文件中有没有映射,没有就通过DNS服务器去解析域名)。
2、进行配置:
首先将server_name改成虚拟机的IP,然后在location那里设置代理的域名和端口,这样就搞定了。
3、代理多个端口:
上面是将www.xixihaha.com的请求转发到8080端口了,现在像将www.xixihaha.com/xi的请求转发到8081端口,www.xixihaha.com/ha的请求转发到8082端口。
首先在8081端口tomcat的webapp目录下新建一阁文件夹名字为"xi",文件夹里面放一个xi.html;然后在8082端口omcat的webapp目录下新建一个ha文件夹,在文件夹里面放一个ha.html。分别启动这两个tomcat。
然后在server块里面进行如下的配置:
server {
listen 80;
server_name www.xixihaha.com;
location ~ /xi/ {
proxy_pass http://127.0.0.1:8081;
}
location ~ /ha/ {
proxy_pass http://127.0.0.1:8082;
}
}
注意一个配置文件里可以写多个server,这个server和刚才配置的转发到tomcat欢迎页的可以同时存在。这个server配置location的时候用的类似于正则表达式,~ /xi/就表示路径中有xi的就转发到8081端口。
~ 包含该字符串就匹配,区分大小写
~* 包含该字符串就匹配,不区分大小写
= 完全相同才匹配
^~ 匹配不包含正则的且匹配度最高的location
最终效果图:
1、准备工作:
上面说了负载均衡就是将多个请求分配给不同的服务器,减轻单一服务器的压力。现在我们先在8081和8082的tomcat的webapp目录下新建一个文件夹test,里面都放一个index.html(实际上这两个index.html是完全一样的,就是代表我们需要做负载均衡的项目,这里为了等下可以更好的看到效果,这两个html可以做一些标记,比如8081的就标记一下8081)。
2、在nginx.conf中配置:
在http块中添加如下配置:
upstream myserver {
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
然后将server块中的server_name改成虚拟机的IP或者host中配置的域名(做反向代理的时候已经改了)。
在server块的location中添加如下配置:
proxy_pass http://myserver;
总体配置如下图:
配置好以后,在浏览器访问就会发现,第一次访问的是8081,第二次访问的是8082,以此轮询。如果你用谷歌浏览器访问,发现并没有轮询,那是因为谷歌浏览器把index.html缓存下来了。f12之后再f1,然后将下图中的勾上,然后开着调试窗口去访问,就可以看到轮询的效果了。
3、nginx负载均衡的算法:
轮询:nginx默认就是轮询算法,就是不争不抢,一人一次。上面演示的就是轮询。
权重:每台服务器设置权重,权重越高的就会接收到越多的请求。配置如下:
upstream myserver {
server 192.168.0.103:8081 weight=2;
server 192.168.0.103:8082 down;
server 192.168.0.103:8083 backup;
server 192.168.0.103:8084 max_fails=3 fail_timeout=20s fail_time=10s;
}
# weight表示权重,默认是1,值越大,负责处理的请求就越多;
# down表示该台服务器宕机了,不参与轮询;
# backup表示该台服务器是替补,当其他所有的都down或者忙的时候,它才会上场;
# max_fails=3 fail_timeout=20s fail_time=10s表示20秒内有超过3个请求失败了,就将该台服务器停机10秒。
ip_hash算法:对用户的ip进行hash取值,然后分配到固定的一台服务器上(一样可以加权)。这样每个ip都会固定一台服务器。配置方法如下:
upstream myserver {
ip_hash;
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
least_conn:将请求转发给连接数最少的服务器(一样可以加权)。配置方法如下:
upstream myserver {
least_conn;
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
url_hash:这是第三方策略,对url进行hash取值,每个url确定一台服务器。配置方法:
upstream myserver {
hash $request_uri;
server 192.168.0.103:8081;
server 192.168.0.103:8082;
}
fair:这是第三方策略,服务器响应时间最短的优先分配。配置方法:
upstream myserver {
server 192.168.0.103:8081;
server 192.168.0.103:8082;
fair;
}
上面说了动静分离就是将动态和静态请求分离开来,静态请求就请求静态服务器,动态请求就去请求tomcat。
1、实现方式:
将静态资源放到静态服务器单独部署,动态资源放到动态服务器单独部署(常用方式)。通过location指定不同后缀名实现不同的转发。通过expires参数可以设置浏览器缓存过期时间。比如设置的值是3d,那么3天内的请求,会比对请求的文件有没有更新,如果没有,那就直接从浏览器缓存返回,状态码为304;如果有变化再从服务器重新下载,状态码为200。
将动静态文件一起混合发布,再通过nginx来分开。
2、准备工作:
在linux上准备一些静态资源,比如在/opt下新建一个目录叫static,然后在static里面建两个目录,一个html,一个image,分别放入html文件(index.html)和image(timg.jpg)文件。
3、配置:
在server块中进行如下配置:
listen 80;
server_name www.xixihaha.com;
location /html/ {
root /opt/static/;
index index.html index.htm;
}
location /image/ {
root /opt/static/;
# 自动列出目录下的文件
autoindex on;
}
配置文件截图如下:
要注意把location /html/
和location /image/
放到location /
的前面。
最后的访问效果如下图:
现在是所有请求先到nginx,然后通过nginx分发到不同的tomcat中。万一这台nginx宕机了,那就凉凉了,所以nginx需要配置高可用。
如上图,有两个nginx,一个是主nginx,一个是备份nginx。它们俩对外提供一个虚拟IP,客户端访问的是虚拟IP。keepalived是一个软件,它会监视nginx,如果正常,那么访问主nginx,主宕机了,那么就切换到备份nginx。
1、准备工作:
在两台虚拟机上安装nginx;
在两台虚拟机上都安装keepalived,直接执行yum -y install keepalived
即可安装,安装完成后在etc/keepalived
目录下有其配置文件keepalived.conf
。
2、配置高可用:
修改keepalived.conf,将里面的内容全部删掉,替换成下面的内容:
#全局定义
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#检测nginx是否宕机的脚本配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" #脚本的路径
interval 2 #检测脚本执行时间间隔
weight 2
}
#虚拟ip相关配置
vrrp_instance VI_1 {
state MASTER #备份服务器上将此值改成BACKUP
interface ens33 #centos7 执行 ip addr查看网卡
virtual_router_id 51 #主备机此值需相同
priority 100 #主备机取不同的优先级,主机大一些
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.105 #自定义一个虚拟IP
}
}
编写检测脚本nginx_check.sh,放到上面配置的路径中去。脚本内容如下:
#!/bin/bash
A=`ps -C nginx -no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
启动两台服务器的nginx和keepalived。启动keepalived的命令为systemctl start keepalived.service
。
3、测试:
先用配置的虚拟ip进行访问。比如我两台虚拟机的ip分别是103和104,我配置的虚拟IP是105,那么直接在浏览器访问105,可以成功访问到nginx则配置成功。
在主服务器上执行ip addr
命令,出现如下画面,表示虚拟ip绑定成功:
把主服务器上的nginx和keepalived干掉,如果虚拟ip还可以正常访问,那么说明配置成功。
nginx启动后,有两个进程,一个master,管理员;一个worker,真正执行任务的进程。其实一个master可以管理多个worker,当有请求进来了,master就告诉所有的worker,worker接到通知就开始争抢。抢到了任务的worker再去执行具体的操作。
一个master多个worker的好处是,比如我们可以在不重启nginx的情况下执行nginx -s reload
命令重新加载配置文件,这就是这样设计的优点之一,即利于进行热部署操作;每个worker是独立的进程,即使有worker挂掉了,也还有其他worker能正常工作;
因为每个worker都可以将一个cpu的性能发挥到极致,所以worker的数量设置成cpu的核数相等最为合适。设置方法就是在nginx.conf中修改如下配置的数值即可:
worker_processes 1;
发送一个请求,如果是请求静态,会占用两个连接,一个请求到worker,另一个将静态资源返回给客户端;如果请求动态资源,那么就是4个,因为worker和tomcat之间还有两个。
nginx.conf中的如下配置是表示一个worker支持的最大连接数。
worker_connections 1024;
worker的数量乘以每个worker支持的最大连接数,再去除以2和4,得到的就是nginx支持的最大并发数的区间。
联系客服