nginx 支持websocket


nginx 反向代理websocket 

nginx配置

請求地址及路徑:ws://x.x.x.x/web/springws/websocket.ws

解析 map 指令

上面 nginx.conf 配置中的 map $http_upgrade $connection_upgrade 的作用,參考 http://www.ttlsa.com/nginx/using-nginx-map-method/

該作用主要是根據客戶端請求中 $http_upgrade 的值,來構造改變 $connection_upgrade 的值,即根據變量 $http_upgrade 的值創建新的變量 $connection_upgrade,創建的規則就是 {} 里面的東西,請見配置:

復制代碼
http{

    # websocket
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
}
復制代碼
復制代碼
# websocket
upstream websocket {
    server xxx.xxx.xxx.xxx:8082;
    server xxx.xxx.xxx.xxx:8082;
}
server {

    # websocket
    location ^~ /web/springws/ {
    proxy_pass http://websocket;
    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_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    }
}
復制代碼
 

map指令使用ngx_http_map_module模塊提供的。默認情況下,nginx有加載這個模塊,除非人為的 --without-http_map_module。
ngx_http_map_module模塊可以創建變量,這些變量的值與另外的變量值相關聯。允許分類或者同時映射多個值到多個不同值並儲存到一個變量中,map指令用來創建變量,但是僅在變量被接受的時候執行視圖映射操作,對於處理沒有引用變量的請求時,這個模塊並沒有性能上的缺失。

一. ngx_http_map_module模塊指令說明

map
語法: map $var1 $var2 { ... }
默認值: —
配置段: http
map為一個變量設置的映射表。映射表由兩列組成,匹配模式和對應的值。
在 map 塊里的參數指定了源變量值和結果值的對應關系。
匹配模式可以是一個簡單的字符串或者正則表達式,使用正則表達式要用('~')。
一個正則表達式如果以 “~” 開頭,表示這個正則表達式對大小寫敏感。以 “~*”開頭,表示這個正則表達式對大小寫不敏感。

正則表達式里可以包含命名捕獲和位置捕獲,這些變量可以跟結果變量一起被其它指令使用。

[warning]不能在map塊里面引用命名捕獲或位置捕獲變量。如~^/ttlsa_com/(.*)  /boy/$1; 這樣會報錯nginx: [emerg] unknown  variable。[/warning]如果源變量值包含特殊字符如‘~’,則要以‘\’來轉義。

結果變量可以是一個字符串也可以是另外一個變量。

map指令有三個參數:
default : 指定如果沒有匹配結果將使用的默認值。當沒有設置 default,將會用一個空的字符串作為默認的結果。
hostnames : 允許用前綴或者后綴掩碼指定域名作為源變量值。這個參數必須寫在值映射列表的最前面。
include : 包含一個或多個含有映射值的文件。

如果匹配到多個特定的變量,如掩碼和正則同時匹配,那么會按照下面的順序進行選擇:
1. 沒有掩碼的字符串
2. 最長的帶前綴的字符串,例如: “*.example.com”
3. 最長的帶后綴的字符串,例如:“mail.*”
4. 按順序第一個先匹配的正則表達式 (在配置文件中體現的順序)
5. 默認值

map_hash_bucket_size
語法: map_hash_bucket_size size;
默認值: map_hash_bucket_size 32|64|128;
配置段: http
指定一個映射表中的變量在哈希表中的最大值,這個值取決於處理器的緩存。

map_hash_max_size
語法: map_hash_max_size size;
默認值: map_hash_max_size 2048;
配置段: http
設置映射表對應的哈希表的最大值。

二. 實例

 

map
map

map

如需轉載請注明出處:http://www.ttlsa.com/html/3206.html

 

Nginx配置WebSocket反向代理
問題描述
目前項目中需要使用到WebSocket來進行通訊,所以就寫了個Nginx反向代理WebSocket的配置文件.

很簡單,但是很有效,能夠橫向擴展WebSocket服務端

先直接展示配置文件,如下(使用的話直接復制,然后改改ip和port即可)

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

upstream wsbackend{
server ip1:port1;
server ip2:port2;
keepalive 1000;
}

server {

listen 20038;

location /{

proxy_http_version 1.1;
proxy_pass http://wsbackend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 3600s;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
會用了還需要理解(厚積薄發,不要讓曾經的努力白費)

首先:

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

表示的是

1. 如果 $http_upgrade 不為 '' (空),則 $connection_upgrade 為 upgrade
2. 如果 $http_upgrade 為 '' (空),則 $connection_upgrade 為 close
1
2
3
4
5
6
7
8
9
其次:

upstream wsbackend{
server ip1:port1;
server ip2:port2;
keepalive 1000;
}

表示的是 nginx負載均衡
1. 兩台服務器 (ip1:port1)和(ip2:port2)
2. keepalive 1000 表示的是每個nginx進程中上游服務器保持的空閑連接,當空閑連接過多時,會關閉最少使用的空閑連接.當然,這不是限制連接總數的,可以想象成空閑連接池的大小.設置的值應該是上游服務器能夠承受的
1
2
3
4
5
6
7
8
9
最后:

server {

listen 20038;

location /{

proxy_http_version 1.1;
proxy_pass http://wsbackend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 3600s;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}

表示的是監聽的服務器的配置
1. listen 20038 表示 nginx 監聽的端口
2. locations / 表示監聽的路徑(/表示所有路徑,通用匹配,相當於default)
3. proxt_http_version 1.1 表示反向代理發送的HTTP協議的版本是1.1,HTTP1.1支持長連接
4. proxy_pass http://wsbackend; 表示反向代理的uri,這里可以使用負載均衡變量
5. proxy_redirect off; 表示不要替換路徑,其實這里如果是/則有沒有都沒關系,因為default也是將路徑替換到proxy_pass的后邊
6. proxy_set_header Host $host; 表示傳遞時請求頭不變, $host是nginx內置變量,表示的是當前的請求頭,proxy_set_header表示設置請求頭
7. proxy_set_header X-Real-IP $remote_addr; 表示傳遞時來源的ip還是現在的客戶端的ip
8. proxy_read_timeout 3600s; 表的兩次請求之間的間隔超過 3600s 后才關閉這個連接,默認的60s.自動關閉的元凶
9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 表示X-Forwarded-For頭不發生改變
10. proxy_set_header Upgrade $http_upgrade; 表示設置Upgrade不變
11. proxy_set_header Connection $connection_upgrade; 表示如果 $http_upgra
---------------------
作者:lhn1599085
來源:CSDN
原文:https://blog.csdn.net/lhn1599085/article/details/80612890
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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