Nginx域名转发https访问的实现
说在前面的话:
突然接到这么一个任务,将多个域名的访问必须使用https的转发访问,其实对Niginx的使用很简单,文档也很齐全(不管是腾讯云还是阿里云),入坑的原因是对Niginx服务器的陌生和走的弯路。
1.弯路:Tomcat支持SSL
腾讯云Tomcat服务器证书配置
修改server.xml文件
keystoreType="JKS":请注意该配置跟阿里云的不一样,记得修改
听同事说,配置就好了,入坑的地方也是,服务器启动完毕之后443端口也被占用了,真的好坑好坑,如果不需要转发的时候,可以使用改配置。
启动nginx不成功bind()to0.0.0.0:443failed(10013:Anattemptwasmadetoaccessasocketinawayforbiddenbyitsaccesspermissions
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{ listen443ssl;#监听端口,Nginx1.5后推荐使用 server_namepangsir01.domain.com;#请求域名 ssl_certificatessl/证书名称A.crt;#crt证书路径,存放位置Nginx的conf/ssl文件夹下,可以使用绝对路径 ssl_certificate_keyssl/证书名称A.key;#crt证书key路径 ssl_session_timeout5m;#会话超时时间 ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#加密算法 ssl_protocolsTLSv1TLSv1.1TLSv1.2;#SSL协议 #拦截所有请求 location/{ proxy_http_version1.1;#代理使用的http协议 proxy_set_headerHost$host;#header添加请求host信息 proxy_set_headerX-Real-IP$remote_addr;#header增加请求来源IP信息 proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#增加代理记录 proxy_passhttp://127.0.0.1:8001;#服务A访问地址 } }
(2)服务B的配置
server{ listen443ssl;#监听端口,Nginx1.5后推荐使用 server_namepangsir02.domain.com;#请求域名 ssl_certificatessl/证书名称B.crt;#crt证书路径,存放位置Nginx的conf/ssl文件夹下,可以使用绝对路径 ssl_certificate_keyssl/证书名称B.key;#crt证书key路径 ssl_session_timeout5m;#会话超时时间 ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#加密算法 ssl_protocolsTLSv1TLSv1.1TLSv1.2;#SSL协议 #拦截所有请求 location/{ proxy_http_version1.1;#代理使用的http协议 proxy_set_headerHost$host;#header添加请求host信息 proxy_set_headerX-Real-IP$remote_addr;#header增加请求来源IP信息 proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#增加代理记录 proxy_passhttp://127.0.0.1:8002;#服务B访问地址 } }
(3)服务C的配置
server{ listen443ssl;#监听端口,Nginx1.5后推荐使用 server_namepangsir03.domain.com;#请求域名 ssl_certificatessl/证书名称C.crt;#crt证书路径,存放位置Nginx的conf/ssl文件夹下,可以使用绝对路径 ssl_certificate_keyssl/证书名称C.key;#crt证书key路径 ssl_session_timeout5m;#会话超时时间 ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#加密算法 ssl_protocolsTLSv1TLSv1.1TLSv1.2;#SSL协议 #拦截所有请求 location/{ proxy_http_version1.1;#代理使用的http协议 proxy_set_headerHost$host;#header添加请求host信息 proxy_set_headerX-Real-IP$remote_addr;#header增加请求来源IP信息 proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#增加代理记录 proxy_passhttp://127.0.0.1:8003;#服务B访问地址 } }
2.3http请求自动转发
增加server配置,监听80端口,对所有域名进行https重定向
server{ listen80;#监听端口 server_namea.domain.comb.domain.comc.domain.com;#请求域名 return301https://$host$request_uri;#重定向至https访问。 }
我的需求到这里就搞定了,下面的内容属于扩展内容,记录一下
3.WebSocket的SSL配置
假如服务A中使用到websocket(访问接口为:/websocket),需要将ws协议更换为wss协议,可在服务A的server配置中增加一个location配置,拦截websocket进行单独代理。
服务A的配置,修改后:
server{ listen443ssl;#监听端口 server_namepangsir01.domain.com;#请求域名 ssl_certificatessl/证书名称A.crt;#crt证书路径 ssl_certificate_keyssl/证书名称A.key;#crt证书key路径 ssl_session_timeout5m;#会话超时时间 ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#加密算法 ssl_protocolsTLSv1TLSv1.1TLSv1.2;#SSL协议 #拦截所有请求 location/{ proxy_http_version1.1;#代理使用的http协议 proxy_set_headerHost$host;#header添加请求host信息 proxy_set_headerX-Real-IP$remote_addr;#header增加请求来源IP信息 proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;#增加代理记录 proxy_passhttp://127.0.0.1:8001;#服务A访问地址 } #拦截websocket请求 location/websocket{ proxy_passhttp://127.0.0.1:8001; proxy_http_version1.1; proxy_set_headerUpgrade$http_upgrade; proxy_set_headerConnection"upgrade"; } }
到此这篇关于Nginx域名转发https访问的实现的文章就介绍到这了,更多相关Nginx域名转发https访问内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!