項目中遇到某些服務在內網,需要外網訪問的情況,需要配置代理訪問。可用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