天天看點

nginx做反向代理

在項目中,同時有java項目和PHP項目,在伺服器中安裝有tomcat和apache兩種web服務軟體,這樣的話,如果兩個服務同時啟動的話,就會造成80端口隻能一個項目來使用,但是有時必須兩個項目都需要80端口,比如微信開發時,經常需要項目的URL不能帶端口号,是以必須有一個中間軟體來做代理,來協調兩個軟體的通路需求,nginx就是做代理的一個非常好的工具

下面是配置的

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
#   添加内容如下  upstream是nginx的内置子產品,負責網絡資料的轉發處理,upstream後面的名稱是自定義的名稱,裡面的内容是負責轉發的位址,可以本地(localhost)也可以是網絡的
    upstream phpProject {
#ip_hash是負載均衡政策,按通路IP配置設定,weight為權重,越大表示伺服器可能配置設定使用者越多
        ip_hash;        
        server  6.6.6.6:800  weight=1;
        server  7.7.7.7:800  weight=1;
    }
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}      

在conf.d檔案夾下,建立*.conf檔案,用來指向項目路徑,nginx就像路由器一樣,根據你通路的URL位址指向伺服器中的不同路徑,在該項目中,tomcat服務端口号是8080,apache服務端口号是800

示例代碼如下:

server {
listen 80;
server_name www.aaa.com;

location /{
proxy_pass http://javaProject;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 1;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
       
}
 
location /{
proxy_pass http://phpProject;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 1;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;     
}

}      

配置完成後,重新開機nginx服務,不論通路java項目還是apache項目,都不再帶端口号了

upstream aa{   

 server 192.168.1.21:80;

    server 192.168.1.22:80;

    check interval=3000 rise=2 fall=5 timeout=1000 type=http;    

}      

​上面配置的意思是,對test_web這個負載均衡條目中的所有節點,每個3秒(3000毫秒)檢測一次,請求2次正常則标記realserver狀态為up,如果檢測5次都失敗,則标記realserver的狀态為down,逾時時間為1秒。​

​---------------------下面列出nginx_upstream_check_module 子產品所支援的指令含義----------------------​

​Syntax:  check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=​

​​

​true​

​​

​|​

​​

​false​

​​

​] [​

​​

​type​

​​

​=tcp|http|ssl_hello|mysql|ajp] [port=check_port]​

​Default: 如果沒有配置參數,預設值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=​

​​

​true​

​​ ​

​type​

​​

​=tcp​

​Context: upstream​

​該指令可以打開後端伺服器的健康檢查功能。指令後面的參數意義是:​

​interval:向後端發送的健康檢查包的間隔。​

​fall(fall_count): 如果連續失敗次數達到fall_count,伺服器就被認為是down。​

​rise(rise_count): 如果連續成功次數達到rise_count,伺服器就被認為是up。​

​timeout: 後端健康請求的逾時時間,機關毫秒。​

​default_down: 設定初始時伺服器的狀态,如果是​

​​

​true​

​​

​,就說明預設是down的,如果是​

​​

​false​

​​

​,就是up的。預設值是​

​​

​true​

​​

​,也就是一開始伺服器認為是不可用,要等健康檢查包達到一定成功次數以後才會被認為是健康的。​

​type​

​​

​:健康檢查包的類型,現在支援以下多種類型:​

​tcp:簡單的tcp連接配接,如果連接配接成功,就說明後端正常。​

​ssl_hello:發送一個初始的SSL hello包并接受伺服器的SSL hello包。​

​http:發送HTTP請求,通過後端的回複包的狀态來判斷後端是否存活。​

​mysql: 向mysql伺服器連接配接,通過接收伺服器的greeting包來判斷後端是否存活。​

​ajp:向後端發送AJP協定的Cping包,通過接收Cpong包來判斷後端是否存活。​

​port: 指定後端伺服器的檢查端口。你可以指定不同于真實服務的後端伺服器的端口,比如後端提供的是443端口的應用,你可以去檢查80端口的狀态來判斷後端健康狀況。預設是0,表示跟後端server提供真實服務的端口一樣。該選項出現于Tengine-1.4.0。​

​Syntax: check_keepalive_requests request_num​

​Default: 1​

