1、概述
之前介紹過Nginx的簡單使用,今天來聊聊Nginx的一些高階使用。
2、使用Nginx解決跨域問題
當公司存在多個域名時,兩個不同的域名相互訪問就會存在跨域問題。
或者在進行前端開發時,通常前端程式碼在本地啟動,而後端程式碼會部署在一臺專用的後端開發伺服器上,此時前端去呼叫後端介面時,就會出現跨域問題。
解決跨域的方法有很多,今天來說一下如何使用Nginx來解決跨域問題。
假設後端伺服器,是使用Nginx作為對外統一入口的,在Nginx配置檔案的server塊中增加如下配置:
# 允許跨域請求的域名,*代表所有 add_header 'Access-Control-Allow-Origin' *; # 允許帶上cookie請求 add_header 'Access-Control-Allow-Credentials' 'true'; # 允許請求的方法,例如:GET、POST、PUT、DELETE等,*代表所有 add_header 'Access-Control-Allow-Methods' *; # 允許請求的頭資訊,例如:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent等,*代表所有 add_header 'Access-Control-Allow-Headers' *;
重新載入Nginx,便發現,已經可以跨域訪問了。
3、驗證頭資訊中的 referer 引數
請求頭資訊中的 referer 引數,記錄了上一個頁面的地址,Nginx可以對其進行校驗,達到防盜鏈的目的。
通常在配置檔案的location塊中增加配置。
server { listen 80; # 埠 server_name www.zhuifengren.cn; # 服務名,可以是IP地址或者域名 location / { # 根路徑 root html; # 對應nginx安裝目標下的html資料夾 index hello.html; # 指定首頁為 hello.html } location ~* \.(GIF|PNG|jpg|bmp|jpeg) { # *代表不區分大小寫 # 校驗請求是否來自於zhuifengren.cn這個站點,不是則返回404頁面 valid_referers *.zhuifengren.cn; if ($invalid_referer) { return 404; } root /home/img; } error_page 500 502 503 504 /50x.html; # 指定這些狀態碼跳轉的錯誤頁 location = /50x.html { root html; } }
4、Nginx構建Tomcat叢集
Nginx最常用的一個功能,就是為Tomcat構建叢集,以達到實現高併發、高可用的目的。
首先在 upstream 塊中,配置Tomcat叢集中的服務地址,然後在location塊中配置轉發請求到此 upstream。
# 配置Tomcat叢集中的伺服器 upstream zhuifengren { server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; server { listen 80; server_name www.zhuifengren.cn; location / { proxy_pass http://zhuifengren; } }
預設按所有機器權重為1的輪詢方式對叢集服務進行訪問,每個服務訪問1次,然後訪問下一個服務,適合叢集中每臺伺服器效能差不多的情況。
權重配置也是經常用的,適用於機器效能有差異的情況。
upstream zhuifengren { server 192.168.1.101:8080 weight=1; server 192.168.1.102:8080; server 192.168.1.103:8080 weight=3; }
weight 就是權重配置,不配預設是1,按照以上配置,在5次請求中,101和102會被訪問1次,103會被訪問3次。
使用down,可以標識某個服務已停用,Nginx便不會去訪問他了。
upstream zhuifengren { server 192.168.1.101:8080; server 192.168.1.102:8080 down; server 192.168.1.103:8080; }
使用backup,可以標識101是備用機,當102、103當機後,101會進行服務。
upstream zhuifengren { server 192.168.1.101:8080 backup; server 192.168.1.102:8080; server 192.168.1.103:8080; }
使用 max_fails 和 fail_timeout 將服務動態停用
max_fails 預設是1,fail_timeout預設是10s
upstream zhuifengren { server 192.168.1.101:8080 max_fails=2 fail_timeout=10s; server 192.168.1.102:8080; server 192.168.1.103:8080; }
如此配置,101伺服器在10秒內如果失敗次數達到2次,會停用10秒。10秒後,會嘗試連線101伺服器,如果連線成功則恢復輪詢方式,如果不成功,再等待10秒嘗試。
5、使用keepalive設定長連結數量,提高吞吐量
upstream zhuifengren { server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; keepalive 50; } server { listen 80; server_name www.zhuifengren.cn; location / { proxy_pass http://zhuifengren; proxy_http_version 1.1; proxy_set_header Connection ""; } }
需要在upstream塊中增加 keepalive 配置,在server的location塊中增加 proxy_http_version 和 proxy_set_header 配置。
這樣設定可以減少連線斷開、新建的損耗,增加吞吐量。
6、其他負載均衡策略
除了前面說到的輪詢方式,Nginx在負載均衡時,還有其他策略。
ip_hash:以客戶端IP地址為依據,匹配伺服器。
hash $request_uri:以請求的URL為依據,匹配伺服器。
least_conn:以伺服器連線數為依據,哪個伺服器連線數少,匹配哪臺伺服器。
配置在upstream塊中。
upstream zhuifengren { # ip_hash; # hash $request_uri; least_conn; server 192.168.1.101:8080; server 192.168.1.102:8080; server 192.168.1.103:8080; }
7、綜述
今天介紹了一些Nginx的高階使用,希望大家多多溝通交流,共同成長。