Mac OS X 下的 Nginx 使用(后端之旅I)

image.png

作為前端開發(fā)者诗舰,服務(wù)器端的知識一直都是我們大部分人的弱項和硬傷警儒。

不僅僅是對服務(wù)器端處理邏輯、數(shù)據(jù)庫的操作眶根、以及系統(tǒng)高可用架構(gòu)的優(yōu)化上缺少經(jīng)驗蜀铲,連對對 Linux 的操作和對 Nginx 的熟悉程度也不夠。

于是属百,我奔著成為全棧工程師的宏大目標(biāo)记劝,開啟了后端之旅(第1篇)。

Nginx 的入門和簡單應(yīng)用族扰,是我第一個打算探索的 隆夯。

Nginx 是一個異步框架的Web服務(wù)器。它正變得越來越熱門和常用别伏,因為它相對于 Apache 能更好的處理高并發(fā)蹄衷,性能更優(yōu),也更加方便進行模塊化擴展厘肮。

那 Nginx 能做什么呢愧口?

  1. 反向代理
  2. 負(fù)載均衡
  3. HTTP服務(wù)器(包含動靜分離)
  4. 正向代理

聽起來非常的厲害!與其臨淵羨魚不如类茂,退而結(jié)網(wǎng)耍属,趕緊開始學(xué)習(xí)吧托嚣!

一、安裝 brew

brew 又叫 Homebrew厚骗,是Mac中的一款軟件包管理工具示启,通過 brew 可以很方便的在Mac中安裝軟件或是卸載軟件。

一般Mac電腦會默認(rèn)內(nèi)置安裝 brew领舰。

常用命令如下:

  • brew 搜索軟件:
    brew search nginx

  • brew 安裝軟件
    brew install nginx

  • brew 卸載軟件
    brew uninstall nginx

  • brew 升級
    sudo brew update

  • 查看安裝信息(經(jīng)常用到, 比如查看安裝目錄等)
    sudo brew info nginx

  • 查看已經(jīng)安裝的軟件
    brew list

image.png

這工具使起來非常爽夫嗓,跟我們前端開發(fā)中的 npm/yarn 功能很類似。只不過這個工具在整個 Mac 系統(tǒng)都可以用冲秽,而 npm 一般只能用在基于 node 開發(fā)的工程項目中舍咖。

二、安裝 Nginx

所謂萬事俱備锉桑,只欠東風(fēng)排霉。安裝好了 brew,離安裝好 Nginx 只差一步之遙民轴。

只需要一句 sudo brew install nginx 即可搞定攻柠。

(sudo 是什么?如果對 Linux 還不太熟的前端小白后裸,可以移步 我的知乎回答

三辙诞、啟動 Nginx

安裝好了 Nginx 之后,只需要一句命令就能啟動 Nginx 服務(wù):

sudo brew services start nginx

此時轻抱,在瀏覽器訪問 localhost:8080 就可看到 Nginx 的默認(rèn)頁面了飞涂。

image.png

如果想查看 Nginx 相關(guān)的具體進程,可以使用

ps -ef | grep nginx

使用效果如下:

image.png

其他 Nginx 日常命令:

  • 關(guān)閉nginx服務(wù)
    sudo brew services stop nginx

  • 重新加載nginx
    nginx -s reload

  • 停止nginx
    nginx -s stop

  • 查看nginx版本
    nginx -v

四祈搜、更改 Nginx 配置

Nginx 安裝完以后较店,可以在終端輸出的信息里看到一些配置路徑:

  1. /usr/local/etc/nginx/nginx.conf (配置文件路徑)
  2. /usr/local/var/www (服務(wù)器默認(rèn)路徑)
  3. /usr/local/Cellar/nginx/1.15.0 (貌似是安裝路徑)
image.png

日常應(yīng)用中,1和2兩個路徑會經(jīng)常用到容燕,因此很重要梁呈。最開始提到的 Nginx 幾個作用中,反向代理蘸秘、負(fù)載均衡官卡、正向代理都需要更改配置文件。把 Nginx 當(dāng)成 HTTP服務(wù)器來用醋虏,既需要更改配置文件寻咒,大概率還會使用到服務(wù)器的根目錄路徑。

1. 反向代理配置文件 demo
server {  
        listen       8080;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;

        location / {
            proxy_pass http://localhost:9000;
            proxy_set_header Host $host:$server_port;
        }
}

我本地 node 起了9000端口颈嚼,Nginx 起的服務(wù)是8080端口毛秘。實現(xiàn)了在本地瀏覽器訪問8080端口,Nginx 會代理到9000端口(node 服務(wù))。

image.png

如果想實現(xiàn)既能代理叫挟,又要訪問到 Nginx 本身的服務(wù)端口艰匙,可以再寫一個 server 配置對象,配置如下:

server {  
        listen       3333;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;

        location / {
            root   html;
            index  index.html index.htm;
        }
}

這樣再訪問 localhost:3333 就能訪問到 Nginx 自身啟動的服務(wù)了抹恳。

2. 負(fù)載均衡配置文件 demo

負(fù)載均衡的意思就是分?jǐn)偟蕉鄠€任務(wù)單元上员凝,來共同完成同一個任務(wù)。

