我有一个运行Apache2和Docker的Ubuntu 16.04机器(Docker本身正在运行Docker中心的GitLab)。 这个盒子里还有一个Phabricator实例,所以为什么我把GitLab放到它自己的Docker中来分离事物。
同样重要的是要注意,我能够通过两种不同的方式访问服务器:在我公司的专用networking中通过专用IP(10.10.XY)或通过主机名称“gitlab.example.com”指向公共IP 。
从私有networking中,如果我去“10.10.XY:10080”,那么我可以访问GitLab的所有荣耀。 如果我到networking外的“gitlab.example.com:10080”(并在防火墙中打开10080),那么我仍然可以访问GitLab。
但是,我想避免10080打开; 我还希望我的开发人员只需input主机名,而不必包含端口号。
我尝试了几件事情来完成这个无济于事…
Apache2 ProxyPass(尝试使用本地主机和docker的IP为ProxyPass / ProxyReverse)。 我已经validation了mod_proxy已启用。 访问URL给我一个错误,说明没有configuration的网站。 如果我将下面的所有代理信息注释掉了,那么就会提供默认的Apache2成功页面(大概是因为它下降到主文档根目录,因为我没有下面的定义)。
<VirtualHost *:80> ProxyPreserveHost On ProxyRequests On ServerName gitlab.example.com ProxyPass / http://172.17.0.2:80/ ProxyPassReverse / http://172.17.0.2:80/ <Proxy *> Order deny,allow Allow from all </Proxy> </VirtualHost>
iptables PREROUTING。 我不是iptables的专家,我的大部分networking路由都是通过Barracuda完成的,但是我已经在线阅读了,你应该能够在同一个盒子里从一个端口路由到另一个端口。 我已经尝试了几个命令,但仍然没有运气。 说到iptables,我很迷茫,下面的命令可能会失败。
sudo iptables -A PREROUTING -t nat -s gitlab.example.com -p tcp --dport 80 -j DNAT --to-destination 172.17.0.2:10080 sudo iptables -t nat -A OUTPUT -d 172.17.0.2 -p tcp --dport 80 -j REDIRECT --to-port 10080 sudo iptables -A PREROUTING -t nat -s gitlab.example.com -p tcp --dport 80 -j REDIRECT --to-port 10080
Rinetd。 这听起来很有希望,但并不像我预期的那样运作。 我只是真的尝试了下面的命令,然后继续前进。 也许我误解了命令或如何编译它的function。
sudo rinetd gitlab.example.com 80 172.17.0.2 10080
我也尝试了一些与iproute2和socat的东西,但我logging了这些尝试非常糟糕,我不知道我已经尝试过这两个。 我知道,无论我尝试显然没有工作!
我觉得还有其他的方法,我错过了,现在我正在撞墙试图让这个工作。 任何有识之士将不胜感激。
rinetd使用一个configuration文件来运行。 你可以把这行放在一个名为rinetd.conf的文件中:
gitlab.example.com 80 172.17.0.2 10080
然后像你想的那样运行rinetd( -f在前台模式下运行;否则它会象传统的守护进程一样分叉到后台):
sudo rinetd -f -c rinetd.conf
我find了解决我的问题。 在我最初的尝试中,这是我的一个用户错误。
我的VHost:
<VirtualHost *:80> ServerName gitlab.example.com ProxyPreserveHost On <Proxy *> Order allow,deny Allow from all </Proxy> ProxyPass / http://172.17.0.2:80/ ProxyPassReverse / http://172.17.0.2:80/ </VirtualHost>
注意:172.17.0.2是我的gitlab容器的IP。
我在最初的尝试中错过了…等待它…我没有启用proxy_http mod! 所以难怪它从来没有工作。 它永远不会有。
设置VHost之后,一定要运行这些东西:
sudo a2enmod proxy sudo a2enmod proxy_http sudo service apache2 reload
瞧! 我现在可以在浏览器中从gitlab.example.com访问我的gitlab实例,并且它会自动redirect到端口10080,但保持浏览器的URL不变。
编辑:我遇到了我原来的configuration问题,当我通过防火墙拒绝stream量端口10080,因为我试图代用服务器使用主机名。 相反,我改用了VHost中的docker的IP:PORT来解决这个问题。