当前位置:   article > 正文

Nginx反向代理与负载均衡_nginx反向代理负载均衡英语

nginx反向代理负载均衡英语

       反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

       负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

       一个最简单的反向代理与负载均衡的例子,如下图所示,传统项目都是用户直接访问tomcat服务,这样的话,当用户访问量很大的情况下,tomcat便不堪其受,挂掉了,为了解决高并发的情况,便采用Nginx作为反向代理服务器,由它来管理多个tomcat,可以采用轮询的方式(平均分配请求数量),由于每个tomcat所在的设备的性能也可能不一样,因此也可以设置不同的权重,性能好的服务器就多分配点访问量,性能差点的就少分点,用户只需要统一访问Nginx反向代理服务器即可,Nginx会把请求分给不同的tomcat去解决。


       我在192.168.156.11这台设备上安装了nginx,现在我们就来看一个最简单的反向代理的例子,我们在nginx.conf文件的server当中配置一个location,该location以正则表达式的形匹配.jsp结尾的请求,匹配之后会让请求转向到http://192.168.156.11:8080(这台设备的tomcat服务),配置如下所示("."前面的"\"是为了转义)。

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. #charset koi8-r;
  5. #access_log logs/host.access.log main;
  6. location / {
  7. root html;
  8. index index.html index.htm;
  9. }
  10. location ~ \.jsp$ {
  11. proxy_pass http://192.168.156.11:8080;
  12. }
  13. #error_page 404 /404.html;
  14. # redirect server error pages to the static page /50x.html
  15. #
  16. error_page 500 502 503 504 /50x.html;
  17. location = /50x.html {
  18. root html;
  19. }
  20. access_log logs/access.log main;
  21. }
       既然请求会被转向到这台设备的tomcat服务,那么我们便需要在这台设备上安装一个tomcat服务。我们向该设备的/usr/local/software目录下上传tomcat安装包,大家可以到:http://download.csdn.net/detail/u012453843/9794438这个地址进行下载,下载完之后上传到/usr/local/software目录下(如果没有创建software目录的话,先创建一下,这个目录专门存放我们的安装包)如下图所示。


         下面对apache-tomcat-7.0.47.tar.gz进行解压,部分信息如下:

  1. [root@nginx1 software]# tar -zxvf apache-tomcat-7.0.47.tar.gz -C /usr/local/
  2. apache-tomcat-7.0.47/bin/catalina.sh
  3. apache-tomcat-7.0.47/bin/configtest.sh
  4. apache-tomcat-7.0.47/bin/daemon.sh
          解压完之后,我们到/usr/local下找到解压好的tomcat目录,可以看到apache-tomcat-7.0.47这么一个目录。如下所示。

  1. [root@nginx1 software]# cd /usr/local/
  2. [root@nginx1 local]# ll
  3. 总用量 60
  4. drwxr-xr-x. 9 root root 4096 4月 8 17:59 apache-tomcat-7.0.47
  5. drwxr-xr-x. 2 root root 4096 9月 23 2011 bin
  6. drwxr-xr-x. 2 root root 4096 9月 23 2011 etc
  7. drwxr-xr-x. 3 root root 4096 4月 3 22:56 fast
  8. drwxr-xr-x. 2 root root 4096 9月 23 2011 games
  9. drwxr-xr-x. 2 root root 4096 9月 23 2011 include
  10. drwxr-xr-x. 2 root root 4096 9月 23 2011 lib
  11. drwxr-xr-x. 2 root root 4096 9月 23 2011 lib64
  12. drwxr-xr-x. 2 root root 4096 9月 23 2011 libexec
  13. drwxr-xr-x. 12 root root 4096 4月 8 05:46 nginx
  14. drwxr-xr-x. 9 1001 1001 4096 4月 7 04:28 nginx-1.6.2
  15. drwxr-xr-x. 2 root root 4096 9月 23 2011 sbin
  16. drwxr-xr-x. 5 root root 4096 4月 1 07:09 share
  17. drwxr-xr-x. 2 root root 4096 4月 3 21:40 software
  18. drwxr-xr-x. 2 root root 4096 9月 23 2011 src
  19. [root@nginx1 local]#
        我们进入到apache-tomcat-7.0.47的webapps目录下,如下所示,可以看到webapps目录下有五个文件夹,我们把ROOT之外的其它四个文件夹。(ROOT文件夹我们最好不雅删除,因为它里面有tomcat的欢迎页等文件,删除之后启动tomccat不会自动生成ROOT,我们访问tomcat首页就访问不到了),如下所示。

  1. [root@nginx1 local]# cd apache-tomcat-7.0.47/
  2. [root@nginx1 apache-tomcat-7.0.47]# ls
  3. bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work
  4. [root@nginx1 apache-tomcat-7.0.47]# cd webapps/
  5. [root@nginx1 webapps]# ls
  6. docs examples host-manager manager ROOT
  7. [root@nginx1 webapps]# rm -rf docs examples host-manager manager
  8. [root@nginx1 webapps]# ll
  9. drwxr-xr-x. 3 root root 4096 4月   8 20:00 ROOT
  10. [root@nginx1 webapps]#
         在启动tomcat之前,需要有jdk环境,大家可以到http://blog.csdn.net/u012453843/article/details/52422736这个地址下载jdk8,如果想用jdk7的话,可以到http://download.csdn.net/detail/u012453843/9807358这个地址进行下载。关于如何安装jdk,大家可以参考http://blog.csdn.net/u012453843/article/details/52422736这篇博客进行学习。

         jdk安装完之后,我们来启动tomcat,可以使用tailf logs/catalina.out来查看启动信息,如下所示。

  1. [root@nginx1 local]# cd apache-tomcat-7.0.47/
  2. [root@nginx1 apache-tomcat-7.0.47]# ls
  3. bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work
  4. [root@nginx1 apache-tomcat-7.0.47]# bin/startup.sh
  5. Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.47
  6. Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.47
  7. Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.47/temp
  8. Using JRE_HOME: /usr/java/jdk1.8.0_112
  9. Using CLASSPATH: /usr/local/apache-tomcat-7.0.47/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.47/bin/tomcat-juli.jar
  10. [root@nginx1 apache-tomcat-7.0.47]# tailf logs/catalina.out
  11. 四月 08, 2017 7:53:29 下午 org.apache.catalina.core.StandardService startInternal
  12. 信息: Starting service Catalina
  13. 四月 08, 2017 7:53:29 下午 org.apache.catalina.core.StandardEngine startInternal
  14. 信息: Starting Servlet Engine: Apache Tomcat/7.0.47
  15. 四月 08, 2017 7:53:29 下午 org.apache.coyote.AbstractProtocol start
  16. 信息: Starting ProtocolHandler ["http-bio-8080"]
  17. 四月 08, 2017 7:53:29 下午 org.apache.coyote.AbstractProtocol start
  18. 信息: Starting ProtocolHandler ["ajp-bio-8009"]
  19. 四月 08, 2017 7:53:29 下午 org.apache.catalina.startup.Catalina start
  20. 信息: Server startup in 78 ms
        在访问tomcat首页之前,我们还需要做件事情,那就是配置一下防火墙,让8080端口可以被外界访问,我们需要在/etc/sysconfig/iptables文件当中添加-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT这么一行内容,如下所示。

  1. [root@nginx1 webapps]# vim /etc/sysconfig/iptables
  2. # Firewall configuration written by system-config-firewall
  3. # Manual customization of this file is not recommended.
  4. *filter
  5. :INPUT ACCEPT [0:0]
  6. :FORWARD ACCEPT [0:0]
  7. :OUTPUT ACCEPT [0:0]
  8. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  9. -A INPUT -p icmp -j ACCEPT
  10. -A INPUT -i lo -j ACCEPT
  11. -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  12. -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
  13. -A INPUT -m state --state NEW -m tcp -p tcp --dport 1234 -j ACCEPT
  14. -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
  15. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  16. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  17. COMMIT
       添加完之后,我们需要重启防火墙,如下所示。

  1. [root@nginx1 apache-tomcat-7.0.47]# service iptables restart
  2. iptables:将链设置为政策 ACCEPT:filter [确定]
  3. iptables:清除防火墙规则: [确定]
  4. iptables:正在卸载模块: [确定]
  5. iptables:应用防火墙规则: [确定]
        下面我们便可以访问tomcat首页了,我们在地址栏输入http://192.168.156.11:8080回车就可以看到如下图所示界面了。

        下面我们在ROOT目录下新建一个test.jsp,代码如下,remote ip后面的内容被注释掉了,nginx server ip会输出访问该test.jsp文件的设备的IP。

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>Test Page</title>
  7. </head>
  8. <body>
  9. Test1 Page!!!<br/>
  10. remote ip : <%-- <%=request.getHeader("X-real-ip") %> --%> <br/>
  11. nginx server ip : <%=request.getRemoteAddr()%>
  12. </body>
  13. </html>
        ROOT目录下的文件列表如下,可以看到有test.jsp。

  1. [root@nginx1 ROOT]# pwd
  2. /usr/local/apache-tomcat-7.0.47/webapps/ROOT
  3. [root@nginx1 ROOT]# ll
  4. 总用量 204
  5. -rw-r--r--. 1 root root 17811 4月 8 20:00 asf-logo.png
  6. -rw-r--r--. 1 root root 5866 4月 8 20:00 asf-logo-wide.gif
  7. -rw-r--r--. 1 root root 713 4月 8 20:00 bg-button.png
  8. -rw-r--r--. 1 root root 1918 4月 8 20:00 bg-middle.png
  9. -rw-r--r--. 1 root root 1392 4月 8 20:00 bg-nav-item.png
  10. -rw-r--r--. 1 root root 1401 4月 8 20:00 bg-nav.png
  11. -rw-r--r--. 1 root root 3103 4月 8 20:00 bg-upper.png
  12. -rw-r--r--. 1 root root 3376 4月 8 20:00 build.xml
  13. -rw-r--r--. 1 root root 21630 4月 8 20:00 favicon.ico
  14. -rw-r--r--. 1 root root 12308 4月 8 20:00 index.jsp
  15. -rw-r--r--. 1 root root 8826 4月 8 20:00 RELEASE-NOTES.txt
  16. -rw-r--r--. 1 root root 471 11月 28 01:11 test.jsp
  17. -rw-r--r--. 1 root root 5576 4月 8 20:00 tomcat.css
  18. -rw-r--r--. 1 root root 2066 4月 8 20:00 tomcat.gif
  19. -rw-r--r--. 1 root root 5103 4月 8 20:00 tomcat.png
  20. -rw-r--r--. 1 root root 2376 4月 8 20:00 tomcat-power.gif
  21. -rw-r--r--. 1 root root 67198 4月 8 20:00 tomcat.svg
  22. drwxr-xr-x. 2 root root 4096 4月 8 20:00 WEB-INF
  23. [root@nginx1 ROOT]#
        我们在地址栏直接访问tomcat服务器下的test.jsp:192.168.156.11:8080/test.jsp,如下所示,可以看到当前访问test.jsp的正是我的本机的IP地址。这时是没有经过nginx的。

         下面我们访问nginx,在访问之前先启动nginx,如下所示。

  1. [root@nginx1 conf]# /usr/local/nginx/sbin/nginx
  2. [root@nginx1 conf]# ps -ef | grep nginx
  3. root 1785 1 0 20:35 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
  4. nobody 1786 1785 0 20:35 ? 00:00:00 nginx: worker process
  5. root 1788 1371 0 20:36 pts/0 00:00:00 grep nginx
  6. [root@nginx1 conf]#

         启动完nginx,我们根据在server的location中设置的正则表达式规则,在地址栏输入:http://192.168.156.11/test.jsp,可以看到如下图所示界面,这时我们看到的请求test.jsp的IP是192.168.156.11不再是192.168.156.200,出现这种情况的原因是,我们现在是通过先访问nginx,nginx再去访问test.jsp,因此这时远程调用者IP变成了192.168.156.11。这显然是不合理,因为我们就是从192.168.156.200上去发起请求的,我们当然想知道真实的调用者是谁。

       要想获取真实访问者的IP,我们需要配置下nginx.conf,在我们上面配置的location里面加上一行proxy_set_header X-real-ip $remote_addr;如下所示。加的这行内容的意思是,使用proxy_set_header设置一个参数,X-real-ip是自己随便起的名字,也可以叫其他名字,$remote_addr的意思是获取远程调用者IP,我们知道我们是用本机IP去访问Nginx,这时的remote_addr当然是我们本机的IP了。这样我们把本机的IP(192.168.156.100)放到header当中,可以通过key(X-real-ip)得到。

  1. location ~ \.jsp$ {
  2. #设置客户端真实ip地址
  3. proxy_set_header X-real-ip $remote_addr;
  4. proxy_pass http://192.168.156.11:8080;
  5. }

      修改完配置文件,记得重启下nginx。

  1. [root@nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload
  2. [root@nginx1 conf]#

      下面我们把test.jsp的那段被注释掉的代码放开,也就是remote ip后面的那段被注释掉的代码放开,放开之后,如下所示,可以看到,我们是通过去header中取"X-real-ip"的值来获取真实调用者的IP。

  1. [root@nginx1 ROOT]# vim test.jsp
  2. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Test Page</title>
  8. </head>
  9. <body>
  10. Test1 Page!!!<br/>
  11. remote ip : <%=request.getHeader("X-real-ip") %> <br/>
  12. nginx server ip : <%=request.getRemoteAddr()%>
  13. </body>
  14. </html>
          这时我们再访问http://192.168.156.11/test.jsp,如下图所示,这时我们可以看到remote ip的值便是真实调用test.jsp的本机IP地址了。

         上面说的是反向代理,下面我们说下负载均衡,其实负载均衡无非就是代理多台设备并且按某种策略进行分配任务,我们需要在nginx.conf文件的server外配置如下内容,myapp是我随便起的名字,myapp管理着两台设备,分别是192.168.156.11和192.168.156.12,weight=1代表权重,权重一样的话,请求过来nginx会采用轮询的方式分给两台设备,当然,负载均衡的策略还有很多种,这里只是介绍最简单的权重策略而已。max_fails=2的意思是,最大允许连接失败的次数是2次,fail_timeout=30s的意思是每次连接允许的最大超时时间是30s。

  1. upstream myapp {
  2.        server 192.168.156.11:8080 weight=1 max_fails=2 fail_timeout=30s;
  3.        server 192.168.156.12:8080 weight=1 max_fails=2 fail_timeout=30s;
  4.     }
        我们还需要在location中做些相应的配置,比如我们就在nginx默认的那个location当中添加两行内容,分别是proxy_set_header X-real-ip $remote_addr;和proxy_pass http://myapp;这个myapp就是我们上面定义的那个upstream。

  1. location / {
  2. proxy_set_header X-real-ip $remote_addr;
  3. proxy_pass http://myapp;
  4. root html;
  5. index index.html index.htm;
  6. }
        现在nginx.conf文件的全部内容如下:

  1. #user nobody;
  2. worker_processes 1;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. '$status $body_bytes_sent "$http_referer" '
  15. '"$http_user_agent" "$http_x_forwarded_for"';
  16. #access_log logs/access.log main;
  17. sendfile on;
  18. #tcp_nopush on;
  19. #keepalive_timeout 0;
  20. keepalive_timeout 65;
  21. #gzip on;
  22. upstream myapp {
  23.        server 192.168.156.11:8080 weight=1 max_fails=2 fail_timeout=30s;
  24.        server 192.168.156.12:8080 weight=1 max_fails=2 fail_timeout=30s;
  25.     }
  26. server {
  27. listen 80;
  28. server_name localhost;
  29. #charset koi8-r;
  30. #access_log logs/host.access.log main;
  31. location / {
  32. proxy_set_header X-real-ip $remote_addr;
  33. proxy_pass http://myapp;
  34. root html;
  35. index index.html index.htm;
  36. }
  37. #location ~ \.jsp$ {
  38. #设置客户端真实ip地址
  39. # proxy_set_header X-real-ip $remote_addr;
  40. # proxy_pass http://192.168.156.11:8080;
  41. #}
  42. #error_page 404 /404.html;
  43. # redirect server error pages to the static page /50x.html
  44. #
  45. error_page 500 502 503 504 /50x.html;
  46. location = /50x.html {
  47. root html;
  48. }
  49. access_log logs/access.log main;
  50. }
  51. server {
  52. listen 1234;
  53. server_name test.com;
  54. location ~ tester {
  55. if ($http_user_agent ~* chrome) {
  56. rewrite ^.*$ /chrome.html;
  57. break;
  58. }
  59. root tester;
  60. index tester111.html;
  61. }
  62. location /goods {
  63. rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
  64. root tester;
  65. index tester111.html;
  66. }
  67. access_log logs/test.com.log main;
  68. }
  69. }
      由于修改了nginx.conf文件,我们需要重启下nginx,如下所示。

  1. [root@nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload
  2. [root@nginx1 conf]#

      由于涉及到了两台设备,因此我们现在还需要启动我们的192.168.156.12这台虚拟机,在这台设备上也要安装jdk、tomcat、nginx、配置防火墙让外界可以访问8080端口。另外我们把192.168.156.11上的test.jsp文件复制到192.168.156.12上一份,如下所示。

  1. [root@nginx1 conf]# scp /usr/local/apache-tomcat-7.0.47/webapps/ROOT/test.jsp 192.168.156.12:/usr/local/apache-tomcat-7.0.47/webapps/ROOT/
  2. root@192.168.156.12's password:
  3. test.jsp 100% 464 0.5KB/s 00:00
  4. [root@nginx1 conf]#
       复制好之后,我们到192.168.156.12上打开test.jsp文件并将Test都修改为Test2,这样好区分我们访问的是哪台tomcat下的test.jsp文件。如下所示。

  1. [root@nginx2 ROOT]# vim test.jsp
  2. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Test2 Page</title>
  8. </head>
  9. <body>
  10. Test2 Page!!!<br/>
  11. remote ip : <%=request.getHeader("X-real-ip") %> <br/>
  12. nginx server ip : <%=request.getRemoteAddr()%>
  13. </body>
  14. </html>

      下面我们来启动192.168.156.12这台设备的tomcat,如下所示。

  1. [root@nginx2 apache-tomcat-7.0.47]# bin/startup.sh
  2. Using CATALINA_BASE: /usr/local/apache-tomcat-7.0.47
  3. Using CATALINA_HOME: /usr/local/apache-tomcat-7.0.47
  4. Using CATALINA_TMPDIR: /usr/local/apache-tomcat-7.0.47/temp
  5. Using JRE_HOME: /usr/java/jdk1.8.0_112
  6. Using CLASSPATH: /usr/local/apache-tomcat-7.0.47/bin/bootstrap.jar:/usr/local/apache-tomcat-7.0.47/bin/tomcat-juli.jar
  7. [root@nginx2 apache-tomcat-7.0.47]# tailf logs/catalina.out
  8. 四月 08, 2017 9:36:07 下午 org.apache.catalina.core.StandardEngine startInternal
  9. 信息: Starting Servlet Engine: Apache Tomcat/7.0.47
  10. 四月 08, 2017 9:36:07 下午 org.apache.catalina.startup.HostConfig deployDirectory
  11. 信息: Deploying web application directory /usr/local/apache-tomcat-7.0.47/webapps/ROOT
  12. 四月 08, 2017 9:36:08 下午 org.apache.coyote.AbstractProtocol start
  13. 信息: Starting ProtocolHandler ["http-bio-8080"]
  14. 四月 08, 2017 9:36:08 下午 org.apache.coyote.AbstractProtocol start
  15. 信息: Starting ProtocolHandler ["ajp-bio-8009"]
  16. 四月 08, 2017 9:36:08 下午 org.apache.catalina.startup.Catalina start
  17. 信息: Server startup in 832 ms
       下面我们先直接访问两台设备的tomcat,如下图所示。


      下面我们来通过访问nginx来间接访问test.jsp,如下图所示。注:nginx默认的访问端口是80,我们可以不用输入80,。可以看到我们每刷新一次页面我们访问的test.jsp便是在两台设备的tomcat之间切换。这样便实现了负载均衡。



      









         



 

            

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/733325
推荐阅读
相关标签
  

闽ICP备14008679号