當(dāng)有2臺或以上服務(wù)器時奋献,根據(jù)規(guī)則隨機的將請求分發(fā)到指定的服務(wù)器上處理健霹,負(fù)載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉(zhuǎn)到負(fù)載均衡秽荞。

我這里用本地多個端口模擬代替多臺服務(wù)器骤公。

    upstream test {
        server localhost:8000;
        server localhost:9000;
    }
    server {
        listen       4444;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;

        location / {
            proxy_pass http://test;
            proxy_set_header Host $host:$server_port;
        }
    }

兩 個 node 服務(wù)抚官,一個是8000 端口扬跋,一個是9000 端口。

此時訪問 localhost:4444 可以看到偶爾會代理到8000端口凌节,偶爾會代理到9000端口钦听。

image.png
image.png

由此說明,Nginx 的負(fù)載起了作用倍奢。

它根據(jù)兩個服務(wù)的實際運行情況朴上,將網(wǎng)絡(luò)請求分配到了不同的業(yè)務(wù)邏輯服務(wù)器(這里只是不同端口,現(xiàn)實情況應(yīng)該是多個不同的真是服務(wù)器)上處理卒煞。

原來痪宰,后端經(jīng)常說的高大上的“負(fù)載均衡”其實也不過如此。當(dāng)然這只是一個非常簡單的例子畔裕,不過是為了熟悉一下 Nginx 的配置衣撬。

其實 upstream 配置中還可以設(shè)置 權(quán)重,來實現(xiàn) Nginx 把流量打到到各臺服務(wù)器的概率扮饶。

upstream test {
    server localhost:8000 weight=9;
    server localhost:9000 weight=1;
}

這樣就實現(xiàn)了具练,每10次請求到 Nginx,一般只會有1次會訪問到9000端口甜无,而有9次會訪問到8000扛点。

3. HTTP服務(wù)器(包含動靜分離)配置文件 demo

文章開頭也提到過,Nginx 本身就是一個 web 服務(wù)器岂丘。所以當(dāng)只有靜態(tài)資源的時候陵究,就可以用 Nginx 來返回一個你自己的 index.html 文件,實現(xiàn)一個純靜態(tài)服務(wù)器奥帘。

在 Nginx 的服務(wù)器根目錄 /usr/local/var/www畔乙,新建一個 test.html,內(nèi)容如下:

<!DOCTYPE html>
<html>
<head>
  <title>test nginx index page</title>
  <style>
    body {
      width: 35em;
      margin: 0 auto;
      font-family: Tahoma, Verdana, Arial, sans-serif;
    }
  </style>
</head>
<body>
  <h1>test nginx index page!</h1>
</body>
</html>

將 server 配置項改成:

location / {
   root   html;
   index  test.html index.htm;
}

(index.html 變成了我們新建的 test.html)

此時訪問 localhost:8080 可以看到:

image.png

說明我們已經(jīng)可以來實現(xiàn)一個自定義的簡單版靜態(tài)網(wǎng)站了翩概,如果是需要將默認(rèn)頁面設(shè)成是非根目錄下的 index.html 文件牲距,需要改動少量配置文件(參考如下圖)返咱。

 location / {
    root   /root;   #把默認(rèn)路徑更改為/root目錄下下
    index index.html index.htm;
}

純靜態(tài)的 web 服務(wù)器比較好配置,但是動靜分離性的就會復(fù)雜一些牍鞠。

什么是動靜分離咖摹?

動靜分離是將網(wǎng)站里的所有請求區(qū)分為不變的靜態(tài)資源請求和動態(tài)的數(shù)據(jù)請求。Nginx遇到靜請求會直接返回nginx根目錄下的靜態(tài)資源难述,遇到動態(tài)請求會直接轉(zhuǎn)發(fā)給后臺真實的服務(wù)器(如Apache萤晴、Tomcat等),這就是網(wǎng)站動靜分離處理的核心思路胁后。

upstream test{  
       server localhost:8000;  
       server localhost:9000;  
    }   

    server {  
        listen       8080;  
        server_name  localhost;  

        location / {  
            root   e:wwwroot;  
            index  index.html;  
        }  

        # 所有靜態(tài)請求都由nginx處理店读,存放目錄為html  
        location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {  
            root    e:wwwroot;  
        }  

        # 所有動態(tài)請求都轉(zhuǎn)發(fā)給tomcat處理  
        location ~ .(jsp|do)$ {  
            proxy_pass  http://test;  
        }  

        error_page   500 502 503 504  /50x.html;  
        location = /50x.html {  
            root   e:wwwroot;  
        }  
    }  

