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、效果