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,創建的規則就是 {} 里面的東西,請見配置:
# 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 塊里的參數指定了源變量值和結果值的對應關系。
匹配模式可以是一個簡單的字符串或者正則表達式,使用正則表達式要用('~')。
一個正則表達式如果以 “~” 開頭,表示這個正則表達式對大小寫敏感。以 “~*”開頭,表示這個正則表達式對大小寫不敏感。
1
2
3
4
5
|
map $http_user_agent $agent {
default "";
~curl curl;
~*apachebench" ab;
}
|
正則表達式里可以包含命名捕獲和位置捕獲,這些變量可以跟結果變量一起被其它指令使用。
1
2
3
4
5
|
map $uri $value {
/ttlsa_com /index.php;
~^/ttlsa_com/(?<suffix>.*)$ /boy/;
~/fz(/.*) /index.php?;
}
|
[warning]不能在map塊里面引用命名捕獲或位置捕獲變量。如~^/ttlsa_com/(.*) /boy/$1; 這樣會報錯nginx: [emerg] unknown variable。[/warning]如果源變量值包含特殊字符如‘~’,則要以‘\’來轉義。
1
2
3
4
|
map $http_referer $value {
Mozilla 111;
\~Mozilla 222;
}
|
結果變量可以是一個字符串也可以是另外一個變量。
1
2
3
4
|
map $num $limit {
1 $binary_remote_addr;
0 "";
}
|
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
設置映射表對應的哈希表的最大值。
二. 實例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
http {
map $http_user_agent $agent {
~curl curl;
~*chrome chrome;
}
server {
listen 8080;
server_name test.ttlsa.com;
location /hello {
default_type text/plain;
echo http_user_agent: $http_user_agent;
echo agent: agent:$agent;
}
}
}
# curl 127.0.0.1:8080/hello
http_user_agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
agent: curl
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
http {
map $uri $match {
~^/hello/(.*) http://www.ttlsa.com/;
}
server {
listen 8080;
server_name test.ttlsa.com;
location /hello {
default_type text/plain;
echo uri: $uri;
echo match: $match;
echo capture: $1;
echo new: $match$1;
}
}
}
|
如需轉載請注明出處: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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!