這樣我們就可以把 html、圖片攀芯、css以及js放到wwwroot目錄下屯断,而tomcat只負(fù)責(zé)處理jsp和請求。例如當(dāng)我們后綴為.gif的時候侣诺,Nginx默認(rèn)會從wwwroot獲取到當(dāng)前請求的動態(tài)圖文件返回殖演。

當(dāng)然,這里的靜態(tài)文件跟Nginx是同一臺服務(wù)器年鸳,我們也可以在另外一臺服務(wù)器趴久,然后通過反向代理和負(fù)載均衡配置過去就好了。只要搞清楚了最基本的流程搔确,很多配置就很簡單了彼棍。另外localtion后面其實可以是一個正則表達式,配置非常靈活膳算。

4. 正向代理配置文件 demo

正向代理座硕,意思是一個位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容畦幢,客戶端向代理發(fā)送一個請求并指定目標(biāo)(原始服務(wù)器)坎吻,然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端∮畲校客戶端才能使用正向代理瘦真。當(dāng)你需要把你的服務(wù)器作為代理服務(wù)器的時候,可以用Nginx來實現(xiàn)正向代理。

因為正向代理用得少一些,所以這個我沒有親自踩坑斤斧。貼出網(wǎng)上配置實例嚣鄙,供各位看官參考:

resolver 114.114.114.114 8.8.8.8;
server {
    resolver_timeout 5s;
    listen 81;
    access_log  e:wwwrootproxy.access.log;
    error_log   e:wwwrootproxy.error.log;

    location / {
        proxy_pass http://$host$request_uri;
    }
}

發(fā)布

resolver 是配置正向代理的DNS服務(wù)器姑宽,listen 是正向代理的端口。配置好了就可以在ie上面或者其他代理插件上面使用服務(wù)器ip+端口號進行代理了滔韵。

image.png

題外話

后端開發(fā)其實也并沒有想象中的難肆捕,只是跟我們前端的開發(fā)思路上會有一些較大的差異际看。當(dāng)我們在更多的處理著頁面上離用戶很近的 bug 的時候咸产,后端正在做很多用戶可能都感知不到的事情。

作為一個軟件開發(fā)工程師(雖然目前仍是一個前端開發(fā))仲闽,后端開發(fā)這個環(huán)節(jié)非常重要脑溢,我們每個開發(fā)者都沒有理由不去掌握它。


友情提示
Nginx 在 Mac 系統(tǒng)上的安裝和常用命令可能跟 Windows 上不大一樣赖欣。幾年都沒碰 Windows 了屑彻,為了避免踩出不必要的坑,建議使用 Windows 的童鞋移步 windows下nginx的安裝及使用方法入門 - 騰訊云社區(qū) :)

Nginx 進階配置顶吮,可參考 nginx快速入門之配置篇 - 知乎

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末社牲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子悴了,更是在濱河造成了極大的恐慌搏恤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件让禀,死亡現(xiàn)場離奇詭異挑社,居然都是意外死亡陨界,警方通過查閱死者的電腦和手機巡揍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菌瘪,“玉大人腮敌,你說我怎么就攤上這事∏卫” “怎么了糜工?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長录淡。 經(jīng)常有香客問我捌木,道長,這世上最難降的妖魔是什么嫉戚? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任刨裆,我火速辦了婚禮,結(jié)果婚禮上彬檀,老公的妹妹穿的比我還像新娘帆啃。我一直安慰自己,他們只是感情好窍帝,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布努潘。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疯坤。 梳的紋絲不亂的頭發(fā)上报慕,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音压怠,去河邊找鬼卖子。 笑死,一個胖子當(dāng)著我的面吹牛刑峡,可吹牛的內(nèi)容都是我干的洋闽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼突梦,長吁一口氣:“原來是場噩夢啊……” “哼诫舅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宫患,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤刊懈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娃闲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虚汛,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年皇帮,在試婚紗的時候發(fā)現(xiàn)自己被綠了卷哩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡属拾,死狀恐怖将谊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渐白,我是刑警寧澤尊浓,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站纯衍,受9級特大地震影響栋齿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜襟诸,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一瓦堵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧励堡,春花似錦谷丸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泉唁。三九已至,卻和暖如春揩慕,著一層夾襖步出監(jiān)牢的瞬間亭畜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工迎卤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拴鸵,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓蜗搔,卻偏偏與公主長得像劲藐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子樟凄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353