我是Docker的新手,在了解如何使“包含的”应用程序可从互联网访问方面遇到一些麻烦。
[我当前的配置]两个网站(/ var / www / html中)+标准Apache +我希望将其应用于我部署的所有新产品(基于CSP标头的重写,使用 Certbot 等更新SSL证书)。我对当前的会议感到非常满意。
[我的两个应用程序]都是独立的应用程序(仅需要一个数据库)。
-official wordpress图片。 (->新域名)
-一个基于django的应用,其中装有基于this tutorial(现有域的->子域)的gunicorn服务器
[问题],如果我将两个应用程序都绑定在端口8080和8000上,则浏览器将无法访问它,因为DNS服务器无法处理端口(据我了解,我错了)。如果在标准端口上进行绑定,则将与现有的Apache冲突。
您将如何处理?我可以使用某种mod_proxy重定向到容器的内部ip吗?有没有更简便,更安全的方法呢?
function deleteUserTask(id) {
return Task.findByIdAndRemove(id);
}
答案 0 :(得分:1)
如果多个应用程序在不同的端口和不同的本地IP地址上运行,则推荐的方法是使用Reverse Proxy
基本上,您将apache配置为将请求转发到这些服务,即:
<VirtualHost *:443>
ServerName sub.mydomain.io
ProxyPass "/wordpress" "http://172.17.0.2:8080/"
ProxyPass "/django" "http://172.17.0.2:8000/"
ErrorLog /var/log/apache2/error.mydomain.io.com.log
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/mydomain.io/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.io/privkey.pem
</VirtualHost>
如果您拥有外部域名,则可以使用基于名称的Virtual hosts
答案 1 :(得分:0)
好吧,我花了一些时间才弄清楚问题,因为有两个主要的极端情况。我会坚持一种情况: wordpress图片
<VirtualHost *:443>
ServerName new_domain.eu
ProxyPass / http://localhost:8081/
<Location />
AddOutputFilterByType SUBSTITUTE text/html
SetOutputFilter proxy-html
ProxyPassReverse /
Substitute "s|http://localhost:8081/|https://new_domain.eu/|i"
RequestHeader unset Accept-Encoding
</Location>
SSLCertificateFile /etc/letsencrypt/live/new_domain.eu/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/new_domain.eu/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
[首先],我无法从其本地IP 访问容器(即172.7.0.3:80,不确定原因),所以我使用了本地主机设置容器时定义的端口:
docker run -e WORDPRESS_DB_PASSWORD=thePassWord --name wordpress --link wordpressdb:mysql -p 8081:80 -v "$PWD/html":/var/www/html -d wordpress
然后,[第二]个棘手的部分是正确处理相对网址(例如some / path / to / css),因为这些网址无法访问。显然,这是well known issue。这部分是最长的部分:Apache 2.4发生了很大的变化,语法没有得到很好的记录。基本上,
Substitute "s|http://localhost:8081/|https://new_domain.eu/|i"
将所有url替换为html,以便可以正确访问相关资源(css,js,png等)。
[可能的改进]我对从外部世界看到8081端口并不满意。这意味着可以从此端口访问该应用程序,而无需绕过我在 apache.conf 中设置的规则。我通过添加 iptables规则
解决了该问题iptables -A INPUT -p tcp -s localhost --dport 8081 -j ACCEPT
iptables -A INPUT -p tcp --dport 8081 -j DROP
不太优雅,所以如果有人提出建议,请告诉我。
\ // _