七年開發(fā)經(jīng)驗(yàn)Nginx功能詳解

一、proxy_pass

在nginx中配置proxy_pass代理轉(zhuǎn)發(fā)時(shí)篱竭,如果在proxy_pass后面的url加/癌刽,表示絕對(duì)根路徑役首;如果沒有/,表示相對(duì)路徑显拜,把匹配的路徑部分也給代理走衡奥。

假設(shè)下面四種情況分別用 http://192.168.1.1/proxy/test.html 進(jìn)行訪問。

第一種:

location /proxy/ {

proxy_pass http://127.0.0.1/;

}

代理到URL:http://127.0.0.1/test.html

第二種(相對(duì)于第一種远荠,最后少一個(gè) / )

location /proxy/ {

proxy_pass http://127.0.0.1;

}

代理到URL:http://127.0.0.1/proxy/test.html

第三種:

location /proxy/ {

proxy_pass http://127.0.0.1/aaa/;

}

代理到URL:http://127.0.0.1/aaa/test.html

第四種(相對(duì)于第三種矮固,最后少一個(gè) / )

location /proxy/ {

proxy_pass http://127.0.0.1/aaa;

}

代理到URL:http://127.0.0.1/aaatest.html

第五種 配合upstream模塊

如果一個(gè)域名可以解析到多個(gè)地址,那么這些地址會(huì)被輪流使用譬淳,此外档址,還可以把一個(gè)地址指定為 server group

upstream acs.gwmfc.com {

server 10.5.1.20:17007 max_fails=2 fail_timeout=15s;

server 10.5.1.21:17007 max_fails=2 fail_timeout=15s down;

ip_hash;

}

server {

listen 9000;

server_name ACS-NGINX-P01;

location / {

proxy_pass http://acs.gwmfc.com;

proxy_read_timeout 300;

proxy_connect_timeout 90;

proxy_send_timeout 300;

proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;

} X_Forward_For字段表示該條http請(qǐng)求是有誰發(fā)起的?如果反向代理服務(wù)器不重寫該請(qǐng)求頭的話邻梆,那么后端真實(shí)服務(wù)器在處理時(shí)會(huì)認(rèn)為所有的請(qǐng)求都來在反向代理服務(wù)器守伸,如果后端有防攻擊策略的話,那么機(jī)器就被封掉了(顯示真實(shí)訪問ip)

二浦妄、rewrite

syntax: rewrite regex replacement [flag]

rewrite由ngx_http_rewrite_module標(biāo)準(zhǔn)模塊支持是實(shí)現(xiàn)URL重定向的重要指令尼摹,他根據(jù)regex(正則表達(dá)式)來匹配內(nèi)容跳轉(zhuǎn)到replacement,結(jié)尾是flag標(biāo)記

簡(jiǎn)單的小例子:

1.rewrite ^/(.*) http://www.baidu.com/ permanent; # 匹配成功后跳轉(zhuǎn)到百度校辩,執(zhí)行永久301跳轉(zhuǎn)

常用正則表達(dá)式regex

字符 描述

將后面接著的字符標(biāo)記為一個(gè)特殊字符或者一個(gè)原義字符或一個(gè)向后引用

^ 匹配輸入字符串的起始位置

$ 匹配輸入字符串的結(jié)束位置

* 匹配前面的字符零次或者多次

+ 匹配前面字符串一次或者多次

? 匹配前面字符串的零次或者一次

. 匹配除“ ”之外的所有單個(gè)字符

(pattern) 匹配括號(hào)內(nèi)的pattern

rewrite 最后一項(xiàng)flag參數(shù):

標(biāo)記符號(hào) 說明

last 本條規(guī)則匹配完成后繼續(xù)向下匹配新的location URI規(guī)則

break 本條規(guī)則匹配完成后終止窘问,不在匹配任何規(guī)則

redirect 返回302臨時(shí)重定向

permanent 返回301永久重定向

在反向代理域名的使用,在tomcat中配置多個(gè)項(xiàng)目需要掛目錄的使用案例:

server {

listen 443;

server_name FLS-Nginx-P01;

ssl on;

ssl_certificate cert/214837463560686.pem;

ssl_certificate_key cert/214837463560686.key;

ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

location = / {

rewrite ^(.*)$ https://fls.orafl.com/fls/;

}

location / {

proxy_redirect http https;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;

proxy_pass http://10.6.3.4:8080;

}

}

公網(wǎng)域名解析fls.orafl.com

三宜咒、log_format

nginx服務(wù)器日志相關(guān)指令主要有兩條:一條是log_format惠赫,用來設(shè)置日志格式;另外一條是access_log故黑,用來指定日志文件的存放路徑儿咱、格式和緩存大小,可以參加ngx_http_log_module场晶。一般在nginx的配置文件中日記配置(/usr/local/nginx/conf/nginx.conf)

log_format指令用來設(shè)置日志的記錄格式混埠,它的語法如下:

log_format name format {format ...}

其中name表示定義的格式名稱,format表示定義的格式樣式诗轻。

log_format有一個(gè)默認(rèn)的钳宪、無須設(shè)置的combined日志格式設(shè)置,相當(dāng)于Apache的combined日志格式,其具體參數(shù)如下:

log_format combined '$remote_addr-$remote_user [$time_local]'

‘"$request"$status $body_bytes_sent’

‘"$http_referer" "$http_user_agent"’

也可以自定義一份日志的記錄格式吏颖,不過要注意搔体,log_format指令設(shè)置的名稱在配置文件中是不能重復(fù)的。

四半醉、ssl證書加密配置

upstream acs.gwmfc.com {

server 10.5.1.*:17007 max_fails=2 fail_timeout=15s;

server 10.5.1.*:17007 max_fails=2 fail_timeout=15s down;

ip_hash; ----同一ip會(huì)被分配給固定的后端服務(wù)器,解決session問題

}

server {

listen 443;

server_name ACS-NGINX-P01;

ssl on;

ssl_certificate 214820781820381.pem; 證書路徑:nginx.conf所在目錄

ssl_certificate_key 214820781820381.key;

ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

location / {

proxy_pass http://acs.gwmfc.com;

proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;

}

}

五疚俱、sendfile

sendfile: 設(shè)置為on表示啟動(dòng)高效傳輸文件的模式。sendfile可以讓Nginx在傳輸文件時(shí)直接在磁盤和tcp socket之間傳輸數(shù)據(jù)缩多。如果這個(gè)參數(shù)不開啟呆奕,會(huì)先在用戶空間(Nginx進(jìn)程空間)申請(qǐng)一個(gè)buffer,用read函數(shù)把數(shù)據(jù)從磁盤讀到cache衬吆,再從cache讀取到用戶空間的buffer梁钾,再用write函數(shù)把數(shù)據(jù)從用戶空間的buffer寫入到內(nèi)核的buffer,最后到tcp socket逊抡。開啟這個(gè)參數(shù)后可以讓數(shù)據(jù)不用經(jīng)過用戶buffer陈轿。

六、keepalive_timeout

當(dāng)上傳一個(gè)發(fā)數(shù)據(jù)文件時(shí)秦忿,nginx往往會(huì)超時(shí),此時(shí)需要調(diào)整keepalive_timeout參數(shù)蛾娶,保持會(huì)話長(zhǎng)鏈接

七灯谣、gzip

如果你是個(gè)前端開發(fā)人員,你肯定知道線上環(huán)境要把js蛔琅,css胎许,圖片等壓縮,盡量減少文件的大小罗售,提升響應(yīng)速度辜窑,特別是對(duì)移動(dòng)端,這個(gè)非常重要寨躁。

gzip使用環(huán)境:http,server,location,if(x),一般把它定義在nginx.conf的http{…..}之間

gzip on

on為啟用穆碎,off為關(guān)閉

gzip_min_length 1k

設(shè)置允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從header頭中的Content-Length中進(jìn)行獲取职恳。默認(rèn)值是0所禀,不管頁面多大都?jí)嚎s。建議設(shè)置成大于1k的字節(jié)數(shù)放钦,小于1k可能會(huì)越壓越大色徘。

gzip_buffers 4 16k

獲取多少內(nèi)存用于緩存壓縮結(jié)果,‘4 16k’表示以16k*4為單位獲得

gzip_comp_level 5

gzip壓縮比(1~9)操禀,越小壓縮效果越差褂策,但是越大處理越慢,所以一般取中間值;

gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php

對(duì)特定的MIME類型生效,其中'text/html’被系統(tǒng)強(qiáng)制啟用

gzip_http_version 1.1

識(shí)別http協(xié)議的版本,早起瀏覽器可能不支持gzip自解壓,用戶會(huì)看到亂碼

gzip_vary on

啟用應(yīng)答頭"Vary: Accept-Encoding"

gzip_proxied off

nginx做為反向代理時(shí)啟用,off(關(guān)閉所有代理結(jié)果的數(shù)據(jù)的壓縮),expired(啟用壓縮,如果header頭中包括"Expires"頭信息),no-cache(啟用壓縮,header頭中包含"Cache-Control:no-cache"),no-store(啟用壓縮,header頭中包含"Cache-Control:no-store"),private(啟用壓縮,header頭中包含"Cache-Control:private"),no_last_modefied(啟用壓縮,header頭中不包含"Last-Modified"),no_etag(啟用壓縮,如果header頭中不包含"Etag"頭信息),auth(啟用壓縮,如果header頭中包含"Authorization"頭信息)

gzip_disable msie6

(IE5.5和IE6 SP1使用msie6參數(shù)來禁止gzip壓縮 )指定哪些不需要gzip壓縮的瀏覽器(將和User-Agents進(jìn)行匹配),依賴于PCRE庫

以上代碼可以插入到 http {...}整個(gè)服務(wù)器的配置里,也可以插入到虛擬主機(jī)的 server {...}或者下面的location模塊內(nèi)

八斤寂、客戶端上傳文件限制

client_body_buffer_size 15M;

請(qǐng)求緩沖區(qū)在NGINX請(qǐng)求處理中起著重要作用耿焊。 在接收到請(qǐng)求時(shí),NGINX將其寫入這些緩沖區(qū)扬蕊,此指令設(shè)置用于請(qǐng)求主體的緩沖區(qū)大小搀别。 如果主體超過緩沖區(qū)大小,則完整主體或其一部分將寫入臨時(shí)文件尾抑。 如果NGINX配置為使用文件而不是內(nèi)存緩沖區(qū)歇父,則該指令會(huì)被忽略。 默認(rèn)情況下再愈,該指令為32位系統(tǒng)設(shè)置一個(gè)8k緩沖區(qū)榜苫,為64位系統(tǒng)設(shè)置一個(gè)16k緩沖區(qū)

client_body_temp_path clientpath 3 2;

關(guān)于client_body_temp目錄的作用,簡(jiǎn)單說就是如果客戶端POST一個(gè)比較大的文件翎冲,長(zhǎng)度超過了nginx緩沖區(qū)的大小垂睬,需要把這個(gè)文件的部分或者全部?jī)?nèi)容暫存到client_body_temp目錄下的臨時(shí)文件。

后面的level1抗悍,2驹饺,3是什么意思?

因?yàn)槿绻猩蟼鞯奈募挤旁谝粋€(gè)文件夾下缴渊,不僅很容易文件名沖突赏壹,并且容易導(dǎo)致一個(gè)文件夾特別大。

所以有必要?jiǎng)?chuàng)建子目錄

