1. 程式人生 > >Nginx反向代理、負載均衡、動靜分離、快取、壓縮、防盜鏈、跨域訪問

Nginx反向代理、負載均衡、動靜分離、快取、壓縮、防盜鏈、跨域訪問

一、反向代理

1、在192.168.189.130機器啟動tomcat服務,http://192.168.189.130:8080/ 訪問服務正常

2、在192.168.189.131機器配置nginx

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass  http://192.168.189.130:8080;
root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }

3、啟動nginx服務,http://192.168.189.131/ 能夠訪問,這就完成了一個最簡單的反向代理

二、負載均衡

1、負載均衡使用的是nginx的http upstream模組,語法:server address;
2、負載均衡策略或演算法:預設使用輪詢演算法,可以使用ip_hash 或者 權重輪詢

3、為了配置清晰,在nginx配置檔案中http模組引入額外配置

http {
    include       mime.types;

    include      extra/*.conf;

    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  0;
    keepalive_timeout  65;

    #gzip  on;

    # server {
     #   listen       80;
     #   server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

目錄:
/root/data/program/nginx/conf/extra
配置檔案proxy_demo.conf 

#負載均衡模組
upstream tomcat {
    #最大失敗2次,失敗後在60秒內不再轉發到該機器
    server 192.168.189.130:8080 max_fails=2 fail_timeout=60s;
    server 192.168.189.132:8080 max_fails=2 fail_timeout=60s;
}
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;
        #效能優化相關
        #例:130機器 error、超時、500、503的時候請求轉到132
        proxy_next_upstream error timeout http_500 http_503;
        #連線超時時間
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

    }
}

4、分別在192.168.189.130,192.168.189.132機器上啟動tomcat,

然後在/root/data/program/apache-tomcat-8.5.34/webapps/ROOT 下index.jsp頁面新增一些標識區分,啟動tomcat服務

訪問http://192.168.189.131/,可以看到130、132兩個服務輪詢處理請求 

三、動靜分離

1、132機器/root/data/program/apache-tomcat-8.5.34/webapps/ROOT目錄新建資料夾bak,把除index.jsp外的其他檔案(靜態資源)移動到bak資料夾

此時訪問http://192.168.189.132:8080/發現首頁樣式沒了

2、配置nginx,使用正則表示式,當請求靜態資源時從static-resource獲取

#負載均衡模組
upstream tomcat {
    #最大失敗2次,失敗後在60秒內不再轉發到該機器
    #server 192.168.189.130:8080 max_fails=2 fail_timeout=60s;
    server 192.168.189.132:8080 max_fails=2 fail_timeout=60s;
}
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;
        #效能優化相關
        #例:130機器 error、超時、500、503的時候請求轉到132
        proxy_next_upstream error timeout http_500 http_503;
        #連線超時時間
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

    }


    location ~ .*\.(js|css|png|svg|ico|jpg)$ {
         root static-resource;
    }

3、在nginx根目錄下建立資料夾static-resource,把tomcat目錄下的靜態資原始檔拷貝到此目錄(靜態資原始檔,不包含jsp)

tomcat靜態資原始檔地址:/root/data/program/apache-tomcat-8.5.34/webapps/ROOT

4、./nginx -s reload  nginx重新載入,此時訪問http://192.168.189.131/可以看到當請求轉發到192.168.189.132:8080上時,首頁樣式能夠顯示

 

 

 快取

nginx可以通過expires設定快取,比如我們可以針對圖片做快取。
location中設定expires
格式: expires 30s|m|h|d

#負載均衡模組
upstream tomcat {
    #最大失敗2次,失敗後在60秒內不再轉發到該機器
    # server 192.168.189.130:8080 max_fails=2 fail_timeout=60s;
    server 192.168.189.132:8080 max_fails=2 fail_timeout=60s;
}
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;
        #效能優化相關
        #例:130機器 error、超時、500、503的時候請求轉到132
        proxy_next_upstream error timeout http_500 http_503;
        #連線超時時間
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

    }


    location ~ .*\.(js|css|png|svg|ico|jpg)$ {
         root static-resource;
         expires 1d;
    }

}

對比設定快取前,瀏覽器請求靜態資源Response Headers

 

設定expires 1d;後瀏覽器多了Expires

 

壓縮

Nginx中提供了一種Gzip的壓縮優化手段,可以對後端的檔案進行壓縮傳輸,壓縮以後的好處在於能夠降低檔案的大小來提高傳輸效率 
配置資訊
Gzip on|off 是否開啟gzip壓縮
Gzip_buffers 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|off 是否傳輸gzip壓縮標識; 啟用應答頭"Vary: Accept-Encoding";給代理伺服器用的,有的瀏覽器支援壓縮,有的不支援,所以避免浪費不支援的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮 

user  root;
#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;


events {
    worker_connections  1024;
}


http {
    include       mime.types;

    include      extra/*.conf;

    default_type  application/octet-stream;

    #配置nginx壓縮
    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;

壓縮前:

壓縮後:

四、防盜鏈

1、設定靜態資源只能192.168.189.132訪問,其他ip訪問返回404

#負載均衡模組
upstream tomcat {
    #最大失敗2次,失敗後在60秒內不再轉發到該機器
    # server 192.168.189.130:8080 max_fails=2 fail_timeout=60s;
    server 192.168.189.132:8080 max_fails=2 fail_timeout=60s;
}
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;
        #效能優化相關
        #例:130機器 error、超時、500、503的時候請求轉到132
        proxy_next_upstream error timeout http_500 http_503;
        #連線超時時間
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

    }


    location ~ .*\.(js|css|png|svg|ico|jpg)$ {
         #防盜鏈
         #設定靜態資源只能192.168.189.132訪問,其他ip訪問返回404
         valid_referers none blocked 192.168.189.132;
         if ($invalid_referer) {
             return 404;
         }
         root static-resource;
         expires 1d;
    }

}

“Referer”請求頭為指定值時,內嵌變數$invalid_referer被設定為空字串,否則這個變數會被置成“1”
查詢匹配時不區分大小寫,其中none表示缺少referer請求頭、blocked表示請求頭存在,但是它的值被防火牆或者代理伺服器刪除、server_names表示referer請求頭包含指定的虛擬主機名 

五、跨域請求

環境說明:兩臺tomcat服務130,132;一臺nginx服務131,131nginx代理132tomcat服務,130tomcat伺服器請求131上一個json

1、130tomcat   index.jsp頁面請求json(注意新增jquery.js)

2、132服務新增demo.json

{
"hello":"world"
}

3、No 'Access-Control-Allow-Origin' header is present on the requested resource.

4、nginx配置

upstream tomcat {
    #最大失敗2次,失敗後在60秒內不再轉發到該機器
    #server 192.168.189.130:8080 max_fails=2 fail_timeout=60s;
    server 192.168.189.132:8080 max_fails=2 fail_timeout=60s;
}
server {
    listen 80;
    server_name localhost;
    location / {
        # 註釋最原始的代理,使用負載均衡
        # proxy_pass http://192.168.189.132:8080;
        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;
        #效能優化相關
        #例:130機器 error、超時、500、503的時候請求轉到132
        proxy_next_upstream error timeout http_500 http_503;
        #連線超時時間
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        #跨域請求,註釋掉130,只代理132
        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 ~ .*\.(js|css|png|svg|ico|jpg)$ {
        #防盜鏈
        #設定靜態資源只能192.168.189.132訪問,其他ip訪問返回404
        valid_referers none blocked 192.168.189.132;
        if ($invalid_referer) {
            return 404;
        }
        #130、132兩臺機器ROOT下靜態資源改到bak下,建立static-resource存靜態資源
        root static-resource;
        #nginx快取配置,Response Headers多了一個Expires
        expires 1d;
    }

}

5、效果