<pre>
前言
參考鏈接:nginx_百度百科
- Nginx 是一個非常輕量級的服務(wù)器,他雖輕但是他最大的優(yōu)點就是可以承載大量的并發(fā)案糙,所以說一般的話很少有用 Node 直接去做服務(wù)器讓用戶去訪問的昌罩,因為 Node 本身就需要做非 常非常多的事情喊递,雖然說簡單的可以使用 Node 直接開啟掏熬,但是對于負(fù)載和并發(fā) Node 是弱項敛助,就是反向代理和并發(fā)是 Node 整個的弱項捻浦,所以我們需要在前面用 Nginx 擋一層晤揣,這樣的話對于我們整個的系統(tǒng)的運維架構(gòu)來講也是一個非常得力的一個助手,還有就是跟其他的比如說我們后層整個架構(gòu)的設(shè)計屬于運維的這一塊朱灿,它也是有一種先天優(yōu)勢的這樣的服務(wù)器
概述
主要結(jié)構(gòu)
-
什么是反向代理與負(fù)載均衡
反向代理
負(fù)載均衡
Nginx 負(fù)載均衡的實現(xiàn)
-
HTTP UPstream 模塊
什么是 HTTP Upstream 模塊
ip_hash 指令 -- 落到哪個上
server 指令 -- server 的權(quán)重
UPstream 指令
-
其他負(fù)載均衡的方法
- 對于我們前端而言只需要將負(fù)載子我們的項目里面配置好就可以了不需要去太深入的學(xué)習(xí)昧识,只要給人家運維一眼一口,然后知道怎么配合就完了盗扒,因為對于運維來講滞诺,他們是不太懂 Node 的什么什么東西的形导,他們只會配這個 Nginx 的,所以說我們學(xué)這個的話只要學(xué)的夠用就 ok 了
1. 什么是反向代理與負(fù)載均衡
- 反向代理
-
舉例說明:
比如說平時我們上谷歌上不了然后需要翻墻习霹,谷歌是我們明確的去要訪問的站點朵耕,這個時候我們會用一些翻墻的工具(代理服務(wù)器),這個代理服務(wù)器幫我們?nèi)』毓雀杞o我們看淋叶,這個就是一個正向的代理
那么反向 代理剛好是相反的:我們不知道去取哪一臺機器阎曹,然后代理幫我們?nèi)ト。缓蟀讶〉降膬?nèi)容返回給我們
一個是明確的知道煞檩,一個是不知道处嫌,這就是正向代理和反向代理
-
上圖解釋
就是用自己的計算機 A 想訪問國外的網(wǎng)站 B ,訪問不了斟湃,就有一個中間的服務(wù)器 C 它去訪問國外的網(wǎng)站 B 熏迹,其實如果是把這個 C 裝到我們自己的電腦上,我們自己的電腦訪問 C 凝赛,然后 C 再去訪問 B 注暗,這個時候這個 C 就叫代理服務(wù)器,這個時候就是正向代理墓猎,他有一個特點捆昏,就是我們一定知道要訪問哪個網(wǎng)站
還有就是當(dāng)我們有一個服務(wù)器集群,而且服務(wù)器集群中的每臺服務(wù)器的內(nèi)容都是一樣的時候毙沾,同樣我們從個人的電腦訪問到比如說 現(xiàn)在我們有四臺 Node 的機器 骗卜,但是我們無法訪問,這個時候有第三方的服務(wù)器是可以訪問到 那四個 Node 的機器的 左胞,這個時候我們就可以借助這個第三方的服務(wù)器去訪問寇仓, 但是我們并不知道它最后會落到四臺中的哪一臺機器上,這個就是反向代理
反向代理的用途
- 負(fù)載均衡
-
跟上面的反向代理有一個息息相關(guān)的東西就是負(fù)載均衡
- 就是上面的四臺機器烤宙,你不知道最終要找的是誰焚刺,但是 Nginx 知道,它會幫你找到壓力最小的那個服務(wù)器然后返回給你门烂,就這樣的可以分擔(dān)你的壓力
-
上圖需要注意的點
在建立很多很多個服務(wù)器的時候乳愉,要確保每臺服務(wù)器上的東西得是一樣的
上圖中所說的中間服務(wù)器,在本章中指的就是 Nginx
2. Nginx 負(fù)載均衡的實現(xiàn)
3. HTTP UPstream 模塊
- 什么是 HTTP UPstream 模塊
- ip_hash 指令
- 這個是比如用戶落在這樣一臺服務(wù)器上了屯远,然后下次用戶一刷新又落到別的上面了蔓姚,這個就不太對了,所以 ip_hash 是為了保證用戶再次刷新的時候還能落到他之前落到的那臺服務(wù)器上慨丐,這樣就 ok 了
- server 指令
- 這個是:你可以指定這臺服務(wù)器的權(quán)重坡脐,就是說如果你知道了這臺機器要比別的優(yōu)秀,那么你可以給它的權(quán)重給標(biāo)的高一點房揭,那么更多的請求就會落到這個你認(rèn)為優(yōu)秀的機器上面备闲,默認(rèn)是 1:1:1 的晌端,這個 1:1:1 可以舉成 2:1:1 的例子來說明:就是現(xiàn)在有三臺機器,第一臺的權(quán)重被設(shè)置為了 2 后面兩臺都是 1 恬砂,這樣的話落到第一臺的幾率就是 2 / 3咧纠,后面兩臺的都是 1 / 3
- UPstream 指令
4. 其他負(fù)載均衡的方法
上面的主要是理論下面是實戰(zhàn)操作
macOS 部署 Nginx
第一步的網(wǎng)址是 MAC 系統(tǒng)下的一個神器,它是一個 macOS 缺失的軟件包管理器 https://brew.sh/index_zh-cn.html
接著就是打開命令行終端依次輸入命令
//安裝 Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
//查看是否有 nginx 的包
brew search nginx
命令行輸出如下:打了一個對勾就證明是有的泻骤,接下來就可以安裝了
//安裝 nginx
brew install nginx
//裝過之后可以查看 nginx 對應(yīng)的一些版本的信息
brew info nginx
//查看 nginx 版本信息
nginx -v
//啟動 nginx 漆羔,這個默認(rèn)的端口號是 8080
nginx
//可以暫停 nginx
nginx -s stop
//再次啟動 nginx
nginx
- 這個是時候在瀏覽器中輸入 localhost:8080 就可以打開 nginx 首頁了
- 這個時候你會發(fā)現(xiàn)頁面 title 的 icon 是 Jenkins 的頭像,這個原因是因為如果你裝過 Jenkins 的話狱掂,它是非常頑固的會不停的去折騰演痒、重啟你的 8080 端口,你如果是
kill
是殺不掉的趋惨,你需要用下面的命令就可以把它給停掉了
//停掉 jenkins
sudo launchctl unload/Library/LaunchDaemons/org.jenkins-ci.plist
//停掉之后如果想啟動 jenkins
systemctl start jenkins
- 想要進(jìn)行上面的 反向代理和負(fù)載均衡 還需要對 nginx 進(jìn)行配置
//停止 nginx 服務(wù)
nginx -s stop
//重新加載 nginx 配置文件
nginx -s reload
- 打開 nginx 具體安裝目錄 查看配置文件
-
/usr/local/etc/nginx/
這個是 macOS 下 nginx 的安裝目錄鸟顺,其他系統(tǒng)的可能會不大一樣
//先進(jìn)入 nginx 目錄的上一級目錄
cd /usr/local/etc/
//查看該目錄下的所有文件,可以在下圖看到 nginx 目錄
ls
//再進(jìn)入 nginx 目錄
cd nginx
//查看該目錄下的所有文件器虾,可以在下圖看到 nginx 目錄下的所有文件
ls
- 可以看到里面有個 nginx.conf 的文件讯嫂,這個就是 nginx 的配置文件,上面的 nginx2.conf 是之前做的備份可以忽略掉
//查看配置文件的內(nèi)容曾撤,下圖是內(nèi)容的一部分端姚,這個里面的內(nèi)容就是 nginx 默認(rèn)的配置內(nèi)容
cat nginx.conf
-
對上圖的一些解釋
#user
指的是哪個用戶能用晕粪,可以將后面的 nobody 修改成你指定誰用的那個用戶的用戶名worker_processes
這個是你的一個工作的進(jìn)程挤悉,其實實際上指的就是 CPU 的核數(shù),如果你是 4 核的話巫湘,這個值就是 4装悲,你需要看到自己的電腦是幾核的處理器,然后你可以在這里面做相應(yīng)的設(shè)置尚氛,最多就是 2 倍诀诊,一般就是標(biāo)準(zhǔn)的幾核就是幾個 或者 2 倍,這個不能亂設(shè)-
#error_log
這個就是整個產(chǎn)生錯誤的日志nginx 的日志跟我們 Node 的日志比一點都不遜色阅嘶,它們的區(qū)別是:nginx 可以完全的記錄所有的請求的日志属瓣,因為它是一個向外去擴散的一個去做負(fù)載均衡的口子,你的那個 Node 是你的項目里的一些 log 讯柔,兩個人都各自有分工
這個 log 是會非常龐大的抡蛙,所以像有的一些大公司會有專門去存 log 的服務(wù)器,那些數(shù)據(jù)挖掘的人或者是運維會每天去查這個日志魂迄,從這些日志里其實可以拿到很多很多的東西粗截,所以這個日志是至關(guān)重要的,對于大公司來講這個是比命還重要的東西捣炬,所以 nginx 的日志是萬萬不能丟的熊昌,任何語言里的日志它們都會分成 level(級別)
上面的第一行就是 出錯的日志 绽榛,第二行是警告的,第三行是基本信息
#pid
這個是 nginx 非常重要的一個配置文件婿屹,這個就別動就好了events -> worker_connections
這個就是整個的連接數(shù)灭美,就是說你一下子往你的這個上面壓多少-
http
模塊 在這個里面可以去指定一下所謂的我們平時的 gzip 、Etag 等等都是從這里去開啟的#gzip
把前面的#
號去掉选泻,然后這個 gzip 就開啟了冲粤,在我們?nèi)プ鲂阅軆?yōu)化的時候在這里面把 Etag 一開就很簡單,還包括那個 express 過期時間都在這里-
server
listen 這里是監(jiān)聽 8080 端口
#charset koi8-r
這個是它輸出的語言access_log 這個是它的日志
location 這個非常重要页眯,里面的 root 不是指的同戶名梯捕,而是當(dāng)前的 html 文件夾,它會從下面的順序依次開始找窝撵,直到找到對應(yīng)的一個文件然后去給你吐
error_page
這個是 Node 控制出錯的傀顾,有時你會發(fā)現(xiàn)百度、騰訊或者是其他的一些公司的 404 是一樣的碌奉,原因就是在這的短曾,所有的請求都固定到這,然后他把一些出錯都控制好 是這樣的一個原因下面還有一些 500 502 503 504 赐劣,他都把這些出錯導(dǎo)到 50x 去了嫉拐,所以這些不是真正的內(nèi)部的系統(tǒng)去做的。而是一些做負(fù)載均衡的服務(wù)器去做的
`location ~ .php<pre 這些就是用正則去匹配一些更復(fù)雜的魁兼,就是你真正的路由都可以在這里面去寫
- 接下來就是我們要給運維做什么
- 我們要給運維做的東西相對來說比較簡單婉徘,不用去搞那些雜七雜八的,注意:修改文件的時候要記得把注釋刪掉
//這個就是我們前端需要給運維做的東西咐汞,這個是從復(fù)雜的 nginx 里去抽出來的
worker_processes 4;//這個是你的一個工作的進(jìn)程盖呼,其實實際上指的就是 CPU 的核數(shù)
events{
worker_connections 1024;//這個就是整個的連接數(shù)凉敲,就是說你一下子往你的這個上面壓多少
}
//上面兩個其實你不給運維的話也是可以的涕刚,他都不要,你寫了也沒用禽炬,關(guān)鍵的就是下面的 http
http{
//這個是負(fù)載均衡的所有的 server 植阴,這里的 IP 地址需要寫成你需要用到的真實有效的才行
upstream firsttest{
server 192.168.230.128;
server 192.168.230.129;
}
server{
//通過 server 監(jiān)聽的是 8080
listen 8080;
//當(dāng)你訪問 / 這個路由地址的時候 通過下面的 proxy_pass 代理去訪問 firsttest 然后就可以了
location / {
proxy_pass http://firsttest;
}
}
}
- 無注釋版本
worker_processes 4;
events{
worker_connections 1024;
}
http{
upstream firsttest{
server 192.168.230.128;
server 192.168.230.129;
}
server{
listen 8080;
location / {
proxy_pass http://firsttest;
}
}
}
-
接著是對照上面的設(shè)置修改你的 nginx.conf 文件
- 先要對之前的 nginx.conf 文件進(jìn)行備份
//先進(jìn)入到系統(tǒng)安裝的 nginx 目錄下 cd /usr/local/etc/nginx //備份配置文件 cp nginx.conf nginx.conf.back //備份之后再查看是否已成功生成文件 ls
* 修改 nginx.conf 文件蟹瘾,將下面的代碼片段里面的設(shè)置相應(yīng)的復(fù)制按照規(guī)則復(fù)制進(jìn)這個文件中,之后保存即可
```
worker_processes 4;
events{
worker_connections 1024;
}
http{
upstream firsttest{
server 192.168.230.128;
server 192.168.230.129;
}
server{
listen 8080;
location / {
proxy_pass http://firsttest;
}
}
}
```
- 修改并保存之后掠手,在瀏覽器中打開你設(shè)置的兩個服務(wù)器 ip 地址進(jìn)行查看憾朴,打不開的原因也會出現(xiàn),比如:防火墻未關(guān)閉導(dǎo)致的
- 為了顯示區(qū)別 我將兩臺服務(wù)器上的文字稍作了修改惨撇,修改之后伊脓,還需要重載 nginx 才會生效哦
//先暫停
nginx -s stop
//進(jìn)入 html 目錄修改 index.html
cd /usr/share/nginx/html
vi html
//修改之后保存并退出
ESC 鍵
:
wq
//重載
nginx -s reload
//啟動
nginx
- 現(xiàn)在刷新瀏覽器,會發(fā)現(xiàn) 128 和 129 兩臺服務(wù)器分別能落到的幾率為 50%
[圖片上傳中...(image.png-79fb06-1517377202839-0)]
-
這里我發(fā)現(xiàn)了一個問題,因為我的兩臺服務(wù)器一個是 Centos 一個是 Ubuntu 128报腔,Centos 129 的里面的 index.html 文件修改成功了多了 192.168.230.129 端口號株搔,但是 Ubuntu 那個沒有
- 解決上面 Ubuntu 的問題
//先查看 nginx 配置文件 cat /etc/nginx/nginx.conf
- 會發(fā)現(xiàn) http 設(shè)置里面有這樣的默認(rèn)設(shè)置
* 這里我再次分別進(jìn)入這兩個目錄
```
//發(fā)現(xiàn)只有這個目錄下有個 default 文件
cd /etc/nginx/sites-enabled
ls
//查看該文件
cat default
```
* 發(fā)現(xiàn)里面引用的是 root 用戶下的 `/var/www/html` 目錄中的 html
* 這時去修改 `/var/www/html` 目錄下的 html 文件
```
cd /var/www/html
//查看目錄下包含的文件 發(fā)現(xiàn)只有 index.nginx-debian.html 文件
ls
//使用下面的命令以圖形化的方式打開該目錄(適合 Ubuntu 下使用的命令) 再在編輯器中 修改 index.nginx-debian.html 文件 保存并退出
nautilus ./
//先將 nginx 運行暫停
//再重載
//最后啟動
systemctl start nginx
//最后查看是否是 running 狀態(tài)
systemctl status nginx
```
* Ubuntu 下重啟期間總是會出現(xiàn)一些莫名奇妙的問題,我的解決方法就是
```
//先找到在運行中的與 nginx 相關(guān)的所有進(jìn)程
ps -eaf |grep nginx
//然后使用 kill -9 命令將他們一個一個的殺掉
kill -9 1250
//再重新啟動 nginx
systemctl start nginx
```
- 這個時候再去刷新查看瀏覽器纯蛾,會發(fā)現(xiàn)已經(jīng)成功了 129 128 每次落到的幾率都是 50%
- 還可以在修改 nginx.conf 配置文件中的 http 對象纤房,這里我是在 Ubuntu 下里面的文件
//先暫停 nginx
systemctl stop nginx
//進(jìn)入配置文件目錄
cd /etc/nginx
//以圖形化的界面打開該目錄
nautilus ./
//在編輯器中編輯 nginx.conf 配置文件
//在 firsttest 里面增加一個 ip_hash 屬性 一定記得要加 分號
upstream firsttest{
ip_hash;
}
//之后再重載一遍
nginx -s reload
//運行
nginx
-
再刷新瀏覽器,會發(fā)現(xiàn)訪問的是 Ubuntu 這個 128
的增加了 ip_hash 的服務(wù)器時翻诉,只要你第一個訪問成功了炮姨,那么它下次就會默認(rèn)還訪問這個上次訪問成功了的服務(wù)器 ,不會再落到另一臺服務(wù)器上了碰煌,Centos 129 那個服務(wù)器就還是之前的 50% 幾率的動態(tài)落
- 還可以在里面加一個權(quán)重的東西舒岸,參照上面的方法,權(quán)重是添加到 IP 地址后面的芦圾,下圖中加了屬性 值為 2 這樣的話如果是頁面刷新三次的話 落到 128 Ubuntu 這臺服務(wù)器上的幾率就是 3 / 2 蛾派,要先把上面加的 ip_hash 刪掉,測試才會有效
下面主要是一些 在 Ubuntu 和 Centos 下與上面的 MAC 下的具體操作差異个少,還有就是操作時遇到的一些坑
- 裝包洪乍,Centos 的話需要 先將Centos的yum源更換為國內(nèi)的阿里云源 參考地址:將Centos的yum源更換為國內(nèi)的阿里云源 再進(jìn)行安裝
//Centos
yum install nginx
//Ubuntu
sudo apt-get install nginx
-
在修改完 nginx.conf 文件并保存后 重載時會報錯
- 下面是報錯的文本
nginx: [error] invalid PID number "" in "/run/nginx.pid"
- 需要先執(zhí)行一行命令,才能再執(zhí)行重載
// /etc/nginx 是 ubuntu 和 centos 下的安裝目錄 cd /etc/nginx nginx -c /etc/nginx/nginx.conf //然后再進(jìn)行重載 nginx -s reload
啟動和暫停命令使用
systemctl
//啟動 nginx
systemctl start nginx
//暫停 nginx
systemctl stop nginx
//重啟 nginx
systemctl restart nginx
- 如果在啟動時遇到下面的錯誤夜焦,可移步至 centos7安裝nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
-
Ubuntu 和 Centos nginx 的具體文件位置
nginx 配置文件的目錄 /etc/nginx/
nginx 項目文件的目錄 /usr/share/nginx/
有時在本機打不開的原因:防火墻未關(guān)閉壳澳、nginx 未啟動
在 Ubuntu 下修改文件時先進(jìn)入目錄下再使用
nautilus ./
命令以圖形化的形式打開目錄,再在編輯器中進(jìn)行編輯并保存比較方便這里我使用的是 Centos 和 Ubuntu 兩個虛擬機來模擬的服務(wù)器