正向代理的重心是放在客户端这边,客户端想访问一个服务,但是这个服务不能直接访问到,但是知道通过代理可以访问,这个代理实现了的功能是在中间中转客户端和服务端的通信。例子:如通过代理服务访问外国服务器。
反向代理的重心是放在服务器端这边。客户端想访问一个服务,就直接访问服务商提供的接口,接口自然会给客户端发送相应信息。看起来是直接的联系,没有代理关系。
但其实这个接口实际上是代表了另外一个的服务器,接口按指定的方式从相应的服务器里拿到客户端需要的信息,再把信息发送给客户端。
对应于正向代理(显性的代理客户端的需求),反向代理对客户端透明的代表了服务器的功能,所以称作反向代理(自己理解)
1)访问不带公网的内网机器
2)解决两台机器之间通信有障碍的问题
目的:客户端通过访问服务器B的反向代理服务器A(具有内网和外网),实现访问服务器B(仅有内网);
组件:
服务器B:LNMP环境,配置好虚拟主机配置文件(包括域名、根目录和程序),一个内网连接地址;
服务器A:nginx,配置反向代理(域名)、跟服务器B同网段的地址,外网地址;
客户端:可以访问服器A外网的网络,域名解释;
具体实现步骤:
A的网络情况:
[root@draft conf.d]# ifconfig
ens33: flags=4163 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
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
B的网络情况:
[root@tanyvlinux conf]# ifconfig
ens33: flags=4163 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 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 mtu 1500
ether 00:50:56:c0:00:01
inet 172.16.92.1 netmask 0xffffff00 broadcast 172.16.92.255
vmnet8: flags=8863 mtu 1500
ether 00:50:56:c0:00:08
inet 192.168.87.1 netmask 0xffffff00 broadcast 192.168.87.255
自测:
[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=/
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;
}
}
172.16.92.151 bbs.tany.com
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"
比如,A B C D 四台WEB服务器,现在E要访问这4台服务器,F为Nginx反向代理服务器,可以让F把E的请求均衡地发送到
A B C D 4台服务器上。
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;
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"
举例:咱们要在网上银行汇款,在你汇款过程当中,你会输入银行卡的密码。如果不加密,这些数据在传输过程中就有可能被人截获。
如果使用了https,那么数据在传输过程中是会加密的。即使抓到了数据包,但是无法破解出来。
# 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;
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload
curl -k -H "host:bbs.aminglinux.cc" https://192.168.222.128/index.php