實用 Nginx 極簡教程,覆蓋了常用場景

分類:└ 技術(shù)前沿,來源:江門市深區有圳市巨鳥網絡科技有限公司有限公司

概述

什麼是 Nginx?

Nginx (engine x) 是一款輕量級但體的 Web 服務器(qì) 、反向代理服務器(qì)及電舞如子(zǐ)郵件(IMAP/POP3)代理外為服務器(qì)。

 

什麼是反向代理?

反向代理(Reverse Proxy)方式是指以代理服務器(qì)來接受 in行樂ternet 上的連接請求,然後将請求轉發給内部網絡上的服務器(問村qì),并将從服務器(qì)上得到的結果返回給 internet 上請求連拍你接的客戶端,此時代理服務器(qì)對外就表現為一議身個(gè)反向代理服務器(qì)。

微信圖片_20210114170022.jpg

 

使用

nginx 的使用比較簡單,就是幾條命令。音員

常用到的命令如(rú)下(xià):

nginx -s stop      &nb店雪sp;快速關(guān)閉Nginx,可(kě)能會什不保存相關(guān)信息,并迅速終止web服務。

nginx -s quit    &站師nbsp;  平穩關(guān)閉Nginx,保存相關(guān跳電)信息,有安排的結束web服務。

nginx -s reload 計用    因改變了Nginx相關(guān)配置,需要南學重新加載配置而重載。

nginx -s reopen   大身  重新打開日志文(wén)件。

nginx -c filename   為 Ngi錯報nx 指定一個(gè)配置文(wén)件,來代替術北缺省的。

nginx -t    &好志nbsp;       不費但運行,而僅僅測試配置文(wén)件。nginx 将檢查配置文(wén)件的玩頻語法的正确性,并嘗試打開配置文(wén)件中(zhōng)飛雜所引用到的文(wén)件。

nginx -v        &n微著bsp;   顯示 nginx 的版本。

nginx -V    &nbs場問p;       顯示 nginx從樹 的版本,編譯器(qì)版本和(hé)配置參數。

如(rú)果不想每次都敲命令,可(kě)以在 nginx 安裝目錄下(xià)個算新添一個(gè)啟動(dòng)批處理文(wén)件startup.bat,年對雙擊即可(kě)運行。内容如(rú)下(xià)河商:

@echo off

rem 如(rú)果啟動(dòng)前已經啟聽姐動(dòng)nginx并記錄下(xià)pid文(wén)件,會kill線窗指定進程

nginx.exe -s stop

 

rem 測試配置文(wén)件語法正确性

nginx.exe -t -c conf/nginx.conf

 

rem 顯示版本信息

nginx.exe -v

 

rem 按照指定配置去啟動(dòng)nginx

nginx.exe -c conf/nginx.conf

如(rú)果是運行在 Linux 下(xià),寫一個湖民(gè) shell 腳本,大同小異。

 

nginx 配置實戰

我始終認為,各種開發工具的配置還是結合實戰來講述,會讓人更鐘樂易理解。

我們先實現一個(gè)小目标:不考慮複雜的配置,僅僅是完成一個(gè) 來為http 反向代理。

nginx.conf 配置文(wén)件如(rú)下(xià):

注:conf / nginx.conf 是 nginx 的默認配置文(wé哥業n)件。你(nǐ)也可(kě)以使用 nginx -c 指定你(nǐ)黑內的配置文(wén)件

#運行用戶

#user somebody;

 

#啟動(dòng)進程,通(tōng)常設置成和(hé)cpu的答醫數量相等

worker_processes  1;人藍

 

#全局錯誤日志

error_log  D:/Tools/n見校ginx-1.10.1/logs/error.log;

error_log  D:/Tools/nginx-1.1喝信0.1/logs/notice.log  notice;

error_log  D:/Tools/nginx-1廠人.10.1/logs/info.log&nb頻明sp; info;

 

#PID文(wén)件,記錄當前啟動(dòng)師員的nginx的進程ID

pid      &nb姐山sp; D:/Tools/nginx-1.著購10.1/logs/nginx.pid;

 

#工作模式及連接數上限

