Nginx域名转发https访问的实现


Posted in Servers onMarch 31, 2021

说在前面的话:

突然接到这么一个任务,将多个域名的访问必须使用https的转发访问,其实对Niginx的使用很简单,文档也很齐全(不管是腾讯云还是阿里云),入坑的原因是对Niginx服务器的陌生和走的弯路。

1.弯路:Tomcat支持SSL

腾讯云Tomcat服务器证书配置

修改server.xml文件

<Connector 
   port="443" 
   protocol="org.apache.coyote.http11.Http11NioProtocol" 
   SSLEnabled="true" 
   scheme="https" 
   secure="true" 
   keystoreFile="conf\ssl\生产的证书名称我使用相对路径.jks" 
   keystoreType="JKS" 
   keystorePass="证书对应的密码" 
   clientAuth="false" 
   sslProtocol="TLSv1+TLSv1.1+TLSv1.2"
   maxThreads="150" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256">
</Connector>

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8209" protocol="AJP/1.3" redirectPort="8443" secretRequired="" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

keystoreType="JKS":请注意该配置跟阿里云的不一样,记得修改

<Engine defaultHost="我的域名" name="Catalina" jvmRoute="tomcat1" URIEncoding="UTF-8">
 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
 <Realm className="org.apache.catalina.realm.LockOutRealm">
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
 </Realm>
 <Host name="我的域名" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="localhost_access_log" suffix=".txt"
    pattern="%h %l %u %t &quot;%r&quot; %s %b" />
 </Host>
</Engine>

听同事说,配置就好了,入坑的地方也是,服务器启动完毕之后443端口也被占用了,真的好坑好坑,如果不需要转发的时候,可以使用改配置。

启动nginx 不成功bind() to 0.0.0.0:443 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions

2.言归正传

2.1 需求概述

当在一个服务器(腾讯云的服务器的IP地址)部署多个服务,不同服务需要通过不同域名访问时,可以通过Nginx代理进行域名转发,同时还可以通过配置SSL模块实现https访问。(我的服务器使用window系统,如果没有SSL模块需要自行开启,默认是支持的)

在一个服务器同时部署3个服务:服务A,服务B和服务C,服务需配置以下域名:

  • pangsir01.domain.com域名对应服务A;
  • pangsir02.domain.com域名对应服务B;
  • pangsir03.domain.com域名对应服务C;

服务通过https访问,http请求重定向至https。

2.2 服务代理设置

配置Nginx监听443端口(==我因为Tomcat的配置,在这里卡了半天,不成功==),实现域名转发和https访问,本示例使用的证书是crt格式证书

(1)服务A的配置

server {
 listen 443 ssl; #监听端口,Nginx1.5后推荐使用
 server_name pangsir01.domain.com; #请求域名
 ssl_certificate ssl/证书名称A.crt; #crt证书路径,存放位置Nginx的conf/ssl文件夹下,可以使用绝对路径
 ssl_certificate_key  ssl/证书名称A.key; #crt证书key路径
 ssl_session_timeout  5m; #会话超时时间
 ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL协议

 # 拦截所有请求
 location / {
  proxy_http_version 1.1; #代理使用的http协议
  proxy_set_header Host $host; #header添加请求host信息
  proxy_set_header X-Real-IP $remote_addr; # header增加请求来源IP信息
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 增加代理记录
  proxy_pass http://127.0.0.1:8001; #服务A访问地址
 }
}

(2)服务B的配置

server {
 listen 443 ssl; #监听端口,Nginx1.5后推荐使用
 server_name pangsir02.domain.com; #请求域名
 ssl_certificate ssl/证书名称B.crt; #crt证书路径,存放位置Nginx的conf/ssl文件夹下,可以使用绝对路径
 ssl_certificate_key  ssl/证书名称B.key; #crt证书key路径
 ssl_session_timeout  5m; #会话超时时间
 ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL协议

 # 拦截所有请求
 location / {
  proxy_http_version 1.1; #代理使用的http协议
  proxy_set_header Host $host; #header添加请求host信息
  proxy_set_header X-Real-IP $remote_addr; # header增加请求来源IP信息
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 增加代理记录
  proxy_pass http://127.0.0.1:8002; #服务B访问地址
 }
}

