title: nginx泛域名http(80)強(qiáng)制跳轉(zhuǎn)https(443)
date: 2019-04-17 12:30:05
categories: 架構(gòu)
author: mrzhou
tags:
- nginx
- web
- http
- https
nginx泛域名http(80)強(qiáng)制跳轉(zhuǎn)https(443)
隨著chrome瀏覽器在地址欄開始標(biāo)注網(wǎng)站『不安全』的提示開始,各大小網(wǎng)站都開始從http轉(zhuǎn)為https了,并且都更注重網(wǎng)站的安全了。然頁我們之前的很多站點(diǎn)都是基于http開發(fā)的,如果全部改造成https,必然是很大的工作量,幸好有第三方的工具可以為我們解決這個問題,可以讓原有的系統(tǒng)不改動的情況下,或者少改動的情況下就能夠滿足這個需求。nginx就是其中使用最為廣泛的一個,并且它的響應(yīng)最快,目前國內(nèi)絕大多數(shù)平臺或者系統(tǒng)在前端都使用的是nginx或者nginx的變種。
為每個域名(子域名)申請證書,然后配置nginx,這樣就可以解決https證書問題。但為每個域名或者子域名都申請一個證書,暫起不說費(fèi)用問題,申請也是比較麻煩的事,所以申請一個支持泛域名的能用證書是最方便的,所有子域名都可以使用該證書,肯定是最快捷的。
泛域名證書申請
推薦使用acme.sh來申請,下載地址和使用說明
https://github.com/Neilpang/acme.sh
安裝很簡單, 一個命令:
curl https://get.acme.sh | sh
并且acme.sh 支持大多數(shù)國內(nèi)知名dns的api方式。比如dnspod,aliyun,只需要在相應(yīng)的平臺上申請id和key即可使用api方式使用acme.sh,非常方便,申請證書一條命令就搞定了。
以下命令使用dnspod的api方式申請easex.cn泛域名證書,其下的所有子域名均可以使用。
acme.sh --issue -d easex.cn -d *.easex.cn --dns dns_dp
申請到的證書默認(rèn)存放在 當(dāng)前用戶的 ~/.acme.sh/easex.cn(域名)目錄下。你可以copy出來,或者使用 acme.sh的install-cert命令來安裝到指定目錄。
nginx的配置
nginx的安裝就不說了,在centos下通常用yum 來安裝,也可以自己編譯。這里只說配置一事。網(wǎng)上雖然有很多關(guān)于http跳轉(zhuǎn)https的配置,但都只針對單域名的,對泛域名都無法使用。
以下是本人使用著的配置,供大家參考。
upstream tomcat9 {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name *.easex.cn;
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl http2;
server_name *.easex.cn;
ssl_certificate cert/easex.cn/fullchina.cer;
ssl_certificate_key cert/easex.cn/easex.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSV1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
access_log logs/easex.cn_access.log;
error_log logs/easex.cn_error.log;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass http://tomcat9/;
}
}
這里的server_name均指定的為 *.easex.cn ,重點(diǎn)就在于 return 301 https://$http_host$request_uri; 這一句。在這里不得不提一下不管是使用server_name,都不能讓瀏覽器正常跳轉(zhuǎn)到相應(yīng)的子域名,只有使用$http_host這樣才可以,困繞了我兩天時間。
通過以上配置,80端口被強(qiáng)制跳轉(zhuǎn)到了443,但443中通過 proxy_pass http://tomcat9/;實(shí)際還是跳轉(zhuǎn)回了http的原始端口,但對外,瀏覽器和用戶所看到的確實(shí)是https了,并且顯示的是安全網(wǎng)站。
注意事項(xiàng)
服務(wù)器應(yīng)該要開放 80 443端口。