Nginx的高級使用


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_failsfail_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的高級使用,希望大家多多溝通交流,共同成長。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM