nginx 实现对 HTTP 和 TCP 的反向代理

本贴最后更新于 2156 天前,其中的信息可能已经事过境迁

Nginx 从 1.9.0 开始发布 ngx_stream_core_module 模块,该模块支持 tcp 代理及负载均衡。ngx_stream_core_module 模块默认不启用,需要在编译时通过指定--with-stream 参数来激活这个模块。

1. 编译安装 Nginx

下载地址:https://nginx.org/download/
在编译安装 nginx 之前,要确保 nginx 依赖的一些组件已经安装了。

1.1 检查安装 zlib

rpm -qa | grep zlib

如果未安装,可使用 yum 安装

yum install zlib zlib-devel -y

1.2 检查安装 openssl

rpm -qa | grep openssl

如果未安装,可使用 yum 安装

yum install openssl-devel openssl -y

1.3 检查安装 pcre

rpm -qa | grep pcre

如果未安装,可使用 yum 安装

yum install pcre pcre-devel -y

1.4 安装 nginx

$ tar -zxvf nginx-1.9.15.tar.gz
$ ./configure --prefix=/opt/nginx/ \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-pcre \
--with-stream
$ make
$ make install

编译参数说明

--prefix 指定 nginx 安装路径
--with-http_ssl_module 用于构建一个支持 https 协议的模块,需要 OpenSSL 库,该模块默认不启用
-with-pcre 强制使用 PCRE 库
--with-stream 构建一个支持 TCP/UDP 代理和负载均衡的模块,该模块默认不启用

更多编译参数说明参考 nginx 编译参数详解

2. 配置 http 代理

假设有 3 台主机 node1、node2 和 node3,node1 和 node2 上部署 tomcat,node3 上部署 nginx,如下:

主机名 IP 服务 安装路径
node1 192.168.1.101 tomcat /opt/tomcat
node2 192.168.1.102 tomcat /opt/tomcat
node3 192.168.1.103 nginx /opt/nginx

在 node3 上修改 nginx 配置,vim nginx.conf,内容如下

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http{
  upstream backend{
    server 192.168.1.101:8080 weight=7 max_fails=3 fail_timeout=5s;
    server 192.168.1.102:8080 weight=3 max_fails=3 fail_timeout=5s;
  }
  server{
    listen 8001;
    location /{
      proxy_pass http://backend;
    }
  }
}

配置文件结构说明参考 nginx.conf 详解
其中 upstream 用于配置负载均衡,这里配置了两个服务器做负载均衡,发往 192.168.1.103:8001 的请求会被转发到 node1 和 node2 的 8080 端口。
upstream 负责均衡策略有:轮询(默认),权重 weight,hash 和 ip_hash。上面的配置文件中采用了权重策略。关于 upstream 的详细说明参考 upstream 详解
node1 和 node2 上启动 tomcat,node3 上启动 nginx

/opt/nginx/sbin/nginx

使用浏览器或其它方式访问 http://192.168.1.103:8001 ,观察 tomcat 的访问日志 localhost_access_log,可以看到每次请求都会被转发到 node1 和 node2 的其中一台上。

3. 配置 TCP 代理

修改 node3 上的 nginx 配置文件,vim nginx.conf,增加如下内容

stream{
  upstream ssh {
     hash $remote_addr consistent;
     server 192.168.1.101:22 weight=5;
  }

  server{
    listen 2233;
    proxy_pass ssh;
  }
}

stream 块用于配置 TCP 代理,在 upstream 中使用了 hash 作为负责均衡策略,consistent 参数的作用是:指定使用 ketama 一致性哈希方法,该方法确保在向组中添加服务器或从组中删除服务器时,只有少数密钥将重新映射到不同的服务器。这有助于为缓存服务器实现更高的缓存命中率。
重新加载 nginx 配置文件

/opt/nginx/sbin/nginx -s reload

我们来测试一下,使用 ssh 连接 node3,-p 选项指定端口 2233,如下:

ssh -p 2233 wxyuan@node3

最后你会看到,实际连接的主机是 node1

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...