在以前接口調用的過程當中出現了沒法訪問接口的Bug,究其緣由可能出在Nginx進行服務轉發代理的問題上,因此但願結合項目中使用到的Nginx配置表好好對Nginx的配置進行學習。javascript
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
複製代碼
user nobody:主模塊指令,指定nginx worker進程運行用戶及用戶組,Windows下不用指定,默認爲nobody帳號。php
worker_processes 1:設定工做進程數,一般設定爲CPU數量或CPU數量的兩倍。css
error_log:定義錯誤日誌的存放路徑。路徑後面的參數爲錯誤日誌輸出級別,分別有debug
、info
、notice
、warn
、error
、crit
六個級別,其中debug
級別輸出的錯誤日誌最詳細,crit
級別輸出的錯誤日誌最簡略html
pid:nginx的進程號,當咱們須要中止nginx時,使用的其中一種方式就能夠是經過進程號殺死進程的方式。前端
events {
worker_connections 1024;
}
複製代碼
worker_connections:每個進程所容許的最大鏈接數,理論上每臺Nginx服務器的最大鏈接數爲上文提到的worker_processes
*worker_connections
。java
use worktype:use
是個事件模塊指令,用於指定事件模型,可是在此項目中未使用到,由於windows下無需指定事件模型(Nginx針對不一樣操做系統會使用不一樣的事件模型)。Nginx可支持的的worktype
有如下幾種select
、poll
、kqueue
、epoll
、rtsig
、/dev/poll
:node
select
、poll
:標準事件模型,默認不指定的狀況下就會使用這兩個事件模型。kqueue
:高效事件模型。使用於FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會形成內核崩潰。epoll
:使用於Linux內核2.6版本及之後的系統。/dev/poll
:使用於Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
access_log on;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
複製代碼
include mime.types:include
是個主模塊指令,實現對配置文件所包含的文件設定,減小主配置文件的複雜度。nginx
default_type:http核心模塊指令,默認設置爲二進制流,也就是當文件類型未在mime.types
中定義時會使用這種方式,本項目中默認類型設置爲octet-stream
,表示當文件類型未定義時瀏覽器認爲響應的是普通的文件流,並會提示用戶下載文件。如當未定義以.PHP結尾的文件時,當訪問PHP文件時就會出現下載窗口。正則表達式
log_format main:log_formate
是Nginx的httplog模塊指令,用於指定Ningx的日誌輸出格式。main
爲爲此日誌設置的名字,在下面的access_log
指令中使用這個名字,就能夠按照這個名字定義的格式進行日誌輸出。windows
access_log:設置日誌路徑,根據路徑後跟的名字設置日誌格式。但本項目中默認將這個功能關閉了。
sendfile:用於開啓高效文件傳輸模式,對於普通應用必須設置爲on。若是用來進行下載等應用磁盤IO的重負載引用,能夠設置爲off,平衡磁盤與網絡IO的處理速度,下降系統uptime(負載)。
tcp_nopush:此選項僅在使用sendfile時使用。它的做用是,防止網絡擁塞,那麼怎麼防止呢?當tcp_nopush
設置爲on時,當有數據須要發送時,先不着急馬上發送,而是確保數據包已經裝滿數據才進行發送,減小網絡報文段的數量,避免網絡擁塞。
tcp_nodelay:此選項僅在使用sendfile時使用。它的做用同上一個選項tcp_nopush
恰好相反,當有數據要發送時,當即發送,確保數據儘快發送,提升數據傳輸效率,適用每次只發送不多字節的業務場景。
keepalive_timeout:在HTTP請求中,當一個請求完成後會保持這個TCP鏈接的打開狀態,若接收到來自客戶端的其餘請求,服務端就會利用這個未被關閉的鏈接,而不須要再創建一個新的鏈接,這就是keep-alive模式,可是保持打開狀態的TCP鏈接一樣會佔用資源,當資源佔用過多就會影響性能,因此這個選項就是指定每一個TCP鏈接最多能夠保持多長時間。
gzip on;
gzip_min_length 5k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_types application/javascript text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
複製代碼
gzip:開啓實時gzip壓縮輸出數據流,減小網絡傳輸。
gzip_min_length:gzip壓縮起點大小,在本項目中,文件大於5k才進行壓縮。
gzip_buffers:設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。4 16k表明申請4個單位爲16k的內存做爲壓縮結果緩存。
gzip_http_version:設置gzip壓縮針對的HTTP協議版本。
gzip_comp_level:gzip壓縮級別,數字越大壓縮效果越好,但CPU處理時間越長。
gzip_types:指定何種類型的文件會被進行壓縮。
gzip_vary:爲響應頭添加Vary: Accept-Encoding
標頭,該標頭能夠告訴前端的緩存服務器同時緩存經過gzip壓縮過的資源和未壓縮過的資源,這麼作的目的是,當客戶端使用的是不支持gizp的低版本瀏覽器時,緩存也能夠向其返回未經gzip壓縮過的資源,不然,若是緩存服務器只緩存了壓縮事後的資源,那麼返回壓縮事後的資源會導師老版本瀏覽器沒法解壓,出現亂碼。
upstream boss {
server 127.0.0.1:9090;
}
upstream localserver {
server 127.0.0.1:8081;
}
複製代碼
本項目中暫時未使用到負載均衡,因此這裏就簡單的列舉出各個upstream模塊的一些配置字段和概念含義。
upstream servername:指定一個負載均衡器的名稱爲servername
,在本項目中,建立了兩個負載均衡器,分別指定名稱爲boss
、localserver
。在以後若是須要使用到負載均衡器,則須要將server節點下的location節點中的proxy_pass
設置爲http://upstream名稱。例如,若後續使用boss
這個負載均衡器則在某個須要實現負載均衡的location節點下設置proxy_pass
爲http://boss
server:指定後端服務器的IP地址和端口,同時在負載均衡器中還能夠爲這些服務器添加不一樣的屬性字段達到不一樣的負載均衡效果,可添加的參數有 down
、weight
、max_fails
、fail_timeout
、backup
,下面將會對這些參數表明的含義一一介紹:
down
:表示當前的server暫時不參與負載均衡weight
:經過設置權重完成負載均衡的一種策略,該值設置的越大,那麼該server負載的權重就越大,當對某個經過權重方式實現負載均衡的網站進行高併發訪問時,權重越高的服務器將會獲得更多的訪問請求。max_fails
:容許請求訪問失敗的次數,默認爲1,當超過最大次數時,返回proxy_next_upstream模塊中定義的錯誤。fail_timeout
:默認爲10s,在單位週期爲fail_timeout
設置的時間中經歷max_fails
次失敗後,暫停訪問,並將該節點標記爲不可用,並等待下一個週期再訪問該節點,若下個週期該節點鏈接成功,則恢復原來的輪詢方式,不然在下一個週期將再重試一次,如此往復。server {
listen 8089;
server_name localhost;
ssi on;
#charset koi8-r;
access_log logs/host.access.log main;
複製代碼
listen:指定服務器監聽的端口。
server_name:指定IP地址或域名。
ssi:設置爲on即便用SSI模塊。SSI模塊能夠在代碼中使用註釋的方式去引入HTML頁面或者包含一些文件。
charset koi8-r:設定網頁默認編碼格式
access_log:記錄了哪些用戶,那些頁面以及用戶瀏覽器、ip和其餘的訪問信息。
location ~* \.(js|css|flash|media|jpg|png|gif|dll|cab|CAB|ico|woff|woff2|ttf)$ {
root D:/工做/o2o;
index index.html index.htm;
expires 30d;
}
location ~* \.(html|htm)$ {
root D:/工做/o2o;
index index.html index.htm;
expires 1s;
}
location /test{
root D:/工做/o2o;
index index.html index.htm;
expires 1s;
}
複製代碼
在這部分主要介紹一下,location模塊的大體做用,對於proxy反向代理模塊放在下一部分來說。那麼location模塊的做用是什麼呢?在項目中我最直觀的理解就是,經過正則匹配到URL,當瀏覽器訪問了這個URL後,能夠經過location指令實現nginx對動靜態網頁的各類處理,包括過濾、轉發等等。
location :該指令支持正則表達式和條件判斷匹配,好比location ~ *\ .(gif|jpg|jpeg|bmp|png|ico|txt|js|css)則會把全部以html或htm爲後綴的文件都交給nginx處理。
root:指定虛擬主機的根目錄,能夠是相對路徑也能夠是絕對路徑。
index:設定訪問的默認首頁地址。
expires:緩存失效時間,在本項目中,對全部靜態資源都設置了30天的緩存失效時間。
location /uop{
proxy_connect_timeout 60s;
proxy_send_timeout 90;
proxy_read_timeout 120;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
#proxy_buffering off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Cache-Control max-age=1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header location_gray 'location_rest_v1';
proxy_pass http://boss;
}
複製代碼
proxy_connect_timeout:配置與服務器的鏈接超時時間。
proxy_send_timeout:規定的後端服務器數據的最長回傳時間,超過期間未完成回傳則超時。
proxy_read_timeout:鏈接成功後,等到後端服務器的響應時間,也能夠說是後端服務器處理請求的時間。
proxy_buffers:緩衝區的數量和大小,當nginx接收到後端response的數據後,會將其存放到緩衝區,當緩衝區的數據滿了之後再一次性發送到客戶端,使用buffer的好處在於相較於及時輸出能夠節約部分帶寬,若是不設置緩衝區大小,則爲即時傳輸。
proxy_buffer_size:該字段規定了響應頭Response header
的最大長度,若是響應頭超過這個長度,這回返回客戶端502;默認與proxy_buffers
大小相同,不管 proxy_buffering 是否開啓,proxy_buffer_size 都會起做用。
proxy_busy_buffers_size:專門向客戶端傳送數據的緩衝區,若是要傳送的數據大於busy_buffer
的大小,則裝滿busy_buffer後,立刻傳給客戶端,若是傳送數據小於busy_buffer
大小,則數據傳輸完成後,馬上傳給客戶端,不須要等待busy緩衝區填滿;官方建議大小爲單個proxy_buffers
的兩倍。
proxy_temp_file_write_size:指定同時寫入臨時文件的數據量的總大小。
proxy_next_upstream:定義故障轉義策略,在本項目中,當後端服務器返回超時或非法的響應頭或500、50三、504等狀態碼時,服務器自動將請求轉發到負載均衡器的另外一臺服務器上,實現故障轉義。
proxy_max_temp_file_size:設置臨時文件的總大小。
proxy_redirect:可修改從代理服務器返回的響應頭中的Location
和Refresh
字段(做用域重定向),在項目中未使用,但實際使用場景能夠是,當服務器訪問的地址又被重定向到了一個新的地址後,咱們能夠經過設定proxy_redirect
這個參數,將響應頭的重定向信息進行修改,達到隱藏真實服務器地址的目的,
proxy_set_header:用於從新設置發日後端服務器的請求頭。
add_header:用於從新設置後端返回的響應頭。
proxy_pass:設置反向代理的地址,即轉發的目標服