Nginx 系列教程(二)| 一文带你读懂 Nginx 的正向与反向代理
作者:JackTian
来源:公众号【杰哥的IT之旅】
ID:Jake_Internet
在上一篇文章中,通过最简单的方式让大家如何在 Linux 环境下搭建 Nginx 服务,同时还收到好几位读者的留言期待后续的 Nginx 系列的文章,那么我们不仅仅是为了搭建服务而搭建,同时要把它利用起来,为我们提供更多的服务。在今天的文章中,进一步带领大家认识什么是 Nginx 的
正向代理
与
反向代理
以及通过这两个代理做一个简单的实操案例;
一、正向代理
正向代理
:你可以这样理解,就是把局域网以外的 Internet 想象成一个外网世界,那么当我们局域网中的客户端设备要访问局域网以外的 Internet 时,
需在客户端浏览器中配置代理服务器
,然后通过代理服务器来进行访问,将访问到的局域网以外的 Internet 网站内容返回给客户端,
而不是通过局域网中的客户端设备直接访问到局域网以外的 Internet 网站中
,这种代理服务称之为:
正向代理
。
正向代理的用途:
-
访问原来无法访问的资源;
-
可做缓存,加速访问资源;
-
对客户端访问授权,上网进行认证;
-
代理可以记录用户访问记录等,且对外隐藏用户信息;
二、反向代理
反向代理
:无需在客户端进行配置即可访问,我们只需要将请求发送给
反向代理服务器
,然后由
反向代理服务器
去选择要访问的
目标服务器
获取数据后,在返回给
客户端
。这里你可以这样理解:
反向代理服务器
和
目标服务器
对外访问的就是一台服务器,知道的是
反向代理服务器
地址,其实
隐藏了真实服务器的 IP 地址,
这种代理服务称之为:
反向代理
。
反向代理的用途:
-
保证内网安全,通常将反向代理作为公网访问地址,Web 服务器是内网;
-
负载均衡,通过反向代理服务器来优化网站的负载;
三、正向代理配置实操
在
Nginx
服务器上,修改
nginx.conf
配置文件,配置到一个 server 块中,如下代码块中的
第 35 行
,在该 server 块中,
server_name 指令,不要设置虚拟主机的名称和 IP,按默认的即可
,而
resolver
是必须要配置的,如没有该指令,Nginx 将无法处理接收到的
IP地址
,其次,
Nginx 代理服务不支持正向代理 HTTPS 站点。
# vi /root/nginx-1.17.0/conf/nginx.conf35 server {36 resolver 192.168.1.10 # 指定 Nginx 服务器 IP 地址37 listen 80;44 location / {45 proxy_pass http://$http_host$request_uri; # 设定代理服务器的协议和地址
重启
Nginx
服务,关闭
防火墙
和
SELINUX
。
# ./nginx -s reload# service iptables stop# setenforce 0
在
客户端
设备上进行配置代理服务器
地址
和
端口号
,必须与上述
Nginx
服务器配置文件的配置相符,这样就可以通过
Nginx
的正向代理进行访问代理服务器能访问到的资源了。
进行验证:在
客户端
浏览器中输入
Nginx
服务器地址即可;
四、反向代理前期准备工作实操
实现效果
:通过
客户端
,在浏览器地址栏中输入
Nginx
服务器地址,即可访问 Tomcat 页面。
准备工作
1、
在
Nginx
服务器上安装
Tomcat
,使用默认端口:
8080
,解压压缩包,进入到
Tomcat
的
bin
目录下,执行
./startup.sh
命令启动
Tomcat
服务;
2、 添加对外开放端口,保存配置并进行查看;
3、
通过Windows客户端设备浏览器进行访问
Tomcat
服务;
首先,在安装
Tomcat
前,需要一个 JDK 的环境,那么我们需要在
Nginx
服务器上查看 JDK 是否有存在,如有可先用系统自带的 JDK ,如不合适可以在手动安装一个。
# java -versionjava version "1.7.0_45"OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
解压
Tomcat
压缩包,在
bin
目录下,执行
startup.sh
的文件,启动 Tomcat;
# tar -xvf apache-tomcat-7.0.70.tar.gz# cd apache-tomcat-7.0.70# lsbin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work# cd bin/# ./startup.sh Using CATALINA_BASE: /root/apache-tomcat-7.0.70Using CATALINA_HOME: /root/apache-tomcat-7.0.70Using CATALINA_TMPDIR: /root/apache-tomcat-7.0.70/tempUsing JRE_HOME: /usrUsing CLASSPATH: /root/apache-tomcat-7.0.70/bin/bootstrap.jar:/root/apache-tomcat-7.0.70/bin/tomcat-juli.jarTomcat started.
进入到日志文件中,查看启动效果;
# cd logs/# tail -f catalina.out
在
Linux
环境下,其实并不是所有端口都是开放的,如需添加开放端口,可执行如下命令:
# /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 添加开放端口# /etc/init.d/iptables save # 保存配置# service iptables restart # 重启 iptables# netstat -ntlp # 查看开放的端口号
在客户端设备上进行验证;
五、反向代理配置操作案例(一)
实现效果
准备工作
1、
在 Windows 客户端的
Host
文件中配置
域名
和
IP
的对应关系;
在Windows中
C:\Windows\System32\drivers\etc
路径下找到
Hosts
文件,通过本地以管理员身份打开记事本,找到
Hosts
文件的路径,进行添加
域名
和
IP
;
添加完毕后,保存,切记不要是
.txt
格式的文件,直接替换掉原有的
Hosts
文件即可;
192.168.1.10 www.jacktian.com
除
Windows
客户端配置外,
Nginx
服务器也需要配置;
# vi /etc/hosts
192.168
.1.10 www.jacktian.com
添加环境变量
# vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
2、
在
Nginx
进行请求转发的反向代理配置,并在末尾行添加
include vhost/*.conf;
# vim /usr/local/nginx/conf/nginx.conf35 server {36 listen 8000;37 server_name localhost;38 39 #charset koi8-r;40 41 #access_log logs/host.access.log main;42 43 location / {44 root html;45 index index.html index.htm;46 }79 }116 include vhost/*.conf;
在
/usr/local/nginx/conf/
目录下,创建
vhost
目录,并在该目录下创建
tomcat.conf
,并添加如下配置;
# mkdir vhost# cd vhost/# lstomcat.conf# vim tomcat.conf1 server {2 listen 80;3 server_name 192.168.1.10;4 5 location / {6 proxy_pass http://192.168.1.10:8080;7 }8 }
在
Windows
客户端进行访问域名:
www.jacktian.com
验证;
六、反向代理配置操作案例(二)
实现效果
使用
Nginx
反向代理,根据所访问的路径跳转至不同端口的服务中。
Nginx 监听端口为:9001
访问
http://192.168.1.10:9001/abc
直接跳转至
192.168.1.10:8080
访问
http://192.168.1.10:9001/def
直接跳转至
192.168.1.10:8081
准备工作
1、
准备
2台Tomcat
服务器,分别为
8080
和
8081
端口;
在
/root
目录下创建两个
Tomcat
目录;
# mkdir tomcat8080# mkdir tomcat8081
将
apache-tomcat-7.0.70.tar.gz
压缩包分别
cp
到两个目录中;
# cp -r /root/apache-tomcat-7.0.70.tar.gz /root/tomcat8080
# cp -r /root/apache-tomcat-7.0.70.tar.gz /root/tomcat8081
查看
Tomcat
进程
# ps -ef | grep tomcatroot 3974 3280 16 12:15 pts/3 00:00:00 grep tomcatroot 64376 1 0 Jun07 pts/2 00:05:37 /usr/bin/java -Djava.util.logging.config.file=/root/apache-tomcat-7.0.70/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/root/apache-tomcat-7.0.70/endorsed -classpath /root/apache-tomcat-7.0.70/bin/bootstrap.jar:/root/apache-tomcat-7.0.70/bin/tomcat-juli.jar -Dcatalina.base=/root/apache-tomcat-7.0.70 -Dcatalina.home=/root/apache-tomcat-7.0.70 -Djava.io.tmpdir=/root/apache-tomcat-7.0.70/temp org.apache.catalina.startup.Bootstrap start
将原有的
Tomcat
服务
kill
掉,并进行查看是否已经停止;
# kill -9 64376# ps -ef | grep tomcatroot 3994 3280 7 12:23 pts/3 00:00:00 grep tomcat
修改
tomcat8080
的配置文件,如下;
# vim /root/tomcat8080/apache-tomcat-7.0.70/conf/server.xml
22 <Server port="8005" shutdown="SHUTDOWN">71 <Connector port="8080" protocol="HTTP/1.1"93 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改
tomcat8081
的配置文件,如下;
# vim /root/tomcat8081/apache-tomcat-7.0.70/conf/server.xml22 <Server port="8015" shutdown="SHUTDOWN">71 <Connector port="8081" protocol="HTTP/1.1"93 <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />
启动
tomcat8080
和
tomcat8081
的服务;
# ./tomcat8080/apache-tomcat-7.0.70/bin/startup.sh # ./tomcat8081/apache-tomcat-7.0.70/bin/startup.sh
验证
在客户端浏览器地址栏中输入:
192.168.1.10:8080
和
192.168.1.10:8081
查看页面结果;
Tomcat8080
创建文件夹和测试页面
# cd /root/tomcat8080/apache-tomcat-7.0.70/webapps/
# mkdir abc# cd abc/# vim 20200320.html<h1>welcome to tomcat 8080!</h1>
Tomcat8081
创建文件夹和测试页面
# cd /root/tomcat8081/apache-tomcat-7.0.70/webapps/# mkdir def# cd def/# vim 20200320.html<h1>welcome to tomcat 8081!</h1>
验证
在客户端浏览器地址中输入:
http://192.168.1.10:8080/abc/20200320.html
进行查看;
2、
配置反向代理至
Nginx
服务器
nginx.conf
配置文件;
# vim /usr/local/nginx/conf/nginx.conf84 server {85 listen 9001;86 server_name 192.168.1.10;87 88 location ~ /abc/ {89 proxy_pass http://192.168.1.10:8080;90 }91 92 location ~ /def/ {93 proxy_pass http://192.168.1.10:8081;94 }95 }
location 配置指令说明:
用法:用于匹配 URI;
语法格式:
location [ = | ~ | ~* | ^~ ] uri {
}
-
=:用于不含正则表达式的 URI 前,要求请求字符串与 URI 匹配,如匹配成功,将停止向下搜索并处理该请求;
-
~:用于表示 URI 包含正则表达式,并区分大小写;
-
~*:用于表示 URI 包含正则表达式,
不
区分大小写; -
^~:用于不含正则表达式的 URI 前,需 Nginx 服务器找到标识 URI 和请求字符串匹配度高的 location 后,立即使用此 location 处理请求,不再使用 location 块中的正则 URI 的请求字符串做匹配;
如果 URI 包含正则表达式,则必须要有
~
或~*
标识。
编辑防火墙配置文件,添加对外开放端口
8080
、
8081
、
9001
;
# vim /etc/sysconfig/iptables6 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT7 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT8 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT9 -A INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT
重启防火墙,并进行查看;
# /etc/init.d/iptables restart# service iptables status表格:filterChain INPUT (policy ACCEPT)num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8080 3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8081 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:9001
最后,重启
Nginx
服务,或重新加载配置文件;
# cd /usr/local/nginx/# cd sbin/# lsnginx# ./nginx -s stop# ./nginx
验证
在客户端浏览器地址中输入:
http://192.168.1.10:9001/abc/20200320.html
进行查看;
七、常见问题
当重启
Nginx
服务时,出现如下报错现象: