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