这篇文章上次修改于 840 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

在腾讯云上申请了二级域名,之后想在同一台 VPS 上用同一个 80 端口部署多个网站,比如:www.xxx.cnblog.xxx.cntrip.xxx.cn

默认情况下这三个域名指向三个 IP,由于我只有一台服务器,所以这三个域名都指向同一个 IP,域名解析的时候不允许指定端口号。

那我想让这三个域名指向不同的网站该怎么办呢?

使用 Apache 的反向代理可以实现这个功能,如下图所示:
Apache反向代理

明确了思路后,接下来就是具体的操作了。要完成这个功能,大致可以分为以下几步:

  • 腾讯云申请二级域名
  • 腾讯云申请免费的二级域名 SSL 证书
    因为主域名使用了 HTTPS,因此二级域名也希望使用 HTTPS,如果不想使用 HTTPS 可以省略此步骤。
  • 配置 Apache 服务器
  • 部署后台服务

申请二级域名

  1. 登录腾讯云:cloud.tencent.com
  2. 依次打开:控制台->云解析
  3. 找到你的主域名记录,点击“解析”

     ![](https://upload-images.jianshu.io/upload_images/192658-85106ca196d77be0.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
  4. 在打开的页面中,点击“添加记录”,按下图填写相应信息

     ![](https://upload-images.jianshu.io/upload_images/192658-1e885d47cac73cf7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    

申请二级域名SSL证书

  1. 依次打开:控制台->SSL 证书
  2. 点击“申请免费证书”按钮,打开证书申请页面,按下图填写申请信息
  3. 填写完成后,点击“下一步”,在接下来的页面中选择“自动DNS验证”,然后点击“确认申请”按钮,之后就等待审核结果,一般半个小时以内就会审核通过

配置 Apache 服务器

这是最关键也是最麻烦的部分,花费了很多时间在这里才成功。
  1. 打开 Apache 配置文件 conf/httpd.conf,找到如下几行配置:

    #LoadModule proxy_module modules/mod_proxy.so
    #LoadModule proxy_connect_module modules/mod_proxy_connect.so
    #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
    #LoadModule proxy_http_module modules/mod_proxy_http.so

    去掉前面的注释符号 #

  2. 打开 Apache 配置文件 conf/extra/httpd-vhosts.conf,在文件最末添加如下内容:

     
     <VirtualHost *:80>
         ServerName blog.xxx.cn
         ServerAlias blog.xxx.cn
    
         ProxyPreserveHost On
         ProxyRequests Off
         ProxyPass / http://127.0.0.1:5003/
         ProxyPassReverse / http://127.0.0.1:5003/
    
         # 强制HTTP跳转HTTPS
         RewriteEngine on
         RewriteCond   %{HTTPS} !=on
         RewriteRule   ^(.*)  https://%{SERVER_NAME}$1 [L,R]
     </VirtualHost>
    

    上面这段配置的意思是将来自 80 端口的 blog.xxx.cn 域名的请求转发给 http://127.0.0.1:5003/http://127.0.0.1:5003/ 即是内部服务的发布地址,此处注意最后的 / 不能省略,否则会有路径问题。一开始我的内部服务也使用了 HTTPS,并且还使用了 HTTP 自动重定向到 HTTPS,导致怎么弄也弄不成功,最后去掉了 HTTP 自动重定向功能就好了。其实,因为是内部服务,并且只监听了本地地址(localhost/127.0.0.1),所以没有必要使用 HTTPS 安全性也能得到保障。

    最后三行是强制 HTTP 自动重定向到 HTTPS,在此不赘述。

  3. 打开 Apache 服务器配置文件 conf/extra/httpd-ssl.conf,在文件最末添加如下内容:

    
     <VirtualHost *:443>
         ServerName blog.xxx.cn
         ServerAlias blog.xxx.cn
    
         ProxyPreserveHost On
         ProxyRequests Off
    
         ProxyPass / http://127.0.0.1:5003/
         ProxyPassReverse / http://127.0.0.1:5003/
    
         SSLEngine on
         SSLProtocol all -SSLv3
         SSLProxyProtocol all -SSLv3
         SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
         SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
         SSLHonorCipherOrder on
         SSLCertificateFile "conf/ssl.crt/2_blog.xxx.cn.crt"
         SSLCertificateKeyFile "conf/ssl.key/3_blog.xxx.cn.key"
         SSLCertificateChainFile "conf/ssl.csr.blog/1_root_bundle.crt"
     </VirtualHost>
    

    这段配置和上一步配置的意思差不多,只不过上一步配置是针对 HTTP 请求的,这一步配置是针对 HTTPS 配置的。
    用到的 SSL 证书从腾讯云下载即可,在此不再赘述。

  4. 最后重启 Apache 服务器。

部署后台服务

我的后台服务是使用 dotNet Core 开发的,部署可自行上网搜索相关教程,这里只说两点注意事项:

  1. 发布时不必监听所有地址,只需监听 localhost 即可
  2. 不必支持 HTTPS,只需支持 HTTP 即可