(3)服务C的配置

server {
 listen 443 ssl; #监听端口,Nginx1.5后推荐使用
 server_name pangsir03.domain.com; #请求域名
 ssl_certificate ssl/证书名称C.crt; #crt证书路径,存放位置Nginx的conf/ssl文件夹下,可以使用绝对路径
 ssl_certificate_key  ssl/证书名称C.key; #crt证书key路径
 ssl_session_timeout  5m; #会话超时时间
 ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL协议

 # 拦截所有请求
 location / {
  proxy_http_version 1.1; #代理使用的http协议
  proxy_set_header Host $host; #header添加请求host信息
  proxy_set_header X-Real-IP $remote_addr; # header增加请求来源IP信息
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 增加代理记录
  proxy_pass http://127.0.0.1:8003; #服务B访问地址
 }
}

2.3 http请求自动转发

增加server配置,监听80端口,对所有域名进行https重定向

server {
 listen  80; #监听端口
 server_name a.domain.com b.domain.com c.domain.com; #请求域名
 return  301 https://$host$request_uri; #重定向至https访问。
}

我的需求到这里就搞定了,下面的内容属于扩展内容,记录一下

3.WebSocket的SSL配置

假如服务A中使用到websocket(访问接口为:/websocket),需要将ws协议更换为wss协议,可在服务A的server配置中增加一个location配置,拦截websocket进行单独代理。

服务A的配置,修改后:

server {
  listen 443 ssl; #监听端口
  server_name pangsir01.domain.com; #请求域名
  ssl_certificate ssl/证书名称A.crt; #crt证书路径
  ssl_certificate_key  ssl/证书名称A.key; #crt证书key路径
  ssl_session_timeout  5m; #会话超时时间
  ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL协议

  # 拦截所有请求
  location / {
   proxy_http_version 1.1; #代理使用的http协议
   proxy_set_header Host $host; #header添加请求host信息
   proxy_set_header X-Real-IP $remote_addr; # header增加请求来源IP信息
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 增加代理记录
   proxy_pass http://127.0.0.1:8001; #服务A访问地址
  }
  
  # 拦截websocket请求
  location /websocket {
   proxy_pass http://127.0.0.1:8001;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";
  }
 }

到此这篇关于Nginx域名转发https访问的实现的文章就介绍到这了,更多相关Nginx域名转发https访问内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Nginx 502 Bad Gateway错误原因及解决方案
Mar 31 Servers
Nginx配置Https安全认证的实现
May 26 Servers
Tomcat执行startup.bat出现闪退的原因及解决办法
Apr 20 Servers
Windows server 2012搭建FTP服务器
Apr 29 Servers
Nginx利用Logrotate实现日志分割
May 20 Servers
Nginx限流和黑名单配置
May 20 Servers
Apache POI操作批量导入MySQL数据库
Jun 21 Servers
nginx配置指令之server_name的具体使用
Aug 14 Servers
教你使用Ubuntu搭建DNS服务器
Sep 23 Servers
CentOS7设置ssh服务以及端口修改方式
Dec 24 Servers
ubuntu端向日葵键盘输入卡顿问题及解决
Dec 24 Servers
nginx sticky实现基于cookie负载均衡示例详解
Dec 24 Servers
Nginx本地目录映射实现代码实例
Mar 31 #Servers
nginx 防盗链防爬虫配置详解
Mar 31 #Servers
Nginx服务器如何设置url链接
nginx搭建图片服务器的过程详解(root和alias的区别)
Mar 31 #Servers
Nginx代理同域名前后端分离项目的完整步骤
Mar 31 #Servers
Nginx+SpringBoot实现负载均衡的示例
win10安装配置nginx的过程
You might like
PHP form 表单传参明细研究
2009/07/17 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
js arguments,jcallee caller用法总结
2013/11/30 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
vue.js表格分页示例
2016/10/18 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
2017/06/20 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
学习python类方法与对象方法
2016/03/15 Python
Python数组定义方法
2016/04/13 Python
深入了解Python数据类型之列表
2016/06/24 Python
python2.7安装图文教程
2018/03/13 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
外贸主管求职简历的自我评价
2013/10/23 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
服务标兵事迹材料
2014/05/04 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书