• Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理


    在上一篇文章中,通过最简单的方式让大家如何在 Linux 环境下搭建 Nginx 服务,同时还收到好几位读者的留言期待后续的 Nginx 系列的文章,那么我们不仅仅是为了搭建服务而搭建,同时要把它利用起来,为我们提供更多的服务。在今天的文章中,进一步带领大家认识什么是 Nginx 的正向代理反向代理以及通过这两个代理做一个简单的实操案例;

    一、正向代理

    正向代理:你可以这样理解,就是把局域网以外的 Internet 想象成一个外网世界,那么当我们局域网中的客户端设备要访问局域网以外的 Internet 时,需在客户端浏览器中配置代理服务器,然后通过代理服务器来进行访问,将访问到的局域网以外的 Internet 网站内容返回给客户端,而不是通过局域网中的客户端设备直接访问到局域网以外的 Internet 网站中,这种代理服务称之为:正向代理

    正向代理的用途:

    • 访问原来无法访问的资源;

    • 可做缓存,加速访问资源;

    • 对客户端访问授权,上网进行认证;

    • 代理可以记录用户访问记录等,且对外隐藏用户信息;

    二、反向代理

    反向代理:无需在客户端进行配置即可访问,我们只需要将请求发送给反向代理服务器,然后由反向代理服务器去选择要访问的目标服务器获取数据后,在返回给客户端。这里你可以这样理解:反向代理服务器目标服务器对外访问的就是一台服务器,知道的是反向代理服务器地址,其实隐藏了真实服务器的 IP 地址, 这种代理服务称之为:反向代理

    反向代理的用途:

    • 保证内网安全,通常将反向代理作为公网访问地址,Web 服务器是内网;

    • 负载均衡,通过反向代理服务器来优化网站的负载;

    三、正向代理配置实操

    Nginx服务器上,修改nginx.conf配置文件,配置到一个 server 块中,如下代码块中的第 35 行,在该 server 块中,server_name 指令,不要设置虚拟主机的名称和 IP,按默认的即可,而resolver是必须要配置的,如没有该指令,Nginx 将无法处理接收到的IP地址,其次,Nginx 代理服务不支持正向代理 HTTPS 站点。

    1. # vi /root/nginx-1.17.0/conf/nginx.conf
    2. 35     server {
    3. 36         resolver 192.168.1.10                         # 指定 Nginx 服务器 IP 地址
    4. 37         listen       80;
    5. 44         location / {
    6. 45             proxy_pass http://$http_host$request_uri; # 设定代理服务器的协议和地址

    重启Nginx服务,关闭防火墙SELINUX

    1. # ./nginx -s reload
    2. # service iptables stop
    3. # setenforce 0

    客户端设备上进行配置代理服务器地址端口号,必须与上述Nginx服务器配置文件的配置相符,这样就可以通过Nginx的正向代理进行访问代理服务器能访问到的资源了。

    进行验证:在客户端浏览器中输入Nginx服务器地址即可;

    四、反向代理前期准备工作实操

    实现效果:通过客户端,在浏览器地址栏中输入Nginx服务器地址,即可访问 Tomcat 页面。

    准备工作

    1、 在Nginx服务器上安装Tomcat,使用默认端口:8080,解压压缩包,进入到Tomcatbin目录下,执行./startup.sh命令启动Tomcat服务;

    2、 添加对外开放端口,保存配置并进行查看;

    3、 通过Windows客户端设备浏览器进行访问Tomcat服务;

    首先,在安装Tomcat前,需要一个 JDK 的环境,那么我们需要在Nginx服务器上查看 JDK 是否有存在,如有可先用系统自带的 JDK ,如不合适可以在手动安装一个。

    1. # java -version
    2. java version "1.7.0_45"
    3. OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
    4. OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

    解压Tomcat压缩包,在bin目录下,执行startup.sh的文件,启动 Tomcat;

    1. # tar -xvf apache-tomcat-7.0.70.tar.gz
    2. # cd apache-tomcat-7.0.70
    3. # ls
    4. bin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work
    5. # cd bin/
    6. # ./startup.sh 
    7. Using CATALINA_BASE:   /root/apache-tomcat-7.0.70
    8. Using CATALINA_HOME:   /root/apache-tomcat-7.0.70
    9. Using CATALINA_TMPDIR: /root/apache-tomcat-7.0.70/temp
    10. Using JRE_HOME:        /usr
    11. Using CLASSPATH:       /root/apache-tomcat-7.0.70/bin/bootstrap.jar:/root/apache-tomcat-7.0.70/bin/tomcat-juli.jar
    12. Tomcat started.

    进入到日志文件中,查看启动效果;

    1. # cd logs/
    2. # tail -f catalina.out 

    Linux环境下,其实并不是所有端口都是开放的,如需添加开放端口,可执行如下命令:

    1. # /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT            # 添加开放端口
    2. # /etc/init.d/iptables save                                      # 保存配置
    3. # service iptables restart                                       # 重启 iptables
    4. # 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服务器也需要配置;

    1. # vi /etc/hosts
    2. 192.168.1.10 www.jacktian.com

    添加环境变量

    1. # vim /etc/profile.d/nginx.sh
    2. export PATH=/usr/local/nginx/sbin:$PATH

    2、 在Nginx进行请求转发的反向代理配置,并在末尾行添加include vhost/*.conf;

    1. # vim /usr/local/nginx/conf/nginx.conf
    2. 35     server {
    3. 36         listen       8000;
    4. 37         server_name  localhost;
    5. 38 
    6. 39         #charset koi8-r;
    7. 40 
    8. 41         #access_log  logs/host.access.log  main;
    9. 42 
    10. 43         location / {
    11. 44             root   html;
    12. 45             index  index.html index.htm;
    13. 46         }
    14. 79     }
    15. 116 include vhost/*.conf;

    /usr/local/nginx/conf/目录下,创建vhost目录,并在该目录下创建tomcat.conf,并添加如下配置;

    1. # mkdir vhost
    2. # cd vhost/
    3. # ls
    4. tomcat.conf
    5. # vim tomcat.conf
    6. 1 server {
    7. 2     listen 80;
    8. 3     server_name 192.168.1.10;
    9. 4 
    10. 5     location / {
    11. 6         proxy_pass http://192.168.1.10:8080;
    12. 7     }
    13. 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服务器,分别为80808081端口;

    /root目录下创建两个Tomcat目录;

    1. # mkdir tomcat8080
    2. # mkdir tomcat8081

    apache-tomcat-7.0.70.tar.gz压缩包分别cp到两个目录中;

    1. # cp -r /root/apache-tomcat-7.0.70.tar.gz /root/tomcat8080
    2. # cp -r /root/apache-tomcat-7.0.70.tar.gz /root/tomcat8081

    查看Tomcat进程

    1. # ps -ef | grep tomcat
    2. root      3974  3280 16 12:15 pts/3    00:00:00 grep tomcat
    3. root     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掉,并进行查看是否已经停止;

    1. # kill -9 64376
    2. # ps -ef | grep tomcat
    3. root      3994  3280  7 12:23 pts/3    00:00:00 grep tomcat

    修改tomcat8080的配置文件,如下;

    1. # vim /root/tomcat8080/apache-tomcat-7.0.70/conf/server.xml
    2. 22 <Server port="8005" shutdown="SHUTDOWN">
    3. 71     <Connector port="8080" protocol="HTTP/1.1"
    4. 93     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    修改tomcat8081的配置文件,如下;

    1. # vim /root/tomcat8081/apache-tomcat-7.0.70/conf/server.xml
    2. 22 <Server port="8015" shutdown="SHUTDOWN">
    3. 71     <Connector port="8081" protocol="HTTP/1.1"
    4. 93     <Connector port="8019" protocol="AJP/1.3" redirectPort="8443" />

    启动tomcat8080tomcat8081的服务;

    1. # ./tomcat8080/apache-tomcat-7.0.70/bin/startup.sh 
    2. # ./tomcat8081/apache-tomcat-7.0.70/bin/startup.sh 

    验证

    在客户端浏览器地址栏中输入:192.168.1.10:8080192.168.1.10:8081查看页面结果;


    Tomcat8080创建文件夹和测试页面

    1. # cd /root/tomcat8080/apache-tomcat-7.0.70/webapps/
    2. # mkdir abc
    3. # cd abc/
    4. # vim 20200320.html
    5. <h1>welcome to tomcat 8080!</h1>

    Tomcat8081创建文件夹和测试页面

    1. # cd /root/tomcat8081/apache-tomcat-7.0.70/webapps/
    2. # mkdir def
    3. # cd def/
    4. # vim 20200320.html
    5. <h1>welcome to tomcat 8081!</h1>

    验证

    在客户端浏览器地址中输入:http://192.168.1.10:8080/abc/20200320.html进行查看;


    2、 配置反向代理至Nginx服务器nginx.conf配置文件;

    1. # vim /usr/local/nginx/conf/nginx.conf
    2. 84     server {
    3. 85         listen       9001;
    4. 86         server_name  192.168.1.10;
    5. 87 
    6. 88         location ~ /abc/ {
    7. 89             proxy_pass http://192.168.1.10:8080;
    8. 90         }
    9. 91 
    10. 92         location ~ /def/ {
    11. 93             proxy_pass http://192.168.1.10:8081;
    12. 94         }
    13. 95     }

    location 配置指令说明:

    用法:用于匹配 URI;

    语法格式:

    1. location [ = | ~ | ~* | ^~ ] uri {
    2. }
    • =:用于不含正则表达式的 URI 前,要求请求字符串与 URI 匹配,如匹配成功,将停止向下搜索并处理该请求;

    • ~:用于表示 URI 包含正则表达式,并区分大小写;

    • ~*:用于表示 URI 包含正则表达式,区分大小写;

    • ^~:用于不含正则表达式的 URI 前,需 Nginx 服务器找到标识 URI 和请求字符串匹配度高的 location 后,立即使用此 location 处理请求,不再使用 location 块中的正则 URI 的请求字符串做匹配;

    如果 URI 包含正则表达式,则必须要有~~*标识。

    编辑防火墙配置文件,添加对外开放端口808080819001

    1. # vim /etc/sysconfig/iptables
    2. 6 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    3. 7 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
    4. 8 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
    5. 9 -A INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT

    重启防火墙,并进行查看;

    1. # /etc/init.d/iptables restart
    2. # service iptables status
    3. 表格:filter
    4. Chain INPUT (policy ACCEPT)
    5. num  target     prot opt source               destination         
    6. 1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
    7. 2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8080 
    8. 3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8081 
    9. 4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:9001 

    最后,重启Nginx服务,或重新加载配置文件;

    1. # cd /usr/local/nginx/
    2. # cd sbin/
    3. # ls
    4. nginx
    5. # ./nginx -s stop
    6. # ./nginx 

    验证

    在客户端浏览器地址中输入:http://192.168.1.10:9001/abc/20200320.html进行查看;

    七、常见问题

    当重启Nginx服务时,出现如下报错现象:

    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    

    解决办法:

    当出现这种错误时,意味着80端口被占用了,执行如下命令,将进程杀死后,启动Nginx

    1. # fuser -k 80/tcp
    2. # ./nginx

    总结

    通过本篇文章,介绍了什么是正向代理反向代理正向代理反向代理用途、正向代理配置实操、反向代理前期准备工作实操、反向代理配置操作案例(一):通过在Windows客户端设备修改Hosts文件,添加域名及IP,Nginx服务器上配置转发反向代理,客户端通过访问Nginx服务器的域名自动跳转至Tomcat的主页面中,反向代理配置操作案例(二):使用Nginx反向代理,根据所访问的路径跳转至不同端口的服务中等;

  • 相关阅读:
    距离度量 —— 汉明距离(Hamming Distance)
    如何用 Python 实现自动化监控文件夹完成服务部署
    概念解析 | 神经网络中的位置编码(Positional Encoding)
    python tk展示图片
    Web3:开源文化下的技术创新
    利用Freemaker模板引擎制作包含表格和图片的word导出模板
    软考 系统架构设计师系列知识点之边缘计算(5)
    Compose Material 3 稳定版现已发布 | 2022 Android 开发者峰会
    【数据结构与算法】leetcode110.判断平衡二叉树
    刘德华被奥迪第三方策划公司给坑了
  • 原文地址:https://blog.csdn.net/biyusr/article/details/125480114