​Context: upstream​

​該指令可以配置一個連接配接發送的請求數,其預設值為1,表示Tengine完成1次請求後即關閉連接配接。​

​Syntax: check_http_send http_packet​

​Default: ​

​​

​"GET / HTTP/1.0\r\n\r\n"​

​Context: upstream​

​該指令可以配置http健康檢查包發送的請求内容。為了減少傳輸資料量,推薦采用​

​​

​"HEAD"​

​​

​方法。​

​當采用長連接配接進行健康檢查時,需在該指令中添加keep-alive請求頭,如:​

​​

​"HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"​

​​

​。 同時,在采用​

​​

​"GET"​

​​

​方法的情況下,請求uri的size不宜過大,確定可以在1個interval内傳輸完成,否則會被健康檢查子產品視為後端伺服器或網絡異常。​

​Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]​

​Default: http_2xx | http_3xx​

​Context: upstream​

​該指令指定HTTP回複的成功狀态,預設認為2XX和3XX的狀态是健康的。​

​Syntax: check_shm_size size​

​Default: 1M​

​Context: http​

​所有的後端伺服器健康檢查狀态都存于共享記憶體中,該指令可以設定共享記憶體的大小。預設是1M,如果你有1千台以上的伺服器并在配置的時候出現了錯誤,就可能需要擴大該記憶體的大小。​

​Syntax: check_status [html|csv|json]​

​Default: check_status html​

​Context: location​

​顯示伺服器的健康狀态頁面。該指令需要在http塊中配置。​

​在Tengine-1.4.0以後,可以配置顯示頁面的格式。支援的格式有: html、csv、 json。預設類型是html。​

​也可以通過請求的參數來指定格式,假設‘​

​​

​/status​

​​

​’是你狀态頁面的URL, ​

​​

​format​

​​

​參數改變頁面的格式,比如:​

​/status​

​​

​?​

​​

​format​

​​

​=html​

​/status​

​​

​?​

​​

​format​

​​

​=csv​

​/status​

​​

​?​

​​

​format​

​​

​=json​

​同時你也可以通過status參數來擷取相同伺服器狀态的清單,比如:​

​/status​

​​

​?​

​​

​format​

​​

​=html&status=down​

​/status​

​​

​?​

​​

​format​

​​

​=csv&status=up​

​下面是一個狀态配置的範例:​

​http {​

​server {​

​location ​

​​

​/nstatus​

​​ ​

​{​

​check_status;​

​access_log off;​

​#allow IP;​

​#deny all;​

​}​

​}​

​}​

http{
    upstream  myserver {
    server 10.10.10.1  weight=3  max_fails=3  fail_timeout=20s;
    server 10.10.10.2  weight=3  max_fails=3  fail_timeout=20s;
    #定義後端伺服器,權重3,失敗3次後暫停服務20s
    }
    server  {
        listen 80;
        server_name www.domain.com;
        index   index.html;
        root  /date/web
        location  /  {                      # 配置健康檢查
            proxy_pass http://myserver;
            proxy_next_upstream http_500 http_502 error timeout
            invalid_header;
            # 當出現以上狀态碼時,轉發給下一台伺服器
        }
    }
}      

健康檢查

指定在何種情況下一個失敗的請求應該被發送到下一台後端伺服器:

error      # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現錯誤
timeout    # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現逾時
invalid_header  # 後端伺服器傳回空響應或者非法響應頭
http_500   # 後端伺服器傳回的響應狀态碼為500
http_502   # 後端伺服器傳回的響應狀态碼為502
http_503   # 後端伺服器傳回的響應狀态碼為503
http_504   # 後端伺服器傳回的響應狀态碼為504
http_404   # 後端伺服器傳回的響應狀态碼為404
off        # 停止将請求發送給下一台後端伺服器      

需要注意一點的是,隻有在沒有向用戶端發送任何資料以前, proxy_next_upstream将請求轉給下一台後端伺服器才是可行的。也就是說,如果在傳輸響應到用戶端時出現錯誤或者逾時,這類錯誤是不可能恢複的 proxy_next_upstream

