前言
由于笔者的工作环境是内网环境,无法随意访问外网的服务,对于涉及外部服务的接口一般会通过一台专用的服务器来进行转发,由于nginx天然支持
http
、https
协议的转发,所以用nginx做代理转发起来也没有难度。最近接触到需要访问外部系统的邮件服务器,由于邮件服务是用的smtp
协议,所以无法直接使用nginx的http模块进行代理,后面查询资料后发现nginx可以通过自定义安装stream
模块来转发tcp/udp
协议的请求。而smtp
协议是包含在tcp
协议内的,自然也可以进行转发。
本文将对如何使用nginx的stream模块完成转发来进行介绍,希望对各位读者有所帮助。
一、安装stream
模块
(一)检查是否需要安装stream
模块
默认情况下,nignx是没有附带stream
模块的,不过在安装之前还是可以先通过/$nginx_home/sbin/nignx -V
命令来检查一下是否已安装了这个模块。如果响应的结果中有--with-stream
参数,就说明当前的nginx有安装这个模块
[root@xxx nginx]$ ./sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 3.0.13 30 Jan 2024
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module --with-ipv6 --with-pcre=../pcre-8.45 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-3.0.13 --with-stream
PS:stream模块是从nginx从1.9.0版本
才开始有的,如果本身nginx
版本就比1.9.0版本
低的话,建议先整体升级一下nginx
(二)安装stream
模块
- 配置编译参数时加入
--with stream
参数
./configure --prefix=/opt/nginx ./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module --with-ipv6 --with-pcre=../pcre-8.45 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-3.0.13 --with-stream
- 进行编译
make -j16
注意,我们只希望新增nignx功能模块,并不是重新安装nginx,所以这里并不需要执行make install
命令,然后 -j 16
只是开启多核编译,加快编译速度,不是必填参数。
- 使用
objs目录的nignx
替换掉/$nignx_home/sbin/nginx
的应用
这里建议备份后再执行,且提前停止掉nginx进程。替换完成后,使用nginx -V
命令检查是否成功安装stream模块
二、配置nginx
在nginx.conf文件中,新增stream模块,其实这里更建议单独抽一份stream的配置文件出来,再通过include
的方式导入到nignx.conf
文件中,便于后续管理。
需要注意的是, stream
模块和http
模块同级,记得不要把它配置在http模块里面了
stream {
server {
# 本机监听端口 9000
listen 9000;
proxy_pass xxx.org.cn:25;
}
}
三、重启nignx即可生效
/sbin/nginx -s reload
说在后面
其实除了nginx转发外,通过iptable
来转发也是一种可行的方案,不过个人感觉不如nginx直观,就没采用这种方案。
网友评论