小昱个人博客
欢迎来到小昱的世界

勤学如春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏
[原]利用 nginx 进行反向代理和负载均衡
  • 首页 > 运维 > Linux
  • 作者:小昱
  • 2017年5月7日 22:51 星期日
  • 浏览:168
  • 字号:
  • 评论:0
  • 一、Nginx简介

    Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑(这一点与NodeJS采取了相同的做法,支持高并发,Nginx在官方测试的结果中,能够支持五万个平行连接,而在实际的运作中,是可以支持二万至四万个平行链接),削减了上下文调度开销,所以并发服务能力更强。整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。

     

    二、Nginx的配置文件

    使用Nginx的方法就是写配置文件,配置文件能完全控制Nginx,使Nginx按照我们的需求进行运行,所以配置文件的每一项的是干啥的对我们来说就很重要了,具体配置文件各项的含义请参考 nginx.conf配置文件详解,我这里就不赘述了。

     

    三、反向代理

    1. 准备工作

    什么是反向代理?按照我的理解,反向代理是相对于正向代理来说的,因为他们都是代理,所以我先来解释一下什么是代理。所谓代理,就是在客户端和服务端之间强行添加了一层,用来实现流量转发的功能,粗略的框图如下:

    所谓正向代理,是用于代理客户端的。举个很简单的例子:你直接在大陆地区访问google.com肯定是访问不了的,原因大家都知道,现在假如你有一台在美国的主机A,并且能够正常访问,那么你可以将浏览器对google.com的请求先转发给服务器A,服务器A收到请求后,扮演客户端的角色,发起对google.com的请求,服务器A收到响应后,又扮演服务端,将此响应原封不动的返回给你,自此,一次正向代理顺利完成。

    反向代理顾名思义是用来代理服务端的。我们也举个简单的例子来说明:我们知道google.com每秒钟要处理如洪水般的网络请求,这些请求如果仅仅让一台单一的服务器处理,肯定是处理不过来的,我们自然而然的想到让多台服务器来处理这些请求,减少每台服务器的压力。但是现在有一个问题,多个服务器那就产生了多个IP,一般的,google.com只能解析到某个固定的IP(为了方便描述,我们暂且这样认为。实际情况下,通过设置也是可以让同一个域名解析到多个IP的),因为现在存在多个Server,我的一个google.com就不能解析到这些服务器上,而且用多个二级域名比如server1.google.comserver2.google.com等等也给用户造成了使用上的不便(一万台服务器,你咋不上天呢?),那该怎么办呢?通过反向代理可以很好的解决这个问题。为此,我绘制了下面的示意图:

    而本文的主角 —— Nginx就是干这个事的。

    2. 配置反向代理

    2.1 利用 node启动一个本地server。
    node index

    其中index.js

    nginx03

    2.2 配置hosts文件

    Linux为例:

    vim /etc/hosts

    然后在里面添加一条记录:

    test.com  127.0.0.1
    2.3 配置nginx.conf

    http里面添加:

    #本地http-server开启的server,命名为node-server,监听3000端口
    upstream node-server{
        server 127.0.0.1:3000;
    }
    
    # NGINX 虚拟主机,监听8880端口
    server {
        listen 8880;
        server_name test.com;
        access_log /var/log/nginx/node-server;
    
        # Gzip Compression
        gzip on;
        gzip_comp_level 6;
        gzip_vary on;
        gzip_min_length  1000;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_buffers 16 8k;
    
        # 反向代理 node-server
        location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;
          # 代理的地址
          proxy_pass http://node-server;
          proxy_redirect off;
        }
     }
    
    如果需要转发所有的请求,使用正则表达式,使用~启用正则
    location ~ .*|/ {
      proxy_pass 127.0.0.1:3000;
    }

    3. 启动 Nginx

    service nginx start

    4. 测试

    nginx05
    可以看到,对于用户的请求,我们成功反向代理到127.0.0.1:3000上!

     

    四、负载均衡

    负载均衡,这个名称听起来刁刁的有木有!其实嘛,也就那回事,不要被这牛逼哄哄的名词吓住了。之前我们分析了google.com是怎么对请求进行分流的,现在我们就来小小的试验一下。

    1. 另开启一个本地server

    http-server -p 3001

    在此server的根目录下新建index.html,输入’hello, nginx (server 2)’

    2. 配置nginx.conf

    修改之前的配置为:

    #本地http-server开启的server,命名为node-server,监听3000和3001端口
    upstream node-server{
    # weight表示权重,数值越大,表示被分配到这个server的几率越大,这里我们让其相等。
        server 127.0.0.1:3000 weight=1;
        server 127.0.0.1:3001 weight=1;
    }
    
    # NGINX 虚拟主机,监听80端口
    server {
        listen 80;
        server_name test.com;
        access_log /var/log/nginx/node-server;
    
        # Gzip Compression
        gzip on;
        gzip_comp_level 6;
        gzip_vary on;
        gzip_min_length  1000;
        gzip_proxied any;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        gzip_buffers 16 8k;
    
        # 反向代理 node-server
        location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;
          # 代理的地址
          proxy_pass http://node-server;
          proxy_redirect off;
        }
     }
    3. 重启Nginx
    nginx -s reload

    或者

    service nginx restart

    4. 测试

    nginx06

    nginx07

    我们可以看到,对于同一个请求,nginx会按照权重随机的分配到不同的server!这样就完成了均衡负载。对于client来说,好像就只有一台server!

     

    五、问题解决

    解决Nginx的connect() to 127.0.0.1:8080 failed (13: Permission denied) while connect

    在进行Nginx+Tomcat 负载均衡的时候遇到了这个权限问题,在error.log日志中,我们可以看到如下:

    connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream,

    经过一番检查以及google,应该是SeLinux的导致的。可以选择一些两种方式进行:

    CentOS下查看SeLinux状态及关闭SeLinux

    2、执行下面的命令

    setsebool -P httpd_can_network_connect 1

     

    六、CentOS下查看SeLinux状态及关闭SeLinux

    1.查看SELinux状态:

    /usr/sbin/sestatus -v      #如果SELinux status参数为enabled即为开启状态
    SELinux status:                 enabled
    getenforce                 #也可以用这个命令检查

    2.关闭SELinux:

    1、临时关闭(不用重启机器):

    setenforce 0                  #设置SELinux 成为permissive模式
    #setenforce 1                   #设置SELinux 成为enforcing模式

    2、修改配置文件(需要重启机器):

    修改/etc/selinux/config  文件

    SELINUX=enforcing  改为 SELINUX=disabled 

    重启机器即可


    参考资料

    利用 Nginx 进行反向代理和负载均衡

    http://www.hpboys.com/827.html

    http://www.hpboys.com/824.html

      您阅读这篇文章共花了:  
    二维码加载中...
    本文作者:小昱      文章标题: [原]利用 nginx 进行反向代理和负载均衡
    本文地址:http://www.xiaoyulive.top/?post=73
    版权声明:若无注明,本文皆为“小昱个人博客”原创,转载请保留文章出处。
    返回顶部| 首页| 碰碰手气| 捐赠支持| 手机版本|后花园

    Copyright © 2016-2017 小昱个人博客 滇ICP备16006294号