Mih*_*sek -1 apache ssl reverse-proxy node.js
我有一个在我的域上运行的Web应用程序.首先我有常规HTTP站点,它在我的服务器上的端口8082上运行,而Apache服务器(使用虚拟主机)将请求从端口80重定向到localhost:8082.
现在我获得了一个SSL证书,我试图在我的网站上安装.我在Node中创建了一个HTTPS服务器,并且https://localhost:8082一切正常.
但后来我尝试通过HTTPS提供我的域名.我尝试编辑我的虚拟主机文件以使用证书,但我认为我没有正确编写它.此外,我试图让它将HTTP重定向到HTTPS,但它没有用.
我该怎么办?我应该在Node中运行HTTP或HTTPS服务器,我应该在Apache虚拟主机配置中添加什么?
这是我的虚拟主机文件:
<VirtualHost *:80>
ServerName www.domain.com
Redirect permanent / https://www.domain.com
</VirtualHost>
<VirtualHost *:443>
ServerName domain.com
ServerAlias www.domain.com
SSLEngine On
SSLProxyEngine On
SSLCertificateFile "/home/USERNAME/Projects/NODEAPP/chained.pem"
SSLCertificateKeyFile "/home/USERNAME/Projects/NODEAPP/domain.key"
ProxyPreserveHost On
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:8082/
ProxyPassReverse http://localhost:8082/
</Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
(公平警告:我对你的问题的理解是你想要https://www.domain.com出现在浏览器的URL栏中,而不是https://www.domain.com:8082.如果不是这种情况,下面的很多内容都是错误的,但可能仍然可以帮助你更好地理解你的问题.)
(又称,HTTP设计速成课程,因为我觉得你不太了解发生了什么,但如果你这样做,可以随意跳过:)
我认为你对Apache的做法存在误解 - 主要是因为你说它是"重定向"请求.
HTTP重定向是状态代码在3xx范围内的任何(?)响应,它会告诉您的浏览器它所请求的资源已移动到其他位置.例如,假设http://example.com/foo以前存在,但后来被移到http://example.org/bar(注意.com和.org差异).如果您在http://example.com/fooURL栏中输入,您的浏览器将请求/foo(特别是它将发送HTTP GET请求)example.com.example.com然后将HTTP响应发送回浏览器重定向到http://example.org/bar.那么浏览器就会发送一个HTTP GET请求/bar来example.org并取回包含资源的响应.
这是一个图表:
Step 1:
------------- --------------------------
| | | |
| Browser | -------- HTTP GET /foo ---------> | example.com web server |
| | <-- HTTP 301 Moved Permanently -- | |
------------- --------------------------
Step 2:
------------- --------------------------
| | | |
| Browser | --- HTTP GET /bar ---> | example.org web server |
| | <---- HTTP 200 OK ---- | |
------------- --------------------------
Run Code Online (Sandbox Code Playgroud)
现在,这就是事情.这不是你正在做的事情,也不是你想要做的事情.你正在做的事情被称为反向代理,这是每当Web服务器(在你的情况下是Apache)收到请求时,它只是将它转发到其他地方.在您的原始(全HTTP)设置中,Web浏览器www.domain.com将从Apache 请求,然后Apache将简单地转发该请求,几乎没有修改http://localhost:8082.这是图表:
Step 1:
------------- ---------- ------------------
| | | | | |
| | ----- HTTP GET / ----> | | | |
| Browser | | Apache | ----- HTTP GET / ----> | localhost:8082 |
| | | | <---- HTTP 200 OK ---- | |
| | <---- HTTP 200 OK ---- | | | |
------------- ---------- ------------------
Step 2:
There is no step 2. BOOM.
Run Code Online (Sandbox Code Playgroud)
这里要注意的重要一点是浏览器没有"看到"Node.js,它在另一端看到了Apache.同样,Node.js没有"看到"浏览器,它看到了Apache(尽管Apache通常会使用有关浏览器连接的详细信息来扩充请求 - 请参阅例如X-Forwarded-For标题).
这是HTTP设计的一个有意的部分 - HTTP请求和响应语义并不暗示有关如何处理请求的内部实现细节.这就是HTTP如此强大的原因.它可以让你创建非常复杂的设置 - 想想你正在做的事情,但规模要大得多,甚至更多的组件 - 然后通过向外部世界展示的简单,统一的界面抽象出复杂性:你的URL层次结构与HTTP请求/响应周期.
现在我们已经确定了你要做的事情,这就是你的问题所在:你正在混淆Node.js所说的协议与Apache所说的协议(以及外部世界所看到的).
您的最终目标是让人们通过HTTPS连接到您的网站,对吗?在这种情况下,您不需要Node.js来说HTTPS,因为与Node.js直接对话的唯一事情就是Apache.Apache是与浏览器对话的东西,因此Apache是您使用HTTPS所需要的.理想情况下,你有Apache说浏览器的HTTPS和HTTP到Node.js - 如果Apache加密到Node的流量并不重要,因为Node在localhost上.以图表形式:
------------- ---------- ------------------
| | | | | |
| | ----- HTTPS GET / ----> | | | |
| Browser | | Apache | ----- HTTP GET / ----> | localhost:8082 |
| | | | <---- HTTP 200 OK ---- | |
| | <---- HTTPS 200 OK ---- | | | |
------------- ---------- ------------------
Run Code Online (Sandbox Code Playgroud)
因此,让您的Node应用程序侦听HTTP请求,然后修复Apache配置以使用HTTPS提供服务,但是向Node后端说HTTP.
我认为你的配置有什么问题,你需要在路径周围引用,即<Location "/">.或者在我所拥有的反向代理配置中,我有ProxyPass没有<Location>块的指令设置,如下所示:
ProxyPass / http://localhost:8082/
ProxyPassReverse / http://localhost:8082/
Run Code Online (Sandbox Code Playgroud)
所以你也可以尝试一下.
如果它仍然不起作用,请尝试删除<Proxy>/ </Proxy>block - 我不确定它是做什么的,但我在反向代理配置中没有这样的东西(哪个有效) - 所以它可能会干扰某些东西.
至于你的HTTP到HTTPS重定向,我真的没有看到任何错误.你确定要连接www.domain.com而不是domain.com吗?第二个VirtualHost服务于两者,但第一个仅服务于前者.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |