项目中遇到某些服务在内网,需要外网访问的情况,需要配置代理访问。可用nginx搭建代理服务。
TCP代理
通过nginx的stream
模块可以直接代理TCP服务,步骤如下:
- 在
/etc/nginx/
下新建proxy文件夹,用于存放代理配置。 - 此处以mysql为例,假设mysql服务在mysqlserver,新建
mysqlproxy.conf
文件,编辑以下内容:
upstream mysqlproxy {server mysqlserver:3306;}server {listen 3306;proxy_pass mysqlproxy;proxy_connect_timeout 1h;proxy_timeout 1h;}
- 编辑
/etc/nginx/nginx.conf
,最后添加如下配置,包含proxy
目录内的所有配置。
stream {include /etc/nginx/proxy/*.conf;}
nginx -t
检查nginx配置是否正确,没有问题则执行nginx -s reload
重新加载nginx
可能出现的问题
unknown directive "stream" in /etc/nginx/nginx.conf
对于比较老版本的nginx,可能会出现此错误。需要手动安装nginx的stream模块:
yum install nginx-mod-stream
nginx: [emerg] bind() to 0.0.0.0:3306 failed (13: Permission denied)
由于SELinux
导致,查看端口是否已经被semanage 管理:
sudo semanage port -l | grep http_port_t
如果不在,需要添加:
sudo semanage port -a -t http_port_t -p tcp 3306
(13: Permission denied) while connecting to upstream:[nginx]
在nginx错误日志中看到以上错误,可能是SELinux
安全机制导致,可执行:
setsebool -P httpd_can_network_connect 1