一.何为反向代理?
在介绍反向代理之前,先来了解一下正向代理。
正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,下面是正向代理的原理图。
由于工作环境原因,日常工作只能局限于单位的局域网,如果想要访问互联网,怎么办呢?这就需要用到正向代理,本人经常用正向代理来进行上网。
反向代理:看下面原理图,就一目了然。其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP地址。
正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果是在服务器用,用户无感知,就是反向代理。
Nginx反向代理部署搭建
环境准备
centos7虚拟机
Nginx:192.168.0.41:80
tomcat:192.168.0.42:8081
tomcat: 192.168.0.43:8082
关闭防火墙
systemctl stop firewalld.service ###关闭防火墙
systemctl disable firewalld.service ###设置开机不启动
安装依赖插件
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
安装的插件的作用
1.gcc 可以编译 C,C++,Ada,Object C和Java等语言(安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境)
2.pcre pcre-devel pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库
3.zlib zlib-devel zlib库提供了很多种压缩和解压缩方式nginx使用zlib对http包的内容进行gzip,所以需要安装
4.openssl openssl-devel OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
5.nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库
安装Nginx
wgte https://nginx.org/download/nginx-1.21.6.tar.gz
解压安装包
[root@localhost local]# tar xf nginx-1.21.6.tar.gz
[root@localhost local]# cd nginx-1.21.6
编译安装
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
设置开机启动
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
说明:
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
保存退出
加入开机自启动
systemctl enable nginx.service
取消开机自启动
systemctl disable nginx.service
查看所有启动的服务
systemctl list-units --type=service
Nginx反向代理配置
反向代理实例配置一
实现效果:使用nginx反向代理,访问192.168.0.41直接跳转到192.168.0.42:8080
配置代码:
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.0.41;
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.0.42:8081;
}
}
}
反向代理实力配置二
实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口为80
访问http://192.168.0.41/edu/a.html 直接跳转到192.168.0.42:8081
访问http://192.168.0.41/res/b.html 直接跳转到192.168.0.43:8082
第一步,准备两个tomcat,一个端口为8081,一个端口为8082,并在webapps目录下创建/edu/和/res/目录。在创建的目录中准备好测试页面
第二部,修改nginx配置文件,在http块中配置server
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name 192.168.0.41;
location ~ /edu/ {
proxy_pass http://192.168.0.42:8081;
}
location ~ /res/ {
proxy_pass http://192.168.0.43:8082;
}
}
###根据上面的配置,当请求到达 Nginx 反向代理服务器时,会根据请求路径不同进行分发到不同的服务上。
实验结果:
Nginx负载均衡
何为负载均衡?
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。
Nginx负载均衡搭建部署
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
###配置upstream,指向后端服务
upstream resset {
server 192.168.0.42:8081 max_fails=1 fail_timeout=10 weight=3;
server 192.168.0.43:8082 max_fails=1 fail_timeout=10 weight=1;
}
server {
listen 80;
server_name 192.168.0.41;
location / {
root html;
index index.html index.htm;
proxy_pass http://resset; #转发到负载服务上
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
max_fails=1 ###设置允许请求代理服务器失败的次数,默认为1
fail_timeout=10 ###设置经过max_fails失败后,服务暂停的时间,默认是10秒
weight=1 ### 权重,看哪个服务器配置好可以多加权重接受的请求多
在server最后面可以通过添加变量修改服务器取值
down ###当前server暂时不参与负载均衡
backup ###当前server作为备份,等有损坏服务器的时候上场
分配策略
none(轮询)
upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。
weight(权重)
server 192.168.0.42 weight = 3; # 30% 请求
server 192.168.0.43 weight = 1; # 10% 请求
ip_hash(访问ip)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
配置只需要在upstream中加入ip_hash;即可。
upstream tomcats {
ip_hash;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
upstream tomcats {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
fair;
}