您的位置:首页 > 理论基础 > 计算机网络

[乐意黎原创] 通过Apache反向代理实现多个http/https访问NodeJS服务

2017-06-22 16:56 936 查看



乐意黎使用ECS主机的环境:  Centos 7.2 系统, php +Apache, 搭了 Nodejs.


起先只能通过 IP 来访问node,  折腾了好几天, 起初配置了, 可以通过https子域名来访问, 但会跳转到 IP上,(我使用了 htacess 来转向), 终于可以通过配置apache来通过http或https子域名 来访问nodejs了. 未在 htacess中设置任何转向. 

服务器安装了 Nodejs,  Apache, 并且申请了SSL证书.

1. 通过 80端口访问(http访问 node)

在 /etc/httpd/httpd.conf里添加如下配置, (注, 未在 .htacess 文件中做任何设置)

nodejs 服务返回 http 服务, 端口为: 3389

即: 通过 http://wxapi.luxi.ren 访问代理的 node 服务

[html] view
plain copy

 print?

 <VirtualHost *:80>  

226   ServerName wxapi.luxi.ren  

227   ServerAlias wxapi.luxi.ren  

228   ProxyRequests off  

229  

230   # DocumentRoot /usr/local/apache/htdocs  

231  

232   <Directory />  

233       Options -Indexes +FollowSymLinks  

234       AllowOverride None  

235       Require all granted  

236    </Directory>  

237  

238    ProxyRequests Off  

239    ProxyPreserveHost On  

240    ProxyVia Full  

241    <Proxy *>  

242       Require all granted  

243    </Proxy>  

244  

245   <Location />  

246     ProxyPass http://localhost:3389/  

247     ProxyPassReverse http://localhost:3389/  

248   </Location>  

249 </VirtualHost>  

Nodejs 中设置如下, 

[html] view
plain copy

 print?

var http = require('http');  

var port = 3389;  

...

http.createServer(app).listen(port, function(req, res){  

    // res.writeHead(200);  

    console.log('server is running on port '+port);  

});  


2. 通过 443端口访问 (https访问node)

如: 通过 https://api.luxi.ren 访问 nodejs 服务 

特别说明:

1. 此种情况下,   api 子域名配置 SSL 证书

2. Node JS 返回的是 http 服务 即var https = require('http'); node 未绑定证书. 端口为 3389.

node 部分代码如下:

 var http = require('http');

 ...

  var port = 3389;

  ...

  http.createServer(app).listen(port, function(req, res){

    // res.writeHead(200);

    console.log('server is running on port '+port);

  });

编辑 vim /etc/httpd/extra/httpd-ssl.conf 文件的配置.

#
Listen 443

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4

SSLHonorCipherOrder on

SSLProtocol      all -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv3

SSLPassPhraseDialog  builtin

#   Inter-Process Session Cache:
SSLSessionCache        nonenotnull
SSLSessionCacheTimeout  300

#SSLUseStapling On

#<VirtualHost _default_:443>
<VirtualHost *:443>
#   General setup for the virtual host
ServerName wxapi.luxi.ren
DocumentRoot "/usr/local/apache/htdocs"
ServerAdmin aerchi@gmail.com
ErrorLog "/usr/local/apache/logs/error_log"
TransferLog "/usr/local/apache/logs/access_log"

SSLEngine on

#SSLCertificateFile "/etc/httpd/server.crt"
SSLCertificateFile "cert/public.pem"
#SSLCertificateFile "/etc/httpd/server-dsa.crt"
#SSLCertificateFile "/etc/httpd/server-ecc.crt"

SSLCertificateKeyFile "cert/private.key"

SSLCertificateChainFile "cert/chain.pem"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/apache/cgi-bin">
SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

#   Per-Server Logging:
CustomLog "/usr/local/apache/logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
# 2017-06-22
#<VirtualHost wxapi-2.luxi.ren:443>
<VirtualHost *:443>
ServerName wxapi-2.luxi.ren
ServerAlias wxapi-2.luxi.ren
ServerAdmin aerchi@gmail.com

SSLEngine on
# SSLProtocol "TLSv1.2 TLSv1.1 TLSv1"
SSLCertificateFile "cert/public.pem"
SSLCertificateKeyFile "cert/private.key"
SSLCertificateChainFile "cert/chain.pem"

# ProxyRequests off
<Directory />
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>

ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>

<Location />
ProxyPass http://localhost:3389/ ProxyPassReverse http://localhost:3389/ </Location>
</VirtualHost>


附: apache里SSL 的配置


安装证书


文件说明:

1. 证书文件xxxx.pem,包含两段内容,请不要删除任何一段内容。


2. 如果是证书系统创建的CSR,还包含:证书私钥文件214137331610269.key、证书公钥文件public.pem、证书链文件chain.pem。

( 1 ) 在Apache的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为214137331610269.key;

( 2 ) 打开 apache 安装目录下 conf 目录中的 httpd.conf 文件,找到以下内容并去掉“#”:

#LoadModule ssl_module modules/mod_ssl.so (如果找不到请确认是否编译过 openssl 插件)
#Include conf/extra/httpd-ssl.conf


( 3 ) 打开 apache 安装目录下 conf/extra/httpd-ssl.conf 文件 (也可能是conf.d/ssl.conf,与操作系统及安装方式有关), 在配置文件中查找以下配置语句:

# 添加 SSL 协议支持协议,去掉不安全的协议
SSLProtocol TLSv1.2 TLSv1.1 TLSv1
# 修改加密套件如下
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4
# 证书公钥配置
SSLCertificateFile cert/public.pem
# 证书私钥配置
SSLCertificateKeyFile cert/xxxx.key
# 证书链配置,如果该属性开头有 '#'字符,请删除掉
SSLCertificateChainFile cert/chain.pem


( 4 ) 重启 Apache。


( 5 ) 通过 https 方式访问您的站点。


-------------------------------------------------------------------------------------------------------

表述有所混乱, 但配置测试成功.


4. 测试页面(未在 htacess中设置任何转向. )

1). 第一个 正常的 https服务



2). 第二个https访问代理的nodejs



乐意黎原创

2017-06-22

本文地址:  http://blog.csdn.net/aerchi/article/details/73605496
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: