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請求是有誰發(fā)起的?如果反向代理服務(wù)器不重寫該請求頭的話,那么后端真實(shí)服務(wù)器在處理時(shí)會(huì)認(rèn)為所有的請求都來在反向代理服務(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)記
簡單的小例子:
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)程空間)申請一個(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ì)話長鏈接
七、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ū)在NGINX請求處理中起著重要作用。 在接收到請求時(shí),NGINX將其寫入這些緩沖區(qū),此指令設(shè)置用于請求主體的緩沖區(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目錄的作用,簡單說就是如果客戶端POST一個(gè)比較大的文件,長度超過了nginx緩沖區(qū)的大小,需要把這個(gè)文件的部分或者全部內(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能處理的最大請求主體大小。 如果請求大于指定的大小,則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; ------把請求轉(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;
}
轉(zhuǎn)載于:https://blog.51cto.com/13904503/2160912
總結(jié)
- 上一篇: powerBi odbc 连接impal
- 下一篇: 解决标签回车后产生的空格