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