events {

    worker_connection鄉事s 1024;    #單個(gè)後台worker 黑子process進程的最大并發鍊接數

}

 

#設定http服務器(qì),利用它的反輛劇向代理功能提供負載均衡支持

http {

    #設定mim這校e類型(郵件支持類型),類型由mime.types文(w愛一én)件定義

    includ木上e       D:/Tools/ng火土inx-1.10.1/conf/mime.t房吃ypes;

    default_type  app兒他lication/octet-stream;

 

    #設定日志

    log_format 購友 main  '[$remo數吃te_addr] - [$remote_u討海ser] [$time_local] "$requ資雜est" '

        &nb習是sp;          聽們;   '$status $body_bytes_兵大sent "$http_ref好老erer" '

        &錯黑nbsp;         &n分報bsp;   '"$http_user_ag通姐ent" "$http_x_forwarde道草d_for"';

 

    access_log&nbs遠物p;   D:/Tools/ngin我子x-1.10.1/logs/access.log main;

    rewrite_log&n得腦bsp;    on;

 

    #sendfile 指令指定 nginx 是否那費調用 sendfile 函數(zero copy 方式)來輸出文黑市(wén)件,對于普通(tōng)應用,

    #必須設為 on,如頻煙(rú)果用來進行下(xià)載等應用磁盤IO重負載應用,可(廠黑kě)設置為 off,以平衡磁盤與網絡I外花/O處理速度,降低系統的uptime.

    sendfile  &n女從bsp;     on;

    #tcp_nopush&nb外低sp;    on;

 

    #連接超時時間

    keepalive_timeout微一  120;

    tcp_nodela動個y      說能  on;

 

    #gzip壓縮開關(guān)

    #gzip  o農見n;

 

    #設定實際的服務器(q去小ì)列表

    upstream頻體 zp_server1{

     器年   server 127.0.0.1吃草:8089;

    }

 

    #HTTP服務器(qì)

    server {

      &司又nbsp; #監聽80端口,80端口是知名端口号,用于HTTP協議

        listen&nbs廠我p;      80;

 

        #定義使用www.x媽議x.com訪問(wèn)

        server_name視森  www.helloworld.com;

 

        #首頁

      &n黃河bsp; index index.html

 

       靜雨; #指向webapp的目錄

      這間  root D:\01_Workspace腦師\Project\github\zp\Spri鄉信ngNotes\spring-security\sprin文高g-shiro\src\main\webapp;

 

        #編碼格又腦式

        charse習冷t utf-8;

 

        #代理笑放配置參數

       員土 proxy_connect_timeout 180;

       東畫; proxy_send_timeout 180;

        prox問信y_read_timeout 180;

       讀也 proxy_set_header Host $愛志host;

      &nbs學議p; proxy_set_header X-術志Forwarder-For $remote_addr;

 

        #反向代理的路(lù)那計徑(和(hé)upstream綁定),loc行匠ation 後面設置映射的路(lù)徑

        locatio用刀n / {

          &nbs城厭p; proxy_pass http://zp_server1;

        }

 

       匠數; #靜态文(wén)件,nginx自己處理

        樹身location ~ ^/(images|javascrip學妹t|js|css|flash|media|static)微北/ {

        &nb什吧sp;   root D:\01_Workspace\Pro事唱ject\github\zp\SpringN坐白otes\spring-security\spring-shir月鐘o\src\main\webapp\views;

      &遠月nbsp;     #過男煙期30天,靜态文(wén)件不怎麼更新,過期可(k制身ě)以設大一點,如(rú)果頻繁更新,則可(kě)以設置得小一男秒點。

       老做;     expire數那s 30d;

        }

 

        #設定廠山查看Nginx狀态的地址

     花討   location /NginxStatus {

         討日   stub_status&問錢nbsp;     &上車nbsp;    on;話刀

      &n工拿bsp;     acces校靜s_log      &nbs坐都p;     on;

        &nb道市sp;   auth_basic    &秒醫nbsp;       "N行議ginxStatus";

         黃地   auth_basic_user友要_file  conf/htpa訊錯sswd;

       上器 }

 

        #禁止訪問(w女厭èn) .htxxx 文(wén)件

       學跳 location ~ /\.ht {

        畫們    deny all;

        村廠}

 

        #錯誤處理頁面(可(k厭訊ě)選擇性配置)

        #error_pa他醫ge   404&n樂上bsp;     &n又刀bsp;      女跳; /404.html;

        #error家老_page   50好上0 502 503 504  /50x.htm電農l;

        #lo拿空cation = /50x.html {

        #  &nb有科sp; root   html;

      &nbs但街p; #}

    }

}

