團隊中的一個Web項目面對的用戶網絡環境多是在嚴格的防火牆安全條件下,通常只開放一些標准的端口如80,21等。
上線初期,因忽略了這個問題,除了Web應用是以80端口提供訪問外,WCF和WS是以其他端口進行對外訪問的,導致多數用戶無法完整的使用系統的全部功能,如涉及直接訪問WCF和WS服務的功能。
同時加上分配給這個項目外網IP地址資源只有一個,因此對外的直接服務除了使用80端口,其他服務當時就直接采用了其他端口。
為了解決這個問題,在Web服務器上(80端口),采用Nginx解析Web Request中的請求特征,把針對Web、WCF服務和WS的請求分別轉發到內網對應的物理服務器上。
解析的規則如下:
規則一:默認的80端口請求,轉發到Web服務上。
規則二:在規則一的基礎上,如果請求URI中包含”.svc/”格式的字符串,轉發到WCF服務器上。
規則三:如果Request Headers中包含Upgrade信息,且值為websocket的話,轉發到WebSocket服務器上。
Nginx配置文件內容如下:
upstream wcfServer {
server 10.0.0.111:8089;
}
upstream webServer {
server 10.0.0.118:8000;
}
upstream socketServer {
server 10.0.0.112:7181;
}
server {
listen 80;
location / {
proxy_pass http:// webServer ;
if ( $request_uri ~* \.(svc)/~* )
{
proxy_pass http:// wcfServer ;
}
if ( $http_upgrade ~* websocket$ )
{
proxy_pass http:// socketServer ;
}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_send_timeout 600s;
client_max_body_size 1024M;
client_body_buffer_size 4096k;
}
}