這里的level1,2,3如果有值就代表存在一級(jí)衔沼,二級(jí)蝌借,三級(jí)子目錄。

目錄名是由數(shù)字進(jìn)行命名的指蚁,所以這里的具體的值就是代表目錄名的數(shù)字位數(shù)

比如

client_body_temp_path /spool/nginx/client_temp 3 2;

可能創(chuàng)建的文件路徑為

/spool/nginx/client_temp/702/45/00000123457

client_max_body_size 30M;

此指令設(shè)置NGINX能處理的最大請(qǐng)求主體大小菩佑。 如果請(qǐng)求大于指定的大小,則NGINX發(fā)回HTTP 413(Request Entity too large)錯(cuò)誤凝化。 如果服務(wù)器處理大文件上傳稍坯,則該指令非常重要。

九缘圈、worker_processes和worker_connections

worker_processes:操作系統(tǒng)啟動(dòng)多少個(gè)工作進(jìn)程運(yùn)行Nginx劣光。注意是工作進(jìn)程,不是有多少個(gè)nginx工程糟把。在Nginx運(yùn)行的時(shí)候绢涡,會(huì)啟動(dòng)兩種進(jìn)程,一種是主進(jìn)程master process遣疯;一種是工作進(jìn)程worker process雄可。例如我在配置文件中將worker_processes設(shè)置為4凿傅,啟動(dòng)Nginx后,使用進(jìn)程查看命令觀察名字叫做nginx的進(jìn)程信息数苫,我會(huì)看到如下結(jié)果:1個(gè)nginx主進(jìn)程聪舒,master process;還有四個(gè)工作進(jìn)程虐急,worker process箱残。主進(jìn)程負(fù)責(zé)監(jiān)控端口,協(xié)調(diào)工作進(jìn)程的工作狀態(tài)止吁,分配工作任務(wù)被辑,工作進(jìn)程負(fù)責(zé)進(jìn)行任務(wù)處理。一般這個(gè)參數(shù)要和操作系統(tǒng)的CPU內(nèi)核數(shù)成倍數(shù)敬惦∨卫恚可以設(shè)置為auto自動(dòng)識(shí)別

worker_connections:這個(gè)屬性是指單個(gè)工作進(jìn)程可以允許同時(shí)建立外部連接的數(shù)量。無論這個(gè)連接是外部主動(dòng)建立的俄删,還是內(nèi)部建立的宏怔。這里需要注意的是,一個(gè)工作進(jìn)程建立一個(gè)連接后畴椰,進(jìn)程將打開一個(gè)文件副本臊诊。所以這個(gè)數(shù)量還受操作系統(tǒng)設(shè)定的,進(jìn)程最大可打開的文件數(shù)有關(guān)斜脂。

十妨猩、stream模塊

nginx從1.9.0開始,新增加了一個(gè)stream模塊秽褒,用來實(shí)現(xiàn)四層協(xié)議的轉(zhuǎn)發(fā)、代理或者負(fù)載均衡等威兜。這完全就是搶HAproxy份額的節(jié)奏销斟,鑒于nginx在7層負(fù)載均衡和web service上的成功,和nginx良好的框架椒舵,stream模塊前景一片光明

stream模塊默認(rèn)沒有編譯到nginx蚂踊, 編譯nginx時(shí)候 ./configure –with-stream 即可

stream模塊用法和http模塊差不多,關(guān)鍵的是語法幾乎一致笔宿。熟悉http模塊配置語法的上手更快

以下是一個(gè)配置了tcp負(fù)載均衡和udp(dns)負(fù)載均衡的例子, 有 server犁钟,upstream塊,而且還有server泼橘,

hash涝动, listen, proxy_pass等指令炬灭,如果不看最外層的stream關(guān)鍵字醋粟,還以為是http模塊呢,下例是四層反代郵箱協(xié)議的例子,直寫了25端口,其他端口方法相同

