反向代理的意义
-
正向代理的重心是放在客户端这边,客户端想访问一个服务,但是这个服务不能直接访问到,但是知道通过代理可以访问,这个代理实现了的功能是在中间中转客户端和服务端的通信。例子:如通过代理服务访问外国服务器。
-
反向代理的重心是放在服务器端这边。客户端想访问一个服务,就直接访问服务商提供的接口,接口自然会给客户端发送相应信息。看起来是直接的联系,没有代理关系。
-
但其实这个接口实际上是代表了另外一个的服务器,接口按指定的方式从相应的服务器里拿到客户端需要的信息,再把信息发送给客户端。
-
对应于正向代理(显性的代理客户端的需求),反向代理对客户端透明的代表了服务器的功能,所以称作反向代理(自己理解)
反向代理的作用
1)访问不带公网的内网机器
2)解决两台机器之间通信有障碍的问题
案例
-
目的:客户端通过访问服务器B的反向代理服务器A(具有内网和外网),实现访问服务器B(仅有内网);
-
组件:
服务器B:LNMP环境,配置好虚拟主机配置文件(包括域名、根目录和程序),一个内网连接地址;
服务器A:nginx,配置反向代理(域名)、跟服务器B同网段的地址,外网地址;
客户端:可以访问服器A外网的网络,域名解释;
具体实现步骤:
- 网络配置;
- A的网络配置,使用一个网卡,为NAT模式,实现内网通信;
A的网络情况:
[root@draft conf.d]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.87.133 netmask 255.255.255.0 broadcast 192.168.87.255
inet6 fe80::d8da:c84:7947:a438 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:bd:e9:03 txqueuelen 1000 (Ethernet)
RX packets 1248700 bytes 1448314291 (1.3 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 536508 bytes 167396019 (159.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 可增加ens37配置文件,使用静态IP
- B的网络配置,一网卡NAT模式,实现内网通信,可与A通信;一网卡仅主机模式(代表外网通信,宿主机相当于客户机)
B的网络情况:
[root@tanyvlinux conf]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.87.141 netmask 255.255.255.0 broadcast 192.168.87.255
ether 00:0c:29:b9:de:de txqueuelen 1000 (Ethernet)
RX packets 41993 bytes 30239619 (28.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19253 bytes 4901168 (4.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.92.151 netmask 255.255.255.0 broadcast 172.16.92.255
ether 00:0c:29:b9:de:e8 txqueuelen 1000 (Ethernet)
RX packets 9614 bytes 1347061 (1.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5732 bytes 6007671 (5.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
宿主机网络情况:
vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:50:56:c0:00:01
inet 172.16.92.1 netmask 0xffffff00 broadcast 172.16.92.255
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:50:56:c0:00:08
inet 192.168.87.1 netmask 0xffffff00 broadcast 192.168.87.255
- 服务器A配置好LNMP,域名为bbs.tany.com
自测:
[root@draft conf.d]# curl -x127.0.0.1:80 bbs.tany.com -I
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Sun, 20 Oct 2019 15:02:56 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/7.3.0
Set-Cookie: hHen_2132_saltkey=gReOf6X1; expires=Tue, 19-Nov-2019 15:02:55 GMT; Max-Age=2592000; path=/; HttpOnly
Set-Cookie: hHen_2132_lastvisit=1571580175; expires=Tue, 19-Nov-2019 15:02:55 GMT; Max-Age=2591999; path=/
Set-Cookie: hHen_2132_sid=xoBl22; expires=Mon, 21-Oct-2019 15:02:55 GMT; Max-Age=86399; path=/
Set-Cookie: hHen_2132_lastact=1571583775%09index.php%09; expires=Mon, 21-Oct-2019 15:02:55 GMT; Max-Age=86399; path=/
Set-Cookie: hHen_2132_onlineusernum=3; expires=Sun, 20-Oct-2019 15:07:55 GMT; Max-Age=299; path=/
Set-Cookie: hHen_2132_sid=xoBl22; expires=Mon, 21-Oct-2019 15:02:55 GMT; Max-Age=86399; path=/
- 服务器B安装好nginx,配置虚拟主机
server {
listen 80;
server_name bbs.tany.com;
location /
{
proxy_pass http://192.168.87.133;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 测试
- 宿主机配置hosts;
172.16.92.151 bbs.tany.com
- 浏览器访问bbs.tany.com;
- A机器的日志文件;
192.168.87.141 - - [20/Oct/2019:23:35:07 +0800] "GET / HTTP/1.0" 200 12470 "-"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6)
AppleWebKit/605.1.15 (KHTML, like Gecko)" "172.16.92.1"
负载均衡
- 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行;
比如,A B C D 四台WEB服务器,现在E要访问这4台服务器,F为Nginx反向代理服务器,可以让F把E的请求均衡地发送到
A B C D 4台服务器上。
- nginx模块一般被分成三大类:handler、filter和upstream。upstream模块,将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。upstream,不产生自己的内容,而是通过请求后端服务器得到内容,所以才称为upstream(上游)。
- ip_hash机制能够让某一客户机在相当长的一段时间内只访问固定的后端的某台真实的web服务器,这样会话就会得以保持,在网站页面进行login的时候就不会在后面的web服务器之间跳来跳去了,也不会出现登录一次的网站又提醒重新登录的情况.
- 查询网站的不同服务器地址
- 负载均衡的配置模板
upstream ape_com
{
ip_hash;
server 115.159.51.96:80; #服务器IP与端口;
server 47.104.7.242:80;
}
server
{
listen 80;
server_name www.apelearn.com; #服务器的域名;
location /
{
proxy_pass http://ape_com; #upstream
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
定义服务器的权重,IP后增加语句:(0-100)
server 115.159.51.96:80 weight=100;
- 测试2:使用192.168.87.137作为负载均衡服务器,192.168.87.133作为真实服务器,宿主机192.168.87.1作为客户端,因为仅有一台真实服务器,跟反向代理的结果一样;负载均衡也可以理解为反向代理了多台真实服务器;
- 配置信息:
137配置:
upstream qq_com
{
ip_hash;
server 192.168.133:80;
# server 47.104.7.242:80;
}
server
{
listen 80;
server_name bbs.tany.com;
location /
{
proxy_pass http://qq_com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
133配置:
server {
listen 80;
server_name bbs.tany.com;
root /data/wwwroot/bbs.tany.com/;
index index.html index.htm index.php;
location ~ \.php$ {
root /data/wwwroot/bbs.tany.com;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/bbs.tany.com$fastcgi_script_name;
include fastcgi_params;
}
access_log /data/logs/bbs.access.log main;
}
真实服务器日志:
192.168.87.137 - user1 [21/Oct/2019:08:30:50 +0800] "GET /admin.php?action=index HTTP/1.0" 200 40 "http://bbs.tany.com/admin.php?" "Mozilla/5.0
(Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko)
Version/12.1.2 Safari/605.1.15" "192.168.87.1"
配置nginx的ssl
- SSL,Secure Socket Layer,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)技术,可确保数据在网络上的传输过程中不会被截取及窃听。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输;
- http是80端口,https是443端口。https其实就是一种加密的http;
- 为什么要加密;
举例:咱们要在网上银行汇款,在你汇款过程当中,你会输入银行卡的密码。如果不加密,这些数据在传输过程中就有可能被人截获。
如果使用了https,那么数据在传输过程中是会加密的。即使抓到了数据包,但是无法破解出来。
- 目前使用http1.1, 以后使用http2默认需要SSL支持;
申请SSL 证书
- 申请平台
freessl.org
www.wosign.com
- 注册帐号
- 点击申请证书 - 输入要申请证书的域名- 点击创建免费的SSL证书- 点击创建- 确认创建
- 显示DNS验证需求
- 到域名的管理平台做相关设置
- 添加记录 - 填写信息 - 保存
- 添加记录 - 填写信息 - 保存
-
回到freessl.org - 点击验证
-
生成证书内容
-
把内容都保存下来 - 证书保存为bbs.crt - 私钥保存为bbs.key
-
配置虚拟主机
# listen 80 改为以下内容:
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/ssl/bbs.crt;
ssl_certificate_key /etc/nginx/ssl/bbs.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
- 保存 - 重启nginx
- 增加防火墙协议
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
- 修改hosts文件后,即用浏览器访问https://$host
- curl测试方法
curl -k -H "host:bbs.aminglinux.cc" https://192.168.222.128/index.php