好了,讓我們來試試吧:

啟動(dòng) webapp,注意啟動(dòng)綁定的端

好了,讓我們來試試吧:

啟動(dòng) webapp,注意啟動(dòn黑門g)綁定的端口要和(hé) nginx 中(zhōng)的 照市upstream 設置的端口保持一緻。

更改 host:在 C:\Windows\Sys通知tem32\drivers\etc 目錄下(xià)的 host 文西光(wén)件中(zhōng)添加一條 DNS 記錄

 127.0.0.1 www.helloworld.c票兒om

啟動(dòng)前文(wén)中(zhōng) startu白也p.bat 的命令

在浏覽器(qì)中(zhōng)訪問(wèn) www.helloworld.通歌com,不出意外,已經可(kě)以訪問(wèn上子)了。

 

負載均衡配置

上一個(gè)例子(zǐ)中(zhōng),代理僅僅指向一個(gè)服務器(q廠快ì)。

但是,網站(zhàn)在實際運營過程中(zh吃筆ōng),多半都是有多台服務器(qì)運行着同樣的 app,一讀這時需要使用負載均衡來分流。

nginx 也可(kě)以實現簡單的負載均衡功能。

假設這樣一個(gè)應用場景:将應用部署在刀新 192.168.1.11:80、192.168.1.12:謝志80、192.168.1.13:80 三台 linux 環司內境的服務器(qì)上。網站(zhàn)域名叫 www.hel費就loworld.com,公網 IP 為 1河舞92.168.1.11。在公網 IP 所在的服務器(qì)上部署 n得北ginx,對所有請求做負載均衡處理。

nginx.conf 配置如(rú)下(xià):

http {

     #設定mime類型海土,類型由mime.type文(wén)件定義

    include  &呢明nbsp;    /etc/nginx/mime.ty自人pes;

    default_拍城type  application/octe快街t-stream;

    #設定日志格式

    access_log&nb線雨sp;   /var/log/nginx/ac業北cess.log;

 

    #設定負載均衡的服務器(qì)列表

    upstream lo近雪ad_balance_server {

        #weig船離th參數表示權值,權值越高被分配到的幾率越大大市

        server麗唱 192.168.1.11:80   年影weight=5;

        se開服rver 192.168.1.12:80   weig用物ht=1;

        server 作嗎192.168.1.13:80   他一;weight=6;

    }

 

   #HTTP服務器(qì)

   server {

       我志 #偵聽80端口

        li市務sten       80討那;

 

        #定義使用ww舊水w.xx.com訪問(wèn)

        媽藍server_name  www.helloworld.com一熱;

 

        #對所有請山小求進行負載均衡請求

        locatio學山n / {

      &動員nbsp;     root   就雜     /root;&票看nbsp;       &船土nbsp;       老個 #定義服務器(qì)的默認網站(zhàn)根目錄位置

          &nbs見喝p; index       腦白index.html index.htm;  #廠懂定義首頁索引文(wén)件的名稱

          銀煙  proxy_pass  htt窗議p://load_balance_serv從鐵er ;#請求轉向load_balance_server 定義的服務器(qì媽農)列表

 

        厭線    #以下(xià)是一些反向代理的配置(可腦影(kě)選擇性配置)

      可女      #proxy_redirect 又請off;

     厭身       自從proxy_set_header Host $ho吧聽st;

        &風新nbsp;   proxy_set_heade她地r X-Real-IP $remote_addr妹短;

       水關;     #後端的Web服務器(qì)可(kě)內和以通(tōng)過X-Forwarded-For獲取用戶真實IP

         明話   proxy_set_header X-For兒黃warded-For $remote_addr;

          &nb醫門sp; proxy_connect_timeout 90朋大;     朋電     #nginx跟後端服務器(qì)連接超時時間(代物家理連接超時)

        &n海黑bsp;   proxy_send_ti數微meout 90;  &nbs跳家p;       &nb劇匠sp;  #後端服務器(qì)數據回傳時謝林間(代理發送超時)

        &nb技匠sp;   proxy_read_畫門timeout 90;   市高;      船他;    #連接成功後,後端服務器(qì)響應時間(代農公理接收超時)

          風相  proxy_buffer_size 4k;  &nbs公拍p;       亮姐    #設置代理服務器(務好qì)(nginx)保存用戶頭信息的緩沖區大小

         行紅   proxy_buffers 4 32k;&n兵鐵bsp;       裡離      &nb自冷sp;#proxy_buffers緩沖區,網頁平均在3農問2k以下(xià)的話,這樣設置

         如下   proxy_busy_buffers_size 友電64k;      &nbs報理p;#高負荷下(xià)緩沖大小(proxy_buffers*2)

      &能又nbsp;     proxy_te美聽mp_file_write_size 64k; 年知;   #設定緩存文(wén)件夾大小,大于這個(gè)值,将從u相歌pstream服務器(qì)傳

 

        &車下nbsp;   client_max_body_si笑如ze 10m;      爸草    #允許客戶端請求的最錯公大單文(wén)件字節數

      &個的nbsp;     client_body_bu好唱ffer_size 128k;  &nb煙短sp;   #緩沖區代理緩沖用戶端請求的最大字節音會數

      &n答人bsp; }

    }

}


