概述
什麼是 Nginx?
Nginx (engine x) 是一款輕量級但體的 Web 服務器(qì) 、反向代理服務器(qì)及電舞如子(zǐ)郵件(IMAP/POP3)代理外為服務器(qì)。
什麼是反向代理?
反向代理(Reverse Proxy)方式是指以代理服務器(qì)來接受 in行樂ternet 上的連接請求,然後将請求轉發給内部網絡上的服務器(問村qì),并将從服務器(qì)上得到的結果返回給 internet 上請求連拍你接的客戶端,此時代理服務器(qì)對外就表現為一議身個(gè)反向代理服務器(qì)。
使用
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;
}
}
到此,就完成了