全棧開(kāi)發(fā)—使用Nginx配置HTTPS和反向代理

個(gè)人博客開(kāi)發(fā)系列文章:

使用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效果圖

配置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ù)器配置方式:

騰訊云SSL證書(shū)安裝指引

如果直接使用文檔中的方式系瓢,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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恰矩,隨后出現(xiàn)的幾起案子记盒,更是在濱河造成了極大的恐慌,老刑警劉巖外傅,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纪吮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萎胰,警方通過(guò)查閱死者的電腦和手機(jī)碾盟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)技竟,“玉大人冰肴,你說(shuō)我怎么就攤上這事±谱椋” “怎么了熙尉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓷患。 經(jīng)常有香客問(wèn)我骡尽,道長(zhǎng),這世上最難降的妖魔是什么擅编? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任攀细,我火速辦了婚禮,結(jié)果婚禮上爱态,老公的妹妹穿的比我還像新娘谭贪。我一直安慰自己,他們只是感情好锦担,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布俭识。 她就那樣靜靜地躺著,像睡著了一般洞渔。 火紅的嫁衣襯著肌膚如雪套媚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天磁椒,我揣著相機(jī)與錄音堤瘤,去河邊找鬼。 笑死浆熔,一個(gè)胖子當(dāng)著我的面吹牛本辐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼慎皱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼老虫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起茫多,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祈匙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后地梨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菊卷,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年宝剖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洁闰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡万细,死狀恐怖扑眉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赖钞,我是刑警寧澤腰素,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站雪营,受9級(jí)特大地震影響弓千,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜献起,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一洋访、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谴餐,春花似錦姻政、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厌殉,卻和暖如春食绿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背公罕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工器紧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熏兄。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親摩桶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桥状,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353