嚴格來說,nginx自帶是沒有針對負載均衡後端節點的健康檢查的,但是可以通過預設自帶的ngx_http_proxy_module子產品和ngx_http_upstream_module子產品中的相關指令來完成當後端節點出現故障時,自動切換到健康節點來提供通路。

ngx_http_proxy_module 子產品

裡面的proxy_connect_timeout 指令、proxy_read_timeout指令和proxy_next_upstream指令

1、設定與後端伺服器建立連接配接的逾時時間。應該注意這個逾時一般不可能大于75秒。

文法: proxy_connect_timeout time;

預設值:proxy_connect_timeout 60s;

上下文:http, server, location

1

2

3

4

2、定義從後端伺服器讀取響應的逾時。此逾時是指相鄰兩次讀操作之間的最長時間間隔,而不是整個響應傳輸完成的最長時間。如果後端伺服器在逾時時間段内沒有傳輸任何資料,連接配接将被關閉。

文法: proxy_read_timeout time;

預設值:proxy_read_timeout 60s;

上下文:http, server, location

1

2

3

4

3、指定在何種情況下一個失敗的請求應該被發送到下一台後端伺服器:

error           # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現錯誤

timeout         # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現逾時

invalid_header  # 後端伺服器傳回空響應或者非法響應頭

http_500        # 後端伺服器傳回的響應狀态碼為500

http_502        # 後端伺服器傳回的響應狀态碼為502

http_503        # 後端伺服器傳回的響應狀态碼為503

http_504        # 後端伺服器傳回的響應狀态碼為504

http_404        # 後端伺服器傳回的響應狀态碼為404

off             # 停止将請求發送給下一台後端伺服器

文法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;

預設值:    proxy_next_upstream error timeout;

上下文:    http, server, location

1

2

3

4

5

6

7

8

9

10

11

12

13

14

4、proxy内部參數說明

參數    解釋

proxy_set_header    設定由後端伺服器擷取使用者的主機名或者真實IP位址,以及代理者的真實IP位址

client_body_buffer_size    指定用戶端請求主體緩沖區大小

proxy_connect_timeout    表示與後端伺服器連接配接的逾時時間,即發起握手等待響應的逾時時間

proxy_send_timeout    表示後端伺服器的資料回傳時間,即在規定時間内後端伺服器必須傳完所有的資料,否則nginx将斷開這個連接配接

proxy_read_timeout    設定nginx從代理的後端伺服器擷取資訊的時間,表示連接配接建立成功後,nginx等待後端伺服器的響應時間,其實是nginx已經進入後端的排隊之中等候處理的時間

proxy_buffer_size    設定緩沖區大小,預設,該緩沖區大小等于指令proxy_buffers設定的大小

proxy_buffers    設定緩沖區數量和大小。nginx從代理的後端伺服器擷取的響應資訊,會放到緩沖區

proxy_busy_buffers_size    用于設定系統很忙時可以使用的proxy_buffers大小,官方推薦的大小為 proxy_buffers*2

proxy_temp_file_write_size    指定proxy緩存臨時檔案的大小

備注 

隻有在沒有向用戶端發送任何資料以前,将請求轉給下一台後端伺服器才是可行的。也就是說,如果在傳輸響應到用戶端時出現錯誤或者逾時,這類錯誤是不可能恢複的。

範例如下:

http {

    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 invalid_header http_500 http_502 http_503 http_504 http_404;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_redirect off;

    proxy_connect_timeout 90; ;

    proxy_send_timeout 90; ;

    proxy_read_timeout 90;

    proxy_buffer_size 4k;

    proxy_buffers 4 32k;

    proxy_busy_buffers_size 64k;

    proxy_temp_file_write_size 64k;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

ngx_http_upstream_module子產品

1、server指令

upstream web_server {

    server 192.168.88.133:80;

    server 192.168.88.134:80;

    check interval=3000 rise=2 fall=5 timeout=1000;

}

1

2

3

4

5

備注 

①interval檢測間隔時間,機關為毫秒,rise請求2次正常的話,标記此realserver的狀态為up,fall表示請求5次都失敗的情況下,标記此realserver的狀态為down,timeout為逾時時間,機關為毫秒。

location /nstatus {
     check_status;
     access_log off;
     #allow SOME.IP.ADDRESS;
     #deny all;
 }      

繼續閱讀