網站(zhàn)有多個(gè) webapp 的配置

當一個(gè)網站(zhàn)功能越來越業雪豐富時,往往需要将一些功能相對獨立的模塊剝離(lí)出來,獨立維到個護。這樣的話,通(tōng)常,會有多個(gè她業) webapp。

舉個(gè)例子(zǐ):假如(rú) www.helloworld.co嗎還m 站(zhàn)點有好幾個(gè)

webapp,finance(金融)、produc技學t(産品)、admin(用戶中(zhōng)心)農讀。訪問(wèn)這些應用的方式通(tōng)過上下(xià)文(w自開én)(context)來進行區分:

www.helloworld.com/fi的你nance/

www.helloworld.com/product/

www.helloworld.com/admin/


我們知道,http 的默認端口号是 80,如(rú)果在一台服務員不器(qì)上同時啟動(dòng)這 3 個(gè)筆做 webapp 應用,都用 80 端口,肯定是不成的。所以,這三務分個(gè)應用需要分别綁定不同的端口号。

那麼,問(wèn)題來了,用戶在實際訪問(wèn) www.hello廠自world.com 站(zhàn)點時,訪問(wèn來樂)不同 webapp,總不會還帶着對應的端口号去訪問(wèn)吧。所以,你(年的nǐ)再次需要用到反向代理來做處理。

配置也不難,來看看怎麼做吧:

http {

    #此處省略一些基本配置

 

    upstream product_serve中們r{

        se自說rver www.helloworld.com:8081;

    }

 

    upstream admin_server{

        server 裡年www.helloworld.com:8082;

    }

 

    upstream finance_server{山那

      畫做  server www.hellowo電明rld.com:8083;

    }

 

    server {

       你區; #此處省略一些基本配置

        #城腦默認指向product的server

        locat哥近ion / {

      &拍區nbsp;     proxy_pass http:子呢//product_server;

        }

 

       好新; location /product/有鐘{

          &紙站nbsp; proxy_pass http://pr理林oduct_server;

        市花}

 

        locatio業我n /admin/ {

          &現理nbsp; proxy_pass http://admin_s低紙erver;

        }讀國

 

     花舞   location /finance/ {

       大玩     proxy_靜湖pass http://finance_server通了;

        }

    }

}


https 反向代理配置

一些對安全性要求比較高的站(zhàn)點,可(kě)能會使用 HTTPS風鐘(一種使用 ssl 通(tōng)信标準的也數安全 HTTP 協議)。

這裡不科普 HTTP 協議和(hé) SSL 标準。但是,使呢書用 nginx 配置 https 需要知道幾點:

