Nginx(二)--nginx的核心功能

反向代理

 

nginx反向代理的指令不須要新增額外的模塊,默認自帶proxy_pass指令,只須要修改配置文件就能夠實現反向代理。
proxy_pass 既能夠是ip地址,也能夠是域名,同時還能夠指定端口 
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://192.168.25.128:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;//暫時不配置,後面回演示
    }
}              
Nginx反向代理實戰
\1. 啓動tomcat服務器
\2. nginx配置的統一維護,將Nginx.conf文件的內容修改爲以下配置
#user  nobody;
user root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;
    include extra/*.conf;
}

  

\3. 在extra文件夾中添加proxy_demo.conf
server {
        listen 80;
        server_name localhost;
        location /{
                proxy_pass http://192.168.25.128:8080;
        }
}
\4. ./nginx -s reload 從新加載
 
訪問:http://192.168.20.130    會自動跳轉到http://192.168.25.128:8080 tomcat的訪問地址上,即tomcat的主頁。。。而後咱們能夠在頁面編輯加入標籤 
<h2><%=request.getRemoteAddr()%></h2>刷新頁面拿到了代理的服務器地址

  若是想拿到客戶端的地址則須要配置javascript

server {
        listen 80;
        server_name localhost;
        location /{
                proxy_pass http://192.168.25.128:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;獲取全部ip,包含多級代理狀況下均可以獲取到
        }
}

  頁面添加css

<h2><%=request.getHeader("X-Real-IP")%></h2>

  從新加載,刷新頁面,能夠看到客戶端的iphtml

  其餘參數配置:前端

server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://192.168.25.128:8080; // 代理服務器的地址
    proxy_set_header X-Real-IP $remote_addr; // 設置客戶端的真實IP
    proxy_set_header Host $hoxt;      //當後端web服務器也配置了多個虛擬主機時,須要用該header來區分反向代理哪一個主機名
    proxy_set_header X-Forwarded-For $remote_addr    //若是後端web服務器上的程序須要獲取用戶ip,能夠從該header頭獲取
    proxy_next_upstream http_502 http_504 http_503 error timeout invalid_header;  //請求出錯後,轉向下一個節點
    proxy_set_header http_user_agent $http_user_agent;    //判斷訪問端是蘋果,安卓,win仍是mac
    #proxy_body_buffer_size 64k;//用於指定客戶端請求主體緩衝區大小,能夠理解爲先保存到本地在傳給用戶
    #proxy_connect_timeout 60s;//表示與後端服務器鏈接的超時時間,即發起握手等候響應的超時時間
    #proxy_send_timeout 60s;//表示後端服務器的數據回傳時間,即在規定的時間內後端服務器必須傳完全部的數據,不然,nginx將斷開這個鏈接
    #proxy_read_timeout 60s;//設置nginx從代理的後端服務器獲取信息的時間,表示鏈接創建成功以後,nginx等待後端服務器的響應時間,其實nginx已經進入後端的排隊之中等候處理
    #proxy_buffer_size 60k;//設置緩衝區大小,默認,該個、緩衝區大小等於指令proxy_buffers設置的大小
    #proxy_buffers 60k;//設置緩衝區的數量和大小。nginx從代理的後端服務器獲取的響應信息,會保存到緩衝區
    #proxy_busy_buffers_size          //用於設置系統忙碌時可使用的proxy_buffers大小,官方推薦爲proxy_buffers*2
    #proxy_tmep_file_write_size      //指定proxy緩存臨時文件的大小
    #add_header 'Access-Control-Allow-Origin' '*'; // 添加容許跨域頭 容許來自全部的訪問地址
    #add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE'; // 支持的請求方式
    #add_header 'Aceess-Control-Allow-Header' 'Content-Type,*'; // 支持的媒體類型<br>       #  ......
    }
}

  

 

負載均衡

硬件負載(F五、Array)軟件負載(nginx、lvs、HAProxy)
網絡負載均衡的大體原理是利用必定的分配策略將網絡負載平衡地分攤到網絡集羣的各個操做單元上,使得單個重
負載任務可以分擔到多個單元上並行處理,使得大量併發訪問或數據流量分擔到多個單元上分別處理,從而減小用戶的等待響應時間 
upstream
是Nginx的HTTP Upstream模塊,這個模塊經過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡
1. Upstream
語法: server address [paramters]
2. 負載均衡策略或者算法
輪詢算法(默認), 若是後端服務器宕機之後,會自動踢出
ip_hash 根據請求的ip地址進行hash
權重輪詢 
upstream tomcat {
	server 192.168.20.130:8080 max_fails=2 fail_timeout=60s;
	server 192.168.20.128:8080;
}
server {
	listen 80;
	server_name localhost;
	location / {
		proxy_pass http://tomcat;
		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_next_upstream error timeout http_500 http_503;
		proxy_connect_timeout 60s;
		proxy_send_timeout 60s;
		proxy_read_timeout 60s;
		add_header 'Access-Control-Allow-Origin' '*';
		add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE';
		add_header 'Aceess-Control-Allow-Header' 'Content-Type,*';
	}
	location ~ .*\.(js|css|png|svg|ico|jpg)$ {
		valid_referers none blocked 192.168.11.160 www.gupaoedu.com;
		if ($invalid_referer) {
			return 404;
		}
		root static-resource;
		expires 1d;
	}
}

  

其餘配置信息 

proxy_next_upstream
語法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |
http_404 | offff ];
默認:proxy_next_upstream error timeout;
配置塊:http、server、location
這個配置表示當向一臺上有服務器轉發請求出現錯誤的時候,繼續換一臺上後服務器來處理這個請求。
默認狀況下,上游服務器一旦開始發送響應數據,Nginx反向代理服務器會馬上把應答包轉發給客戶端。所以,一旦Nginx開始向客戶端發送響應包,
若是中途出現錯誤也不容許切換到下一個上有服務器繼續處理的。這樣作的目的是保證客戶端只收到來自同一個上游服務器的應答。 
 
proxy_connect_timeout
語法: proxy_connect_timeout time;
默認: proxy_connect_timeout 60s;
範圍: http, server, location
用於設置nginx與upstream server的鏈接超時時間,好比咱們直接在location中設置proxy_connect_timeout  1ms, 1ms很短,若是沒法在指定時間創建鏈接,就會報錯。 
 
proxy_send_timeout
向後端寫數據的超時時間,兩次寫操做的時間間隔若是大於這個值,也就是過了指定時間後端尚未收到數據,鏈接會被關閉 
 
proxy_read_timeout
從後端讀取數據的超時時間,兩次讀取操做的時間間隔若是大於這個值,那麼nginx和後端的連接會被關閉,若是
一個請求的處理時間比較長,能夠把這個值設置得大一些
 
proxy_upstream_fail_timeout
設置了某一個upstream後端失敗了指定次數(max_fails)後,在fail_timeout時間內再也不去請求它,默認爲10秒
語法 server address [fail_timeout=30s]
upstream backend { #服務器集羣名字
#server 192.168.20.128:8080 weight=1 max_fails=2 fail_timeout=600s;
#server 192.168.20.130:8080 weight=1 max_fails=2 fail_timeout=600s;
 

Nginx動靜分離

什麼是動靜分離
 
必須依賴服務器生存的咱們稱爲動。不須要依賴容器的好比css/js或者圖片等,這類就叫靜
 

靜態資源的類型 

輸入命令 :cat ../conf/mime.typesjava

types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}

 

在Nginx的conf目錄下,有一個mime.types文件
用戶訪問一個網站,而後從服務器端獲取相應的資源經過瀏覽器進行解析渲染最後展現給用戶,而服務端能夠返回
各類類型的內容,好比xml、jpg、png、gif、flflash、MP四、html、css等等,那麼瀏覽器就是根據mime-type來決定用什麼形式來展現的
服務器返回的資源給到瀏覽器時,會把媒體類型告知瀏覽器,這個告知的標識就是Content-Type,好比Content-Type:text/html。 
 
演示代碼
 
location ~ .*\.(js|css|png|svg|ico|jpg)$ {
    valid_referers none blocked 192.168.20.130 www.gupaoedu.com;
    if ($invalid_referer) {
        return 404;
    }
    root static-resource;
    expires 1d;
}          
動靜分離的好處
第一個,Nginx自己就是一個高性能的靜態web服務器;
第二個,其實靜態文件有一個特色就是基本上變化不大,因此動靜分離之後咱們能夠對靜態文件進行緩存、或者壓縮提升網站性能 
 
緩存 
當一個客戶端請求web服務器, 請求的內容能夠從如下幾個地方獲取:服務器、瀏覽器緩存中或緩存服務器中。這取決於服務器端輸出的頁面信息
瀏覽器緩存將文件保存在客戶端,好的緩存策略能夠減小對網絡帶寬的佔用,能夠提升訪問速度,提升用戶的體驗,還能夠減輕服務器的負擔nginx緩存配置 
 
Nginx緩存配置
Nginx能夠經過expires設置緩存,好比咱們能夠針對圖片作緩存,由於圖片這類信息基本上不會改變。
在location中設置expires
格式: expires 30s|m|h|d
location ~ .*.(jpg|jpeg|gif|bmp|png|js|css|ico)$ {
root static;
expires 1d;
壓縮
Gzip 
咱們一個網站必定會包含不少的靜態文件,好比圖片、腳本、樣式等等,而這些css/js可能自己會比較大,那麼在
網絡傳輸的時候就會比較慢,從而致使網站的渲染速度。所以Nginx中提供了一種Gzip的壓縮優化手段,能夠對後
端的文件進行壓縮傳輸,壓縮之後的好處在於可以下降文件的大小來提升傳輸效率 " 
配置信息
Gzip on|offff 是否開啓gzip壓縮
Gzip_buffffers 4 16k #設置gzip申請內存的大小,做用是按指定大小的倍數申請內存空間。4 16k表明按照原始數據
大小以16k爲單位的4倍申請內存。
Gzip_comp_level[1-9] 壓縮級別, 級別越高,壓縮越小,可是會佔用CPU資源
Gzip_disable #正則匹配UA 表示什麼樣的瀏覽器不進行gzip
Gzip_min_length #開始壓縮的最小長度(小於多少就不作壓縮),能夠指定單位,好比 1k
Gzip_http_version 1.0|1.1 表示開始壓縮的http協議版本
Gzip_proxied (nginx 作前端代理時啓用該選項,表示不管後端服務器的headers頭返回什麼信息,都無條件啓用壓縮)
Gzip_type text/pliain,application/xml 對那些類型的文件作壓縮 (conf/mime.conf)
Gzip_vary on|offff 是否傳輸gzip壓縮標識; 啓用應答頭"Vary: Accept-Encoding";給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的HTTP頭來判斷,是否須要壓縮
 
演示效果
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;
    sendfile on;
    #tcp_nopush on;
    keepalive_timeout 60;
    include extra/*.conf;
    gzip on;
    gzip_min_length 5k;
    gzip_comp_level 3;
    gzip_types application/javascript image/jpeg image/svg+xml;
    gzip_buffers 4 32k;
    gzip_vary on;
}  

防盜鏈

一個網站上會有不少的圖片,若是你不但願其餘網站直接用你的圖片地址訪問本身的圖片,或者但願對圖片有版權保護。再或者不但願被第三方調用形成服務器的負載以及消耗比較多的流量問題,那麼防盜鏈就是你必需要作的
防盜鏈配置
在Nginx中配置防盜鏈其實很簡單,
語法: valid_referers none | blocked | server_names | string ...;
默認值: —
上下文: server, location 
「Referer」請求頭爲指定值時,內嵌變量$invalid_referer被設置爲空字符串,不然這個變量會被置成「1」。查找匹配
時不區分大小寫,其中none表示缺乏referer請求頭、blocked表示請求頭存在,可是它的值被防火牆或者代理服務器刪除、server_names表示referer請求頭包含指定的虛擬主機名
\1. 配置以下
location ~ .*.(gif|jpg|ico|png|css|svg|js)$ {
    valid_referers none blocked 192.168.20.130;
    if ($invalid_referer) {
      return 404;
    }
      root static;
} 

  

須要注意的是僞造一個有效的「Referer」請求頭是至關容易的,所以這個模塊的預期目的不在於完全地阻止這些非法請求,而
是爲了阻止由正常瀏覽器發出的大規模此類請求。還有一點須要注意,即便正常瀏覽器發送的合法請求,也可能沒有「Referer」請求頭。 
 

跨域訪問

什麼叫跨域呢?若是兩個節點的協議、域名、端口、子域名不一樣,那麼進行的操做都是跨域的,瀏覽器爲了安全問題都是限制跨域訪問,因此跨域實際上是瀏覽器自己的限制。 
 
解決辦法
修改proxy_demo.conf配置
server{
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://192.168.20.130:8080;
        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_send_timeout 60s;
        proxy_read_timeout 60s;
        proxy_connect_timeout 60s;
        add_header 'Access-Control-Allow-Origin' '*'; // #容許來自全部的訪問地址
        add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS'; //支持的請求方式
        add_header 'Access-Control-Allow-Header' 'Content-Type,*'; //支持的媒體類型
    }
    location ~ .*\.(gif|jpg|ico|png|css|svg|js)$ {
       root static;
    }
}    

  nginx還能夠實現 限流,灰度發佈等nginx

相關文章
相關標籤/搜索