個(gè)人博客開(kāi)發(fā)系列文章:
- 博客前端展示總結(jié):http://www.reibang.com/p/1348bcd1e716
- 后臺(tái)管理系統(tǒng)總結(jié):http://www.reibang.com/p/53c75476be44
- 服務(wù)端總結(jié):http://www.reibang.com/p/c25b5432d6f5
- Travis CI持續(xù)集成:http://www.reibang.com/p/4e7a06e18bd5
- 使用Nginx配置HTTPS和反向代理:http://www.reibang.com/p/c779e54c9f85
使用Nginx配置HTTPS和反向代理
想起大學(xué)時(shí)自己建了個(gè)簡(jiǎn)單的網(wǎng)站,當(dāng)時(shí)使用的http,然后打開(kāi)的時(shí)候經(jīng)常都被http劫持氛濒,那是真的無(wú)可奈何涧偷,所以這次必須要整個(gè)https。https是啥?想必大家都知道,不懂的直接超文本安全傳輸協(xié)議
配置HTTPS
證書(shū)申請(qǐng)
- 電腦操作系統(tǒng)是macOS 10.14.5
- 服務(wù)器:騰訊云CentOS 7.2
- Nginx版本:1.16.0
在這里,我使用的是騰訊云的免費(fèi)證書(shū):
- 進(jìn)入控制臺(tái) -> 左上角云產(chǎn)品 -> 域名和網(wǎng)站 -> SSL證書(shū) -> 申請(qǐng)免費(fèi)證書(shū)
- 申請(qǐng)之后坛掠,大概過(guò)不了幾分鐘,就通過(guò)審核了,然后下載之
- 下載之后有幾個(gè)文件:
證書(shū)配置
首先登錄你的服務(wù)器却音,我們需要?jiǎng)?chuàng)建一個(gè)文件夾來(lái)放我們的證書(shū)
mkdir /usr/local/nginx/cert
然后使用scp
命令把我們的證書(shū)傳到服務(wù)器上
# 進(jìn)入到放證書(shū)的文件夾
cd shirmy.me
# 把 Nginx 下的文件遠(yuǎn)程拷貝到服務(wù)器上
scp -r ./Nginx/* 你的服務(wù)器用戶名@你的服務(wù)器IP:/usr/local/nginx/cert
接下來(lái)就可以修改Nginx的配置了改抡,其實(shí)騰訊云提供了很完善的證書(shū)安裝指引,里面有除了Nginx之外的其它服務(wù)器配置方式:
如果直接使用文檔中的方式系瓢,Nginx會(huì)報(bào)警告阿纤,需要做一些小的修改:
server {
listen 443; #SSL 訪問(wèn)端口號(hào)為 443
server_name www.shirmy.com; #填寫綁定證書(shū)的域名
# ssl on; #啟用 SSL 功能 這行會(huì)報(bào)警告 去掉即可
ssl_certificate ../cert/1_www.shirmy.me_bundle.crt; #證書(shū)文件名稱
ssl_certificate_key ../cert/2_www.shirmy.me.key; #私鑰文件名稱
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #請(qǐng)按照這個(gè)協(xié)議配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #請(qǐng)按照這個(gè)套件配置,配置加密套件夷陋,寫法遵循 openssl 標(biāo)準(zhǔn)欠拾。
ssl_prefer_server_ciphers on;
location / {
root /var/www/www.domain.com; #網(wǎng)站主頁(yè)路徑。此路徑僅供參考骗绕,具體請(qǐng)您按照實(shí)際目錄操作藐窄。
index index.html index.htm;
# 這是為解決 Vue Router 哈希模式刷新后404的問(wèn)題 Nginx 找不到文件后會(huì)在內(nèi)部發(fā)起一個(gè)子請(qǐng)求到根目錄下的 index.html
try_files $uri $uri/ /index.html;
}
}
HTTP跳轉(zhuǎn)到HTTPS
騰訊云文檔提供了以下的配置方式,但是我用的是另外一種配置方式:
# 文檔提供的配置方式
}
server {
listen 80;
server_name www.domain.com; #填寫綁定證書(shū)的域名
rewrite ^(.*)$ https://$host$1 permanent; #把http的域名請(qǐng)求轉(zhuǎn)成https
}
另一種方式
這種方式其實(shí)是利用了<meta>
標(biāo)簽中的的http-equiv
屬性酬土,與之對(duì)應(yīng)的值是content
荆忍,我們需要新建一個(gè)index.html
文件,復(fù)制并修改以下代碼:
<html>
<!-- 自動(dòng)刷新并指向新頁(yè)面撤缴,0 是指0秒后刷新(立即刷新) -->
<meta http-equiv="refresh" content="0;url=https://www.shirmy.me/">
</html>
這樣當(dāng)我們?cè)L問(wèn)http://www.shirmy.me
時(shí)就會(huì)重新刷新到https://www.shirmy.me
刹枉,然后再修改nginx
配置如下:
server {
listen 80; # 監(jiān)聽(tīng)默認(rèn)端口
server_name www.shirmy.me; # 域名
location / {
root www/http.shirmy.me/; # 剛剛的 index.html 所在目錄
index index.html index.htm;
}
}
最后,重啟我們的Nginx服務(wù)器:
cd /usr/local/nginx/sbin
# 平滑重啟
./nginx -s reload
# 非平滑重啟
./nginx -s stop && ./nginx
大功告成屈呕,配置了HTTPS的網(wǎng)站微宝,要保證網(wǎng)站的鏈接都是安全的,包括API請(qǐng)求都必須使用HTTPS
Nginx反向代理
- 我們的網(wǎng)頁(yè)發(fā)起請(qǐng)求時(shí)虎眨,帶個(gè)端口豈不是很難看蟋软,比如
https//api.shirmy.me:3000/v1/articles
,如何去掉端口呢嗽桩? - 又比如說(shuō)我們要訪問(wèn)集群服務(wù)器時(shí)岳守,會(huì)先訪問(wèn)一個(gè)中間服務(wù)器,然后這個(gè)中間服務(wù)器再把你的請(qǐng)求分發(fā)到壓力小的服務(wù)器碌冶,這也需要通過(guò)反向代理來(lái)實(shí)現(xiàn)棺耍。
# 負(fù)載均衡就是靠下面這個(gè)來(lái)實(shí)現(xiàn)
# blogapi 替換成你喜歡的名字
upstream blogapi {
server http://127.0.0.1:3000;
# server 你也可以選擇配置多個(gè)IP
}
server {
# 同上面一樣的 HTTPS 配置
listen 443 ssl;
server_name api.shirmy.me;
ssl_certificate ../cert/1_api.shirmy.me_bundle.crt;
ssl_certificate_key ../cert/2_api.shirmy.me.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 反向代理配置
location / {
# $host 代表轉(zhuǎn)發(fā)服務(wù)器
proxy_set_header Host $host;
proxy_redirect off;
# 記錄真實(shí)IP
proxy_set_header X-Real-IP $remote_addr;
# 存儲(chǔ)請(qǐng)求鏈路上各代理IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 連接超時(shí)時(shí)間
proxy_connect_timeout 60;
# nginx接收upstream server數(shù)據(jù)超時(shí)時(shí)間
proxy_read_timeout 600;
# nginx發(fā)送數(shù)據(jù)至upstream server超時(shí)時(shí)間
proxy_send_timeout 600;
# 反向代理到上面定義好的 upstream blogapi 下的服務(wù)器上
proxy_pass http://blogapi;
}
}
如此一來(lái),就實(shí)現(xiàn)了反向代理和負(fù)載均衡种樱,此外,我們應(yīng)該讓用戶第一次訪問(wèn)該服務(wù)器后俊卤,以后再訪問(wèn)也是訪問(wèn)該服務(wù)器嫩挤,避免多次建立http連接,那么我們可以這樣修改:
upstream blogapi {
# 避免每次被請(qǐng)求到多臺(tái)服務(wù)器上 滿足用戶保持訪問(wèn)同一臺(tái)服務(wù)器 又能實(shí)現(xiàn)負(fù)載均衡
ip_hash;
server http://127.0.0.1:3000;
# server 你也可以選擇配置多個(gè)服務(wù)器IP
}
最后記得重啟/usr/local/nginx/sbin/nginx -s reload
多個(gè)域名配置
除了主頁(yè)shirmy.me之外消恍,我們通常還要有一個(gè)管理后臺(tái):admin.shirmy.me岂昭,因?yàn)橛玫氖敲赓M(fèi)證書(shū),所以我們也只好為子域名申請(qǐng)一個(gè)SSL證書(shū)狠怨,并且以同樣的方式配置约啊。
我們又總不能用端口shirmy.me:5000這樣子訪問(wèn)吧邑遏,其實(shí)只要這樣做:
server {
listen 80;
# admin.shirmy.me
server_name admin.shirmy.me;
location / {
# 直接看上面 HTTP 跳轉(zhuǎn)到 HTTPS 的配置
root www/http.admin.shirmy.me/;
index index.html index.htm;
}
}
最后記得重啟/usr/local/nginx/sbin/nginx -s reload