HTTPS 的固定端口号是 443,不同于 HTTP 的 80空內 端口

SSL 标準需要引入安全證書,所以在 nginx.conf笑湖 中(zhōng)你(nǐ)需要指定證書和(大空hé)它對應的 key

其他和(hé) http 反向代理基本一樣,隻是在 Serv紙快er 部分配置有些不同。

 #HTTP服務器(qì)

  server {

      #監聽443端口。443為知名端口号睡到,主要用于HTTPS協議

      li筆制sten       443 ssl;這筆

 

      #定義使用www.xx.com訪問吧對(wèn)

      server_name 算月 www.helloworld.com;

 

      #ssl證書文(影中wén)件位置(常見證書文(wén)件格式為:cr是山t/pem)

      ssl_ce土吧rtificate     為費 cert.pem;

      #ssl證書key位厭朋置

      ssl_ce舊器rtificate_key  cert.key;

 

      #ss要鄉l配置參數(選擇性配置)

      ssl_session_ca子快che    shared:SSL:1m;

      ssl_sessi購匠on_timeout  5m;

      #數字簽名,此處使用MD5

      ssl_就務ciphers  HIGH:!aNULL:!MD5;

      計計ssl_prefer_server_cip們司hers  on;

 

      loca土呢tion / {

         內區 root   /root;

         費用 index  index.htm內有l index.htm;

      }

  }


靜态站(zhàn)點配置

有時候,我們需要配置靜态站(zhàn)點(即 html 文要去(wén)件和(hé)一堆靜态資(zī)源)。

舉例來說:如(rú)果所有的靜态資(zī)源都放在了 /app/dist 飛不目錄下(xià),我們隻需要在 nginx.conf 中(zh路海ōng)指定首頁以及這個(gè)站(zhàn)術黃點的 host 即可(kě)。

配置如(rú)下(xià):

worker_processes  1;

 

events {

    worker_c看費onnections  1024;

}

 

http {

    include  &們又nbsp;    mime.ty報視pes;

    default_type  app樂房lication/octet-stream;

    sendfile  &nbs樂熱p;     on;

    keepalive醫從_timeout  65;

 

    gzip on;

    gzip_typ通資es text/plain application/x-javas空樂cript text/css application/xml開影 text/javascript applic答裡ation/javascript image/jpeg im少體age/gif image/png;

    gzip_vary o裡森n;

 

    server {作雪

      &答數nbsp; listen    &nb能家sp;  80;

        ser商歌ver_name  static.zp.cn舞站;

 

        locatio內校n / {

        &nbs制有p;   root /app/d鐘師ist;

          &n視外bsp; index index.html;

          &n愛外bsp; #轉發任何請求到 index.html

        }

    }

}

然後,添加 HOST:

127.0.0.1 static.zp.cn

此時,在本地浏覽器(qì)訪問(wèn) static.房術zp.cn ,就可(kě)以訪問(wèn)靜态好子站(zhàn)點了。

 

搭建文(wén)件服務器(qì)

有時候,團隊需要歸檔一些數據或資(zī)料,那麼就技文(wén)件服務器(qì)必不可(kě)少(shǎ靜少o)。使用 Nginx 可(kě)以非常快速制懂便捷的搭建一個(gè)簡易的文(wén)件服務。

Nginx 中(zhōng)的配置要點:

将 autoindex 開啟可(kě)以顯示目風子錄,默認不開啟。

将 autoindex_exact_siz吃生e 開啟可(kě)以顯示文(wén)件的大小。

将 autoindex_localtime 開啟煙間可(kě)以顯示文(wén)件的修改時間。

root 用來設置開放為文(wén)件服務的根路(lù制鐘)徑。

charset 設置為 charset utf-8,gbk;,可(從他kě)以避免中(zhōng)文(wén)算木亂碼問(wèn)題(windows

服務器(qì)下(xià)設置後,依然亂碼,本靜看人暫時沒有找到解決方法)。

一個(gè)最簡化的配置如(rú)下(xià):

autoindex on;# 顯示目錄

autoindex_exact_size on;# 顯示文(wén)能讀件大小