stream {

upstream smtp {

least_conn; ------把請(qǐng)求轉(zhuǎn)發(fā)給連接數(shù)較少的后端米愿,能夠達(dá)到更好的負(fù)載均衡效果

server 10.5.3.17:25 max_fails=2 fail_timeout=10s;

}

server {

listen 25;

proxy_pass smtp;

proxy_timeout 3s;

proxy_connect_timeout 1s;

}

大家可以點(diǎn)擊加入群:【Java高級(jí)架構(gòu)進(jìn)階群】 里面有Java高級(jí)大牛直播講解知識(shí)點(diǎn) 走的就是高端路線厦凤,(如果你想跳槽換工作 但是技術(shù)又不夠 或者工作上遇到了瓶頸 ,我這里有一個(gè)JAVA的免費(fèi)直播課程 育苟,講的是高端的知識(shí)點(diǎn)基礎(chǔ)不好的誤入喲较鼓,只要你有1-5年的開發(fā)經(jīng)驗(yàn)可以加群找我要課堂鏈接 注意:是免費(fèi)的 沒有開發(fā)經(jīng)驗(yàn)誤入哦)

點(diǎn)擊鏈接加入群聊【Java高級(jí)架構(gòu)進(jìn)階群】:群地址

寫在最后:歡迎留言討論,加關(guān)注违柏,持續(xù)更新2├谩!勇垛!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脖母,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闲孤,更是在濱河造成了極大的恐慌谆级,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讼积,死亡現(xiàn)場(chǎng)離奇詭異肥照,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勤众,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門舆绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人们颜,你說我怎么就攤上這事吕朵。” “怎么了窥突?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵努溃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我阻问,道長(zhǎng)梧税,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任称近,我火速辦了婚禮第队,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刨秆。我一直安慰自己凳谦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布衡未。 她就那樣靜靜地躺著晾蜘,像睡著了一般邻眷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剔交,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天肆饶,我揣著相機(jī)與錄音,去河邊找鬼岖常。 笑死驯镊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竭鞍。 我是一名探鬼主播板惑,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼偎快!你這毒婦竟也來了冯乘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤晒夹,失蹤者是張志新(化名)和其女友劉穎裆馒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丐怯,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喷好,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了读跷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗搅。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖效览,靈堂內(nèi)的尸體忽然破棺而出无切,到底是詐尸還是另有隱情,我是刑警寧澤丐枉,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布订雾,位于F島的核電站,受9級(jí)特大地震影響矛洞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烫映,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一沼本、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锭沟,春花似錦抽兆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凭涂。三九已至,卻和暖如春贴妻,著一層夾襖步出監(jiān)牢的瞬間切油,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工名惩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澎胡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓娩鹉,卻偏偏與公主長(zhǎng)得像攻谁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弯予,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Page 1:nginx 服務(wù)器安裝及配置文件詳解 CentOS 6.2 x86_64 安裝 nginx 1.1 ...
    xiaojianxu閱讀 8,545評(píng)論 1 41
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理戚宦,服務(wù)發(fā)現(xiàn),斷路器锈嫩,智...
    卡卡羅2017閱讀 134,722評(píng)論 18 139
  • 一受楼、proxy_pass 在nginx中配置proxy_pass代理轉(zhuǎn)發(fā)時(shí),如果在proxy_pass后面的url...
    Java黎先生閱讀 978評(píng)論 0 0
  • nginx在工作中已經(jīng)有好幾個(gè)環(huán)境在使用了祠挫,每次都是重新去網(wǎng)上扒博客那槽,各種編譯配置,今天自己也整理一份安裝文檔和n...
    AndyChin閱讀 2,305評(píng)論 0 4
  • 1.簡(jiǎn)介: ? Nginx:engine X 等舔,2002年骚灸,開源,商業(yè)版? http協(xié)議:web服務(wù)器(類似于ht...
    尛尛大尹閱讀 1,871評(píng)論 0 3