使用Nginx做代理转发是一个非常常用的功能;
比如:有的时候在开发机上使用Docker起了一个服务,这个容器的端口在启动的时候没有暴露,如果后面需要远程访问,就要修改配置,比较麻烦;
此时可以使用 Nginx,在开发机上设置容器的代理(相对于我们手动Ingress),然后就可以连接了!
使用Nginx代理TCP或UDP
安装 Nginx 的部分这里就不介绍了,网上一找一大堆;
这里推荐使用源码的方式编译安装,因为源码包中包括了一些常用模块,可以自行安装!
这里主要是介绍一下 Nginx 代理 TCP 或者 UDP 的配置;
安装ngx_stream_module模块
由于代理 TCP/UDP 依赖 ngx_stream_module 模块,所以首先我们要安装;
安装过这个模块的可以忽略;
首先进入 nginx 解压后的目录:
1 | $ ll |
声明我们的编译配置:
1 | ./configure --prefix=/usr/share/nginx --with-compat --with-http_stub_status_module --with-http_ssl_module --with-stream=dynamic |
注意:这里的
--with-compat一定要带上,否则编译后的链接库可能无法使用!详见:
最后编译:
1 | make |
编译后,在 objs/ 目录下会有编译好的 ngx_stream_module.so 模块:
1 | $ ll objs/*.so |
至此,我们的模块准备完成!
修改Nginx配置
在 ngx_stream_module 模块准备好了之后,首先我们修改 Nginx 的入口配置文件:
在首行引用这个模块,并增加子模块配置:
/etc/nginx/nginx.conf
1 | + load_module /opt/nginx-1.20.1/objs/ngx_stream_module.so; |
强烈推荐使用模块化的方式配置 nginx,即:
在入口文件中只是 include 其他配置文件,而不写其他配置逻辑!
随后在 conf.d 中增加子配置,这里以 clickhouse 的连接代理配置为例:
conf.d/click-house.stream
1 | upstream CLICKHOUSE { |
上面的 172.19.0.2:8123 为容器中的 ip:port,K8S部署的话,可以通过下面的命令获取:
1 | $ kubectl -n my-ch get svc |
而 server 中的 18123 为自己定义的服务器对外代理的 port;
在外部连接的时候,直接使用 server:18123 即可和容器中的ClickHouse连接!
最后,重启 Nginx:
1 | systemctl restart nginx |
即可生效!
附录
文章参考:
- https://cloud.tencent.com/developer/article/1629758
- https://www.xiexianbin.cn/linux/nginx/2018-10-21-nginx-proxy-stream/index.html
- https://www.fxkjnj.com/2560/
- https://www.cnblogs.com/GYoungBean/p/15128007.html
- https://serverfault.com/questions/988250/nginx-module-not-binary-compatible-after-compilation-on-centos-7