autoindex_localtime on;# 顯示文(wén)件時間

 

server {

    charset    &紙員nbsp; utf-8,gbk; # windows 服務器(qì)下(金月xià)設置後,依然亂碼,暫時無解

    listen  &美議nbsp;    9050 d通可efault_server;

    listen  &影綠nbsp;    [::]:9哥家050 default_server;

    server_name  _;

    root    &能如nbsp;    /雜呢share/fs;

}


跨域解決方案

web 領域開發中(zhōng),經常采用前後端分離(l照上í)模式。這種模式下(xià),前端和(姐兒hé)後端分别是獨立的 web 應用程序,例如(rú):後師習端是 Java 程序,前端是 React 或 Vue 應用。

各自獨立的 web app 在互相訪問(wèn)時,勢必存在跨域問(wèn看秒)題。解決跨域問(wèn)題一般有兩種思路(lù):問和

1、CORS

在後端服務器(qì)設置 HTTP 響應頭,把你(n事體ǐ)需要運行訪問(wèn)的域名加入加入 Access-Contr新她ol-Allow-Origin中(zhōng船上)。

2、jsonp

把後端根據請求,構造 json 數據,并返回,前端用 jsonp坐又 跨域。

這兩種思路(lù),本文(wén)不展開讨論。

需要說明的是,nginx 根據第一種思路(lù),也提供了一種東下解決跨域的解決方案。

舉例:www.helloworld.com 網站(zhàn)是工鐵由一個(gè)前端 app ,一個(gè)村麗後端 app 組成的。前端端口号為 9000, 後端端口号為 808見我0。

前端和(hé)後端如(rú)果使用 http要外 進行交互時,請求會被拒絕,因為存在跨域問(wèn)題。來看看,ngi信數nx 是怎麼解決的吧:

首先,在 enable-cors.conf 文(wén)件中(zhōng)我還設置 cors :

# allow origin list

set $ACAO '*';

 

# set single origin

if ($http_origin ~* (www.helloworl下兒d.com)$) {

  set $ACAO $http_origin;

}

 

if ($cors = "tr秒和ueget") {

    add_hea我海der 'Access-Control-Allow-Or輛女igin' "$http_origin"舞男;;

    add_header &#務從39;Access-Control-Allow-Cred學話entials' 'true';

    add_header '草拿;Access-Control-Allow-Methods&雜兵#39; 'GET, POST, OP是村TIONS';

    add_header &線街#39;Access-Control-All還資ow-Headers' 'DNT,X-Mx-Req微鐵Token,Keep-Alive,User-劇小Agent,X-Requested-With,If-Modified-S商子ince,Cache-Control,Content-Type房生9;;

}

 

if ($request_method = 'OPTIONS西店') {

  set $cors "${cors}o舞做ptions";

}

 

if ($request_method = 舊道9;GET') {

  set $cors &qu對業ot;${cors}get";

}

 

if ($request_method = &地了#39;POST') {

  set $cors "${要友cors}post";

}

接下(xià)來,在你(nǐ)的服務器(qì飛時)中(zhōng) include en低冷able-cors.conf 來引入跨域配置: 

# ---------------------------------路小-------------------

# 此文(wén)件為項目 nginx 配置片段

# 可(kě)以直接在 nginx config 坐輛中(zhōng) include(推薦)

# 或者 copy 到現有 nginx 中(zhōng),自行村制配置

# www.helloworld.com 域名需配合 dns hosts 技光進行配置

# 其中(zhōng),api 開啟了 cors,需配合本目錄下嗎店(xià)另一份配置文(wén)件

# -----------------------------------他日-----------------

upstream front_server{

  server www.helloworld.com一好:9000;

}

upstream api_server{關志

  server www.he老如lloworld.com:8080;

}

 

server {

  listen  劇會     80;

  server_name&nb木男sp; www.helloworld.com;

 

  location ~ ^/api/ {

    include enabl樹湖e-cors.conf;

    proxy_pass http://api_se舞高rver;

    rewrite 街電"^/api/(.*)$" /$1 break;

  }

 

  location ~ ^/ {

    proxy_pass 場對http://front_server;

  